二、第二章
2.1通过python -m pytest调用pytest ----- 调用方式后期完善其他调用
这是在2.0版本中新引入的功能。
你可以通过python的解释器,利用命令行来调用测试:
python ‐m pytest [...]
这种调用方式几乎等同于直接调用pytest […],但需要注意的是这种通过python来调用的方式同时会
将当前目录添加到sys.path
2.2退出码
pytest有以下6种退出码:
Exit code 0: 找到所有测试用例并测试通过
Exit code 1: 找到测试用例并运行但是部分测试用例运行失败
Exit code 2: 用户中断了测试
Exit code 3: 执行过程中发生了内部错误
Exit code 4: pytest命令行使用错误
Exit code 5: 没有找到任何测试用例
2.3 版本信息,参数名,环境变量的帮助
pytest ‐‐version #显示pytest的import的路径
pytest ‐‐fixtures #显示内置的函数参数
pytest ‐h | ‐‐help #帮助信息
2.4 第一(N)次测试失败后停止
使用下面的参数可以让测试在第1(N)次测试失败后停止:
pytest ‐x # 第一次测试失败后停止测试
pytest ‐‐maxfail=2 # 第2次测试失败后停止测试
2.5指定/选择测试用例
Pytest在命令行中支持多种方式来运行和选择测试用例:
对模块中进行测试:
pytest test_mod.py
对文件夹中进行测试:
pytest testing/
通过关键字表达式来进行测试:
pytest ‐k "MyClass and not method"
这种方式会执行文件名,类名以及函数名与给定的字符串表达式相匹配的测试用例。 上面的用例会执
行TestMyClass.test_something但是不会执行TestMyClass.test_method_simple
and not 在这里是表达式,未经过测试
通过节点id来进行测试
每个被选中的测试用例都会被分配一个唯一的nodeid,它由模块文件名和以下说明符组成:参数化的
类名、函数名和参数,用::分隔。
可以通过下面的方式运行模块中的指定的测试用例:
pytest test_mod.py::test_func
也可以通过下面这种方式:
pytest test_mod.py::TestClass::test_method
通过标记符来进行测试
pytest ‐m slow
这种方式会运行所有通过装饰器 @pytest.mark.slow进行装饰的测试用例。
关于标记符请参考marks
通过包来运行
pytest ‐‐pyargs pkg.testing
这种方式会导入pkg.testing,并且基于该包所在为止来查找并运行测试用例。
2.6详尽的测试报告
参数**-r**可以用来在测试结束后展示一份“测试概要信息”,这使得在大型测试套中获取一份清楚
的测试结果(失败,跳过等测试信息)十分简单。
示例:
#test_example.py的内容
import pytest
@pytest.fixture
def error_fixture():
assert 0
def test_ok():
print("ok")
def test_fail():
assert 0
def test_error(error_fixture):
pass
def test_skip():
pytest.skip("skipping this test")
def test_xfail():
pytest.xfail("xfailing this test")
@pytest.mark.xfail(reason="always xfail")
def test_xpass():
pass
C:\>pytest ‐ra
2.7 测试失败时自动调用PDB
pytest允许通过命令行使能在测试失败时自动调用python的内置调试工具PDB:
pytest ‐‐pdb
这会在每次测试失败(或者发生KeyboardInterrupt)的时候都去调用PDB。通常我们可能只需要在第
一次测试失败的时候来调用pdb:
pytest ‐x ‐‐pdb #首次失败的时候调用pdb,然后结束测试进程
pytest ‐‐pdb ‐‐maxfail=3 #前三次失败的时候调用pdb
注意所有的异常信息都会保存在sys.last_value, sys.last_type和sys.last_traceback中。 在交互使用
中,这允许使用任何调试工具进入后期调试。我们也可以手动的访问这些异常信息,如下:
(Pdb) import sys
(Pdb) sys.last_traceback.tb_lineno
1448
(Pdb) sys.last_value
AssertionError('assert 0')
(Pdb) sys.last_type
<class 'AssertionError'>
2.8 测试启动时调用PDB
pytest允许在测试启动时立即调用pdb:
pytest ‐‐trace
这会在每个测试开始时立即调用python的pdb
2.9 设置断点
在代码中使用python的原生接口**python import pdb; pdb.set_trace()**来设置断点,在pytest中
会自动禁用该测试的输出捕获:
*其他测试的输出捕获不会受影响
*先前的测试中已经被捕获的输出会被正常处理
*同一测试中的后续输出不会被捕获,而被转发给sys.stdout。注意即使退出交互式pdb继续运行测
试,这一设置依然生效
2.10分析测试时间
pytest.main()
这和在命令行中使用pytest是一样的, 这种方式不会抛出SystemExit异常,而会返回exitcode, 通
过如下方式可以传入调用参数:
pytest.main(['‐x', 'mytestdir'])
你可以在pytest.main中指定额外的插件:
# myinvoke.py的内容
import pytest
class MyPlugin(object):
def pytest_sessionfinish(self):
print("*** test run reporting finishing")
pytest.main(["‐qq"], plugins=[MyPlugin()])
运行代码就可以发现MyPlugin被添加到hook里并被调用:
C:\>python myinvoke.py
**注意:**调用pytest.main()会导入你的测试用例及其所引用的所有的模块。因为python存在模块导
入的缓存机制,如果多次调用pytest.main(),后续的调用也不会再刷新这些导入的资源。因此,不建
议再同一进程中多次调用pytest.main() (比如重新运行测试).