pytest 测试输出和结果-处理测试失败

2022-03-21 11:46 更新

在第一次(或N次)失败后停止

pytest -x           # stop after first failure
pytest --maxfail=2  # stop after two failures

失败时丢弃到 pdb

Python 带有一个名为 ​pdb的内置 Python 调试器。 pytest 允许通过命令行选项进入 ​pdb提示符:

pytest --pdb

这将在每次失败(或​KeyboardInterrupt​)时调用Python调试器。通常,你可能只希望在第一个失败的测试中这样做,以了解特定的失败情况:

pytest -x --pdb   # drop to PDB on first failure, then end test session
pytest --pdb --maxfail=3  # drop to PDB for first three failures

请注意,在任何失败时,异常信息都存储在 ​sys.last_value​、​sys.last_type​ 和 ​sys.last_traceback​ 中。 在交互式使用中,这允许人们使用任何调试工具进行事后调试。 也可以手动访问异常信息,例如:

>>> import sys
>>> sys.last_traceback.tb_lineno
42
>>> sys.last_value
AssertionError('assert result == "ok"',)

在测试开始时删除到 pdb

pytest 允许在每个测试开始时通过命令行选项立即进入pdb提示符:

pytest --trace

这将在每次测试开始时调用Python调试器。

设置断点

要在代码中设置断点,请在代码中使用原生 ​Python import pdb;pdb.set_trace()​ 调用,pytest 会自动禁用该测试的输出捕获:

  • 其他测试中的输出捕获不受影响。
  • 任何先前已经被捕获的测试输出都将被这样处理。
  • 输出捕获在结束调试器会话时恢复(通过continue命令)。

使用内置断点函数

Python 3.7 引入了一个内置的 ​breakpoint()​ 函数。 Pytest 支持使用具有以下行为的 ​breakpoint()​:

  • 当调用 ​breakpoint()​ 并将 ​PYTHONBREAKPOINT设置为默认值时,pytest 将使用自定义内部PDB跟踪 UI 而不是系统默认Pdb​。
  • 测试完成后,系统将默认返回系统 ​Pdb跟踪 UI。
  • 将 ​--pdb​ 传递给 pytest 后,自定义内部 ​Pdb跟踪 UI 将与 ​breakpoint()​ 和失败的测试/未处理的异常一起使用。
  • --pdbcls​ 可用于指定自定义调试器类。

故障处理程序

faulthandler标准模块可用于在错误或超时后转储 Python 回溯。

该模块会自动启用 pytest 运行,除非在命令行上给出 ​-p no:faulthandler​。

如果测试完成时间超过 X 秒(在 Windows 上不可用),​faulthandler_timeout=X​ 配置选项也可用于转储所有线程的回溯。

注意:

此功能已从外部 ​pytest-faulthandler​ 插件集成,有两个小区别:

  • 要禁用它,请使用 ​-p no:faulthandler​ 而不是 ​--no-faulthandler​:前者可以与任何插件一起使用,因此它节省了一个选项。
  • --faulthandler-timeout​ 命令行选项已成为 ​faulthandler_timeout​ 配置选项。 它仍然可以使用 ​-o faulthandler_timeout=X​ 从命令行进行配置。

关于不可引发的异常和未处理的线程异常的警告

这些功能仅适用于 Python>=3.8。

未处理的异常是在无法传播给调用者的情况下引发的异常。 最常见的情况是 ​__del__​ 实现中引发的异常。

未处理的线程异常是在 ​Thread中引发但未处理的异常,导致线程不干净地终止。

这两种类型的异常通常都被认为是错误,但可能会被忽视,因为它们不会导致程序本身崩溃。 Pytest 检测到这些情况并发出在测试运行摘要中可见的警告。

插件会自动启用 pytest 运行,除非在命令行上给出了 ​-p no:unraisableexception​ (用于不可引发的异常)和 ​-p no:threadexception​ (用于线程异常)选项。

可以使用 ​pytest.mark.filterwarnings​ 标记选择性地使警告静音。 警告类别为 ​pytest.PytestUnraisableExceptionWarning​ 和 ​pytest.PytestUnhandledThreadExceptionWarning​。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号