介绍
Pytest 不仅仅是用于发现测试和报告断言结果。 随着Python测试套件的增长,重复的测试逻辑和共享安装代码使得测试难以读取、调试和扩展。 在本模块中,你将了解三个 pytest 功能,这些功能可帮助保持Python测试可读且可维护:参数化、固定装置和内置monkeypatch装置。
本模块假定可以编写Python脚本、在终端中运行命令,并在具有 Python 3.10 或更高版本的虚拟环境中运行简单的 pytest 测试。 如果需要Windows设置帮助,请参阅 venv 文档。
使用 @pytest.mark.parametrize 实现的参数化使用多组参数运行同一个测试函数,而 pytest 会将每次生成的调用作为独立的测试项进行收集。 固定例程是注册到 pytest 的函数(通常使用 @pytest.fixture 进行注册),测试或其他固定例程可通过名称请求使用它们。 它们可以返回可重用的值,并在测试或固定例程作用域结束时运行清理操作(如有必要)。
monkeypatch 固定例程会临时更改属性、字典项、环境变量、sys.path 或当前工作目录,然后在提出请求的测试或固定例程完成后自动撤消这些更改。
本模块中的示例是单元式测试,但相同的 pytest 功能适用于更大的集成或功能测试套件。 这些示例使用Python的 assert 语句;pytest 提供断言反省,因此失败报告包含表达式中的有用值。
何时使用这些功能
- 当你正在测试中遍历输入,或者因输入参数略有不同而复制近似重复的测试函数时,可以使用参数化。 参数化将一个测试定义扩展到多个测试项中,因此每个输入都获取其自己的通过/失败报告。
- 当多个测试需要相同的设置(如测试数据、临时文件或数据库连接)或者运行后需要执行可预测的清理时,可以使用固定例程。
- 当
monkeypatch测试需要将代码与外部状态(例如环境变量、当前工作目录或调用远程服务的函数)隔离时使用,而无需永久更改该状态。
首先,将循环和几乎重复的测试替换为参数化。 接下来,你将使用固定例程来共享设置或清理配置,了解 tmp_path 和 monkeypatch 等内置固定例程,并练习将 xUnit 风格的 setup 和 teardown 方法重构为固定例程。
在本模块结束时,你将准备好应用这些 pytest 功能,以减少重复、扩展覆盖范围和改进Python测试套件中的故障诊断。
有关详细信息,请参阅 pytest 文档以了解断言、参数化测试、固定例程和 monkeypatch。