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)”方法在测试运行结束时打印额外信息。