前言
doctest从字面意思上看,那就是文档测试。doctest是python里面自带的一个模块,它实际上是单元测试的一种。
官方解释:doctest模块会搜索哪些看起来像交互式会话的python代码片段,然后尝试执行并验证结果。
doctest测试用例可以放在两个地方:
函数或者方法下的注释里面
模块的开头
案例
先看第一个案例,将需要测试的片段,标准格式,需要允许的代码前面加>>>,相当于进入cmd这种交互环境执行,期望的结果前面不需要加>>>
放到by函数的注释里
def by(m,n): """ function:两个数相乘 >>> by(4,3) 12 >>> by('ab',3) 'ababab' """ return m*n if __name__=="__main__": import doctest doctest.testmod(verbose=True)
运行结果
从运行的结果可以看出,虽然函数下方的注释里面有其它内容"function:两个数相乘",但不会去执行,只识别">>>"这种符号。2个测试用例都是通过的,实际的结果与期望的结果一致。
失败案例
doctest的内容放到.py模块的开头也是可以识别到的
""" function:两个数相乘 >>> by(4,3) 10 >>> by('ab',3) 'abab' """ def by(m,n): return m*n 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 lianxi.py
- m参数指定运行方式doctest
- -v参数是verbose,带上-v参数相当于verbose=True
pytest运行
pytest框架可以兼容doctest用例,执行的时候加个参数 --doctest-modules,这样它就能自动搜索到doctest的用例
pytest -v --doctest-modules lianxi.py
结果可以看出,文档里面的第一行被执行了,当遇到测试不通过的用例时,就不会继续往下执行了。
doctest独立文件
doctest内容也可以和代码抽离开,单独用一个.txt文件保存
在当前lianxi.py同一目录新建一个aa.txt文件(名字可以随意命名),写入测试的文档,需先导入该功能,导入代码前面也要加>>>
>>> from lianxi import by >>> by(4,3) 12 >>> by('ab',3) 'ababab'
cmd执行"python -m doctest -v aa.txt",测试结果如下: