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的内存地址,这样就会忽略期望值中的一部分,实际输出将匹配,并通过测试。
网友评论