在讲解pytest执行txt格式的文档之前,首先看一下再Python交互解释器中常用的python调试代码,比如如下,很明显,这些都是在Python交互解释器中调试基本的运算时的用法,比如加减乘除运算的所见即所得,比如字典key值的判断等。
>>> 1+1
2
>>> 2*3
6
>>> 4/2
2.0
>>> "h" in "hello"
True
>>> info={"age":20,"name":"Jack"}
>>> "age" in info.keys()
True
>>> info["name"]=="jack"
False
Pytest可以执行txt格式的文档,而文档的内容就是类似与上面的Python交互式解释器中的内容。
Pytest除了可以执行.py格式文件的脚本,还可以执行test*.txt格式的文本测试,比如创建一个test_demo.txt文件,文件的内容如下:
>>> 1+1
2
>>> 2*3
6
>>> 4/2
2.0
>>> "h" in "hello"
True
>>> info={"age":20,"name":"Jack"}
>>> "age" in info.keys()
True
>>> info["name"]=="jack"
False
然后使用pytest -s 命令执行,执行结果如下,可以看到这里显示有一个用例执行成功了。
(demo-HCIhX0Hq) E:\demo>pytest -s
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 item
test_demo.txt .
==================== 1 passed in 0.04s ====================
(demo-HCIhX0Hq) E:\demo>
上面执行成功了,执行结果中只显示一个passed,那么到底有没有执行呢,执行了什么呢?下面通过将txt文件中的结果改错一个位置,比如如下将判断age是否为字典的key值的结果设置为False。
>>> 1+1
2
>>> 2*3
6
>>> 4/2
2.0
>>> "h" in "hello"
True
>>> info={"age":20,"name":"Jack"}
>>> "age" in info.keys()
False
>>> info["name"]=="jack"
False
再次使用pytest命令执行,此时可以看到执行失败了,而当失败时会把执行的内容以及失败的位置都显示出来,如下,可以看到在010行的位置报错了,期望的是False,而实际得到的结果是True,与期望不一致了。
(demo-HCIhX0Hq) E:\demo>pytest -s
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 item
test_demo.txt F
======================== FAILURES =========================
_________________ [doctest] test_demo.txt _________________
001 >>> 1+1
002 2
003 >>> 2*3
004 6
005 >>> 4/2
006 2.0
007 >>> "h" in "hello"
008 True
009 >>> info={"age":20,"name":"Jack"}
010 >>> "age" in info.keys()
Expected:
False
Got:
True
E:\demo\test_demo.txt:10: DocTestFailure
================= short test summary info =================
FAILED test_demo.txt::test_demo.txt
==================== 1 failed in 0.03s ====================
(demo-HCIhX0Hq) E:\demo>
通过上面的例子可以得出,pytest在执行txt格式的脚本时,txt中的脚本实际上就是python交互解释器中的表达式以及对应的即时执行结果,而表达式下面的结果即为期望的结果,当表达式经过实际运算得出的结果与txt文件中此表达式下一行的结果不一致时就认为测试用欧失败。
此外,pytest执行txt格式的文本测试,文件名也是要遵循test*.txt的格式的,比如将test_demo.txt文件修改为demo.txt文件,文本内容不变,使用pytest -s执行的结果为如下,即此时并未发现有文本测试脚本。
(demo-HCIhX0Hq) E:\demo>pytest -s
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 0 items
================== no tests ran in 0.02s ==================
(demo-HCIhX0Hq) E:\demo>