导入
高级 pytest 特性
了解在 pytest 中可以使用的另外两个技巧:预期会失败的测试和日志捕获。
概述
pytest 库功能强大,我们无法在此详尽描述其所有特性。不过,我们可以探讨其中几个功能,作为吸引你深入学习的“诱饵”。
检查异常
一个常见的测试模式是验证代码是否会抛出预期的异常——这不仅用于测试正常情况(正向测试),也用于验证预期中的失败情形。pytest 提供了 pytest.raises 上下文管理器来简化这一过程。请看下面的例子:
(示例内容已省略超链接)
另一个有助于处理此类场景的工具是 xfail 标记。
(示例内容已省略超链接)
默认情况下,当我们把一个测试标记为 xfail 时,该测试仍会执行,并根据结果记录为 XFAIL(日志中显示为 x)或 XPASS(日志中显示为 X)。无论哪种结果,整个测试套件都会被视为通过。
我们可以在 xfail 标记中设置多个参数,以控制对失败和成功的处理方式。例如:
1@pytest.mark.xfail( 2 reason="Bug #666:不支持负的缩放参数", 3 raises=ValueError, 4 strict=True 5) 6def test_negative_scale(): 7 scale_image(image, scale=-2.0)
可配置的选项包括:
reason:说明该测试为何预期会失败。raises:期望抛出的异常类型。如果抛出了其他异常,则测试将像普通测试一样失败(这有助于我们区分特定错误或不支持的行为)。strict:是否严格模式?是否允许测试成功?记住,“垃圾进,垃圾出”,因此当输入不正确时,我们希望系统能快速失败。
更多细节请参考 pytest 官方文档。
日志捕获
另一个不太常见但很有用的功能是:在测试过程中捕获日志,并对其进行断言验证。
1def test_some_logs(caplog): 2 do_magic() 3 pattern = 'Doing magic' 4 logs = [x for x in caplog.messages if pattern in x] 5 assert logs == ['Doing magic for the greater good!']
通常,需要编写此类测试可能意味着软件设计存在不足。但这也体现了 pytest 的强大能力。此外值得注意的是,pytest 具有良好的可扩展性,社区提供了大量插件来增强其功能。