多年过去了,应该注意最好的解决方案。
来自 Pytest 的record_property夹具文档:
向调用测试添加额外的属性。
用户属性成为测试报告的一部分,可供配置的报告器使用,例如 JUnit XML。
夹具可通过名称、值调用。该值自动进行 XML 编码。
为通过和失败的案例捕获属性。
套房:
def test_passes(record_property):
record_property("key", "value1")
assert 1 == 1
def test_fails(record_property):
record_property("key", "value2")
assert 1 == 2
pytest
运行时的结果--junitxml=result.xml
生成的 Junit 测试报告:
<?xml version="1.0" encoding="utf-8"?>
<testsuites>
<testsuite name="pytest" errors="0" failures="1" skipped="0" tests="2" time="0.085"
timestamp="2021-04-12T14:25:09.900867" hostname="DESKTOP">
<testcase classname="test_something" name="test_passes" time="0.001">
<properties>
<property name="key" value="value1"/>
</properties>
</testcase>
<testcase classname="test_something" name="test_fails" time="0.001">
<properties>
<property name="key" value="value2"/>
</properties>
<failure message="assert 1 == 2">record_property = <function record_property.<locals>.append_property
at 0x000001A1A9EB40D0>
def test_fails(record_property):
record_property("key", "value2")
> assert 1 == 2
E assert 1 == 2
test_something.py:8: AssertionError
</failure>
</testcase>
</testsuite>
</testsuites>
如果您运行的 Pytest 版本非常新,您会看到弃用警告
test_something.py::test_fails
test_something.py:6: PytestWarning: record_property is incompatible with junit_family 'xunit2' (use 'legacy' or 'xunit1')
def test_fails(record_property):
这是因为 Xunit 报告的架构发生了变化。来自 Pytest更改日志:
- 当与 junit_family=xunit2 一起使用时,record_property 现在会发出 PytestWarning:fixture 生成属性标记作为测试用例的子项,根据最新的模式 <https://github.com/jenkinsci/xunit-plugin/blob/master,这是不允许的/
要克服警告,您可以:
使用覆盖标志运行 Pytest-o junit_family="xunit1"
或将此属性放在pytest.ini
使用record_testsuite_property会话范围的夹具。尽管如此,这仅允许将属性附加到测试套件级别。