使用doctest进行测试

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
    []
    """
    return [obj]

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

你可能感兴趣的:(使用doctest进行测试)