py.test 2.2.0: 测试标记增强,参数化增强和持续时间分析

pytest-2.2.0 是流行测试工具 py.test 的一个测试套件兼容版本。插件可能需要升级。它带来了以下改进:

  • 更简单、更强大的测试参数化

    • 新的 @pytest.mark.parametrize 装饰器,用于使用不同参数运行测试

    • 新的 metafunc.parametrize() API,用于独立参数化参数

    • 请参阅 https://pytest.cn/en/stable/example/how-to/parametrize.html 中的示例

    • 请注意,parametrize() 相关 API 仍有些实验性,可能会在未来的版本中更改。

  • 改进了测试标记的处理和更精细的标记机制

    • “-m markexpr” 选项,用于根据标记选择测试

    • 新的“markers”ini 变量,用于为您的项目注册测试标记

    • 新的“–strict”选项,如果使用未注册的标记,将报错退出。

    • 请参阅 https://pytest.cn/en/stable/example/markers.html 中的示例

  • 持续时间分析:新的“–duration=N”选项,显示最慢的 N 次测试执行或 setup/teardown 调用。如果您想找出最慢的测试代码在哪里,这会非常有用。

  • 此外,2.2.0 更主动地调用 teardown/finalizers 函数,当它们失败时,可以提供更好、更准确的报告。

除此之外,还有一套常见的错误修复以及对 pytest 自身测试套件的清理,使其能够在更广泛的环境中运行。

有关一般信息,请参阅此处包含示例的详细文档

如果您想安装或升级 pytest,只需输入

pip install -U pytest # or
easy_install -U pytest

感谢 Ronny Pfannschmidt、David Burns、Jeff Donner、Daniel Nouri、Alfredo Deza 以及所有提供反馈或发送错误报告的人。

此致,holger krekel

不兼容说明

虽然测试套件应该可以保持不变地工作,但您可能需要升级插件。

  • 您需要新版本的 pytest-xdist 插件 (1.7) 来分发测试运行。

  • 如果其他插件实现了 pytest_runtest_logreport 钩子,则可能需要升级,因为现在在测试的 setup/teardown 夹具阶段会无条件调用该钩子。您可以通过插入“if rep.when != 'call': return”或类似代码来选择忽略 setup/teardown 失败。请注意,大多数代码可能“只是”可以工作,因为该钩子已经针对测试的失败 setup/teardown 阶段被调用,因此插件应该已经准备好理解此类报告。

2.1.3 和 2.2.0 之间的更改

  • 修复 issue90:引入测试项的积极拆卸,以便 teardown 函数更早被调用。

  • 添加了一个功能强大的 metafunc.parametrize 函数,该函数允许以多个步骤参数化测试函数参数,从而可以从独立的插件和位置进行参数化。

  • 添加了一个 @pytest.mark.parametrize 助手,可以轻松地使用不同的参数值调用测试函数。

  • 将示例添加到“parametrize”示例页面,包括测试场景的快速移植以及新的 parametrize 函数和装饰器。

  • 通过 ini 文件或插件钩子引入“pytest.mark.*”助手的注册。此外,引入了“–strict”选项,该选项会将未注册的标记视为错误,从而避免拼写错误并为您的测试套件维护一组描述完善的标记。请参阅 https://pytest.cn/en/stable/how-to/mark.html 及其链接中的示例。

  • issue50:引入“-m marker”选项,根据标记选择测试(这是一个比“-k”更严格、更可预测的版本,因为“-m”只匹配完整的标记,并且具有更明显的 and/or 语义规则)。

  • 新功能可帮助优化测试速度:–durations=N 选项,用于显示 N 次最慢的测试调用和 setup/teardown 方法。

  • 修复 issue87:–pastebin 现在适用于 python3

  • 修复 issue89:–pdb 在 doctest 中出现意外异常时更合理地工作

  • 修复并清理 pytest 自身的测试套件,以避免文件描述符泄漏

  • 修复 issue83:生成函数参数列表的链接

  • 修复 issue74:pyarg 模块名称现在根据 imp.find_module 的误报进行检查

  • 修复与 twisted/trial-11.1.0 用例的兼容性