pytest 测试输出和结果-处理测试失败
在第一次(或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
。
更多建议: