pytest-2.4.0:新的夹具特性/钩子和错误修复

刚刚发布的 pytest-2.4.0 带来了许多改进和大量的错误修复,同时在插件和测试套件方面保持兼容性,除了少数非常微小的兼容性问题。请参阅下文以获取完整的详细信息列表。一些主要功能亮点

  • 新的 yield 风格夹具 pytest.yield_fixture,允许在夹具函数中使用现有 with 风格的上下文管理器。

  • 改进的 pdb 支持:import pdb ; pdb.set_trace() 现在无需事先禁用 stdout/stderr 捕获即可工作。此外,--pdb 选项现在在收集和内部错误时也有效,我们还引入了一个新的实验性钩子,供 IDE/插件拦截调试:pytest_exception_interact(node, call, report)

  • 更短的 monkeypatch 变体,允许指定导入路径作为目标,例如:monkeypatch.setattr("requests.get", myfunc)

  • 更好的 unittest/nose 兼容性:所有 teardown 方法现在仅在相应的 setup 方法成功时才会被调用。

  • 如果您配置了 argcomplete,则在命令行选项上集成 tab 补全功能。

  • 如果同时指定了“reason”,则允许直接在 skipif/xfail 中使用布尔表达式。

  • 一个新的钩子 pytest_load_initial_conftests 允许像 pytest-django 这样的插件在 conftest 文件导入 django 之前影响环境。

  • 报告:根据是否发生失败/错误或所有测试通过,将最后一行标记为红色或绿色。

文档已更新以适应这些更改,请参阅 https://pytest.cn

安装或升级 pytest

pip install -U pytest # or
easy_install -U pytest

非常感谢所有提供帮助的人,包括 Floris Bruynooghe、Brianna Laugher、Andreas Pelme、Anthon van der Neut、Anatoly Bubenkoff、Vladimir Keleshev、Mathieu Agopian、Ronny Pfannschmidt、Christian Theunert 等等。

愿测试顺利通过,

holger krekel

2.3.5 和 2.4 之间的变化

已知不兼容性

  • 如果从 python2.7 或更高版本调用 –genscript,您只能获得一个在 python2.7 或更高版本上运行的独立脚本。使用 Python2.6 也可以获得一个与 python2.5 兼容的版本。

  • 如果相应的 setup 方法失败,所有 xunit 风格的 teardown 方法(nose 风格、pytest 风格、unittest 风格)将不会被调用,请参阅下面的 issue322。

  • pytest_plugin_unregister 钩子从未被正确调用,并且没有已知的该钩子实现 - 因此它被移除了。

  • pytest.fixture 装饰的函数不能再是生成器(即使用 yield)。如果此更改导致不可预见的实际问题,可能会在 2.4.1 中撤销。但是,您始终可以编写并返回一个内部函数/生成器,并更改夹具消费者以迭代返回的生成器。此更改是为新的 pytest.yield_fixture 装饰器而进行的,请参阅下文。

新特性

  • 实验性地引入了一个新的 pytest.yield_fixture 装饰器,它接受与 pytest.fixture 完全相同的参数,但强制夹具函数使用 yield 语句而不是 return statement。这允许与夹具函数中的“with 风格”上下文管理器直接集成,并通常避免注册最终化回调,而是将“yield 之后”的代码视为 teardown 代码。感谢 Andreas Pelme、Vladimir Keleshev、Floris Bruynooghe、Ronny Pfannschmidt 和许多其他人进行了讨论。

  • 如果同时指定了“reason”,则允许直接在 skipif/xfail 中使用布尔表达式。重构跳过文档以推荐“条件作为布尔值”,因为它在模块之间导入标记时可以防止意外。将条件指定为字符串将保持完全支持。

  • 报告:根据是否发生失败/错误或所有测试通过,将最后一行标记为红色或绿色。感谢 Christian Theunert。

  • 使“import pdb ; pdb.set_trace()”在捕获方面原生工作(不再需要“-s”),使 pytest.set_trace() 仅仅是一个快捷方式。

  • 修复 issue181:–pdb 现在也可以在收集错误(和内部错误)时工作。这是通过一些内部重构和引入新的钩子 pytest_exception_interact 钩子(参见下一项)来实现的。

  • 修复 issue341:引入了新的实验性钩子,供 IDE/终端拦截调试:pytest_exception_interact(node, call, report)

  • 新的 monkeypatch.setattr() 变体,为修补模块中的类/函数提供更短的调用

    monkeypatch.setattr(“requests.get”, myfunc)

    会将“requests”模块的“get”函数替换为 myfunc

  • 修复 issue322:如果 setUpClass 失败,tearDownClass 将不会运行。感谢 Mathieu Agopian 的初步修复。同时使所有 pytest/nose 终结器模仿相同的通用行为:如果 setupX 存在并失败,则不运行 teardownX。这在内部引入了一个新的方法“node.addfinalizer()”辅助函数,该函数只能在节点的 setup 阶段调用。

  • 简化 pytest.mark.parametrize() 签名:允许传递逗号分隔的字符串来指定 argnames。例如:pytest.mark.parametrize("input,expected",  [(1,2), (2,3)]) 与之前的 pytest.mark.parametrize(("input", "expected"), ...) 一样有效。

  • 添加了对 setUpModule/tearDownModule 检测的支持,感谢 Brian Okken。

  • 通过使用“argcomplete”集成选项上的 tab 补全功能。感谢 Anthon van der Neut 的 PR。

  • 将选项名称更改为连字符分隔的长选项,但保持旧的拼写向后兼容。py.test -h 将只显示连字符版本,例如“–collect-only”,但“–collectonly”也将保持有效(出于向后兼容性原因)。非常感谢 Anthon van der Neut 的实现和 Hynek Schlawack 对我们的推动。

  • 修复 issue 308 - 允许在参数化时标记/xfail/skip 单个参数集。感谢 Brianna Laugher。

  • 调用新的实验性 pytest_load_initial_conftests 钩子,允许第三方插件在 conftest 加载之前做一些事情。

错误修复

  • 修复 issue358 - 现在通过使用新的 parser.parse_known_args 方法更正确地解析捕获选项。

  • pytest 现在使用 argparse 而不是 optparse(感谢 Anthon),这意味着如果安装到 python2.6 或更低版本环境中,将添加“argparse”作为依赖项。

  • 修复 issue333:修复了 unittest/pytest 钩子不良交互的一个情况。

  • PR27:在收集过程中正确处理 nose.SkipTest。感谢 Antonio Cuni,Ronny Pfannschmidt。

  • 修复 issue355:junitxml 将 name=”pytest” 属性放置到 testsuite 标签。

  • 修复 issue336:插件中的 autouse 夹具应该再次工作。

  • 修复 issue279:改进标准数据类型断言失败时的对象比较,并识别 collections.abc。感谢 Brianna Laugher 和 Mathieu Agopian。

  • 修复 issue317:断言重写器支持 is_package 方法

  • 修复 issue335:文档化 pytest.raises() 返回的 py.code.ExceptionInfo() 对象,感谢 Mathieu Agopian。

  • 从 setup.py 中移除隐式 distribute_setup 支持。

  • 修复 issue305:忽略写入 pyc 文件时的任何问题。

  • SO-17664702:即使夹具函数部分失败,也要调用夹具终结器(以前终结器并非总是被调用)

  • 修复 issue320 - 修复与模块级函数混合时夹具的类作用域。感谢 Anatoly Bubenkoff。

  • 您可以指定“-q”或“-qq”以获得不同级别的“更安静”报告(感谢 Katarzyna Jachim)

  • 修复 issue300 - 修复在子目录中启动 py.test 时 conftest 加载的顺序。

  • 修复 issue323 - 许多模块作用域参数化的排序

  • 使 sessionfinish 钩子在与会话开始时相同的 cwd-context 下执行(有助于修复以相对路径写入输出文件的插件行为,例如 pytest-cov)

  • 修复 issue316 - 在文档中正确引用收集钩子

  • 修复 issue 306 - 清理 -k/-m 选项,使其分别仅匹配标记/测试名称/关键字。感谢 Wouter van Ackooy。

  • 改进了 python 模块中 doctest 的计数 - 没有任何 doctest 项的文件将不再显示,并且 doctest 示例被计为单独的测试项。感谢 Danilo Bellini。

  • 修复 issue245,通过依赖已发布的 py-1.4.14,该版本修复了 py.io.dupfile 以处理没有模式的文件。感谢 Jason R. Coombs。

  • 修复测试输出包含控制字符时的 junitxml 生成,解决了 issue267,感谢 Jaap Broekhuizen

  • 修复 issue338:也为 setup/teardown 错误遵守 –tb 样式。感谢 Maho。

  • 修复 issue307 - 在示例中使用 yaml.safe_load,感谢 Mark Eichin。

  • 更好的参数化错误消息,感谢 Brianna Laugher

  • pytest_terminal_summary(terminalreporter) 钩子现在可以使用“.section(title)”和“.line(msg)”方法在测试运行结束时打印额外信息。