pytest文档19-doctest测试框架
前言
doctest从字面意思上看,那就是文档测试。doctest是python里面自带的一个模块,它实际上是单元测试的一种。
官方解释:doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果
doctest测试用例可以放在两个地方
函数或者方法下的注释里面
模块的开头
案例
先看第一个案例,将需要测试的片段,标准格式,需要运行的代码前面加>>> ,相当于进入cmd这种交互环境执行,期望的结果前面不需要加>>>
>>> multiply(4, 3) 12 >>> multiply('a', 3) 'aaa'
放到multiply函数的注释里
def multiply(a, b): """ fuction: 两个数相乘 >>> multiply(4, 3) 12 >>> multiply('a', 3) 'aaa' """ return a * b if __name__ == '__main__': import doctest doctest.testmod(verbose=True)
运行结果
Trying: multiply(4, 3) Expecting: 12 ok Trying: multiply('a', 3) Expecting: 'aaa' ok 1 items had no tests: __main__ 1 items passed all tests: 2 tests in __main__.multiply 2 tests in 2 items. 2 passed and 0 failed. Test passed.
从运行的结果可以看出,虽然函数下方的注释里面有其它内容“fuction: 两个数相乘”,但不会去执行,只识别“>>>”这种符号。2个测试用例都是通过的,实际的结果与期望的结果一致。
失败案例
doctest的内容放到.py模块的开头也是可以识别到的
# 保存为xxx.py ''' fuction: 两个数相乘 >>> multiply(4, 8) 12 >>> multiply('a', 5) 'aaa' ''' def multiply(a, b): """ fuction: 两个数相乘 """ return a * b if __name__ == '__main__': import doctest doctest.testmod(verbose=True)
运行结果2个都失败
********************************************************************** 1 items had failures: 2 of 2 in __main__ 2 tests in 2 items. 0 passed and 2 failed. ***Test Failed*** 2 failures.
verbose参数,设置为True则在执行测试的时候会输出详细信息
cmd执行
以上案例是在编辑器直接运行的,如果在cmd里面,也可以用指令去执行
$ python -m doctest -v xxx.py
m 参数指定运行方式doctest
-v参数是verbose,带上-v参数相当于verbose=True
pytest运行
pytest框架是可以兼容doctest用例,执行的时候加个参数 —doctest-modules ,这样它就能自动搜索到doctest的用例
$ pytest -v —doctest-modules xxx.py
如下是函数下的文档
fuction: 两个数相乘 >>> multiply(4, 3) 12 >>> multiply('a', 5) 'aaa'
运行结果
D:\test1122\a>pytest -v --doctest-modules xxx.py ============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 -- d:\softpython3.6\python.exe cachedir: .pytest_cache metadata: {'Python': '3.6.0', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages': {'pytest': '3.6.3', 'py': '1.5.4', 'pluggy': '0.6.0'}, 'Plugins': {'metadata': ' 1.7.0', 'html': '1.19.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'D:\\soft\\j dk18\\jdk18v'} rootdir: D:\test1122\a, inifile: plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10 collected 1 item xxx.py::xxx.multiply FAILED [100%] ================================== FAILURES =================================== ___________________________ [doctest] xxx.multiply ____________________________ 004 005 fuction: 两个数相乘 006 >>> multiply(4, 3) 007 12 008 >>> multiply('a', 5) Expected: 'aaa' Got: 'aaaaa' D:\test1122\a\xxx.py:8: DocTestFailure ========================== 1 failed in 0.16 seconds ===========================
结果可以看出,文档里面的每一行都被执行了,当遇到测试不通过的用例时,就不会继续往下执行了
doctest独立文件
doctest内容也可以和代码抽离开,单独用一个.txt文件保存
在当前xxx.py同一目录新建一个xxx.txt文件,写入测试的文档,要先导入该功能,导入代码前面也要加>>>
>>> from xxx import multiply >>> multiply(4, 3) 12 >>> multiply('a', 3) 'aaa'
cmd执行“python -m doctest -v xxx.txt测试结果
>python -m doctest -v xxx.txt Trying: from xxx import multiply Expecting nothing ok Trying: multiply(4, 3) Expecting: 12 ok Trying: multiply('a', 3) Expecting: 'aaa' ok 1 items passed all tests: 3 tests in xxx.txt 3 tests in 1 items. 3 passed and 0 failed. Test passed.
** 作者:上海-悠悠 QQ交流群:588402570**