使用doctest进行测试

作者: nummycode | 来源:发表于2016-03-29 14:59 被阅读330次

    python中的doctest可以运行文档中嵌入的例子,并验证它们能否生成所期望的结果,从而对源代码进行测试。

    1.示例

    建立测试文件test.py

    def add(a,b):
          """
          >>> add(1,2)
          3
          >>> add(4,5)
          9
          """
          return a + b
    

    运行测试时,必须使用-m参数将doctest作为脚本来执行,但是运行测试一般不会有输出,可以使用-v参数得到详细测试信息。

    python -m doctest -v test.py
    

    得到结果如下所示:

    $ python -m doctest -v test.py 
    Trying:
        add(1,2)
    Expecting:
        3
    ok
    Trying:
        add(4,5)
    Expecting:
        9
    ok
    1 items had no tests:
        test
    1 items passed all tests:
       2 tests in test.add
    2 tests in 2 items.
    2 passed and 0 failed.
    Test passed.
    

    但是在docstring中并非所有的内容都是测试用例,docstring中还包含其他文本,那怎么去区分这些内容呢?在docstring中测试用例以提示符>>>开始,以空行或者下一个>>>结束,介于中间的文本会被忽略。
    例如:

    def add(a,b):
          """
          Returns a + b
          >>> add(1,2)
          3
          >>> add(4,5)
          9
          """
          return a + b
    

    修改后的内容测试结果是一样的。

    2.处理不可预测的输出

    有些情况下,可能无法预测准确的输出,但是依然可以进行测试。例如,获取某个对象的ID,每次运行测试的时候,得到的ID都是不一样的。

    def identity(obj):
          """
          >>> identity(1)
          23400792
          """
          return id(obj)
    

    每次运行的时候,获取的ID值都是不一样的,所以执行上面的测试代码是不能通过的。
    测试的值可能会以不可预测的方式改变时,如果具体值对于测试结果并不重要,可以使用ELLIPSIS选项来告诉doctest忽略验证值的某些部分。
    例如:
    demo.py

    class MyClass(object):
        pass
    
    def unpredictable(obj):
        """Returns a new list containing obj.
    
        >>> unpredictable(MyClass()) #doctest: +ELLIPSIS
        [<demo.MyClass object at 0x...>]
        """
        return [obj]
    

    unpredictable之后的注释#doctest: ELLIPSIS告诉doctest打开这个测试的ELLIPSIS选项,...将替换对象id的内存地址,这样就会忽略期望值中的一部分,实际输出将匹配,并通过测试。

    相关文章

      网友评论

        本文标题:使用doctest进行测试

        本文链接:https://www.haomeiwen.com/subject/rbhslttx.html