输出XML测试报告
备注
0.2版新增功能
以JUnit XML格式输出测试报告。
此插件实现 startTest()
, testOutcome()
和 stopTestRun()
以JUnit XML格式编译并输出测试报告。默认情况下,报告将写入名为 nose2-junit.xml
在当前工作目录中。
您可以通过设置来配置输出文件名 path
在一个 [junit-xml]
配置文件中的节。XML 1.0中无效的Unicode字符将替换为 U+FFFD
替换字符。如果您的软件抛出一个带有无效字节字符串的错误。
默认情况下,不鼓励使用的字符的范围也将被替换。这可以通过设置 keep_restricted
配置变量到 True
.
默认情况下,不会打印参数化测试和生成测试的参数。例如,以下代码:
# a.py
from nose2 import tools
def test_gen():
def check(a, b):
assert a == b, '{}!={}'.format(a,b)
yield check, 99, 99
yield check, -1, -1
@tools.params('foo', 'bar')
def test_params(arg):
assert arg in ['foo', 'bar', 'baz']
默认情况下生成此XML:
<testcase classname="a" name="test_gen:1" time="0.000171"
timestamp="2021-12-09T21:28:09.686611">
<system-out />
</testcase>
<testcase classname="a" name="test_gen:2" time="0.000202"
timestamp="2021-12-09T21:28:09.686813">
<system-out />
</testcase>
<testcase classname="a" name="test_params:1" time="0.000159"
timestamp="2021-12-09T21:28:09.686972">
<system-out />
</testcase>
<testcase classname="a" name="test_params:2" time="0.000163"
timestamp="2021-12-09T21:28:09.687135">
<system-out />
</testcase>
但是如果 test_fullname
是 True
,然后生成以下XML:
<testcase classname="a" name="test_gen:1 (99, 99)" time="0.000213"
timestamp="2021-12-09T21:28:09.686611">
<system-out />
</testcase>
<testcase classname="a" name="test_gen:2 (-1, -1)" time="0.000194"
timestamp="2021-12-09T21:28:09.687105">
<system-out />
</testcase>
<testcase classname="a" name="test_params:1 ('foo')" time="0.000178"
timestamp="2021-12-09T21:28:09.687283">
<system-out />
</testcase>
<testcase classname="a" name="test_params:2 ('bar')" time="0.000187"
timestamp="2021-12-09T21:28:09.687470">
<system-out />
</testcase>
启用此插件
此插件是内置的,但默认情况下不加载。
即使您指定 always-on = True
在配置中,除非您也启用它,否则它不会运行。您可以通过将以下内容放入 unittest.cfg
或 nose2.cfg
文件
[unittest]
plugins = nose2.plugins.junitxml
这个 plugins
参数可以包含插件名称列表,包括 nose2.plugins.junitxml
配置 [junit-xml]
- always-on
- 违约:
假
- 类型:
布尔
- keep_restricted
- 违约:
假
- 类型:
布尔
- path
- 违约:
nose2-junit.xml文件
- 类型:
STR
- test_fullname
- 违约:
假
- 类型:
布尔
- test_properties
- 违约:
没有
- 类型:
STR
示例配置
默认配置相当于在 unittest.cfg
文件。
[junit-xml]
always-on = False
keep_restricted = False
path = nose2-junit.xml
test_fullname = False
命令行选项
- --junit-xml-path FILE
输出XML文件名
- -X DEFAULT, --junit-xml DEFAULT
生成JUnit XML输出报告
插件类引用:JUnitXmlReporter
样品输出
在包中包含测试的nose2示例方案的XML测试报告如下所示:
<testsuite errors="1" failures="5" name="nose2-junit" skips="1" tests="25" time="0.004">
<testcase classname="pkg1.test.test_things" name="test_gen:1" time="0.000141" />
<testcase classname="pkg1.test.test_things" name="test_gen:2" time="0.000093" />
<testcase classname="pkg1.test.test_things" name="test_gen:3" time="0.000086" />
<testcase classname="pkg1.test.test_things" name="test_gen:4" time="0.000086" />
<testcase classname="pkg1.test.test_things" name="test_gen:5" time="0.000087" />
<testcase classname="pkg1.test.test_things" name="test_gen_nose_style:1" time="0.000085" />
<testcase classname="pkg1.test.test_things" name="test_gen_nose_style:2" time="0.000090" />
<testcase classname="pkg1.test.test_things" name="test_gen_nose_style:3" time="0.000085" />
<testcase classname="pkg1.test.test_things" name="test_gen_nose_style:4" time="0.000087" />
<testcase classname="pkg1.test.test_things" name="test_gen_nose_style:5" time="0.000086" />
<testcase classname="pkg1.test.test_things" name="test_params_func:1" time="0.000093" />
<testcase classname="pkg1.test.test_things" name="test_params_func:2" time="0.000098">
<failure message="test failure">Traceback (most recent call last):
File "nose2/plugins/loader/parameters.py", line 162, in func
return obj(*argSet)
File "nose2/tests/functional/support/scenario/tests_in_package/pkg1/test/test_things.py", line 64, in test_params_func
assert a == 1
AssertionError
</failure>
</testcase>
<testcase classname="pkg1.test.test_things" name="test_params_func_multi_arg:1" time="0.000094" />
<testcase classname="pkg1.test.test_things" name="test_params_func_multi_arg:2" time="0.000089">
<failure message="test failure">Traceback (most recent call last):
File "nose2/plugins/loader/parameters.py", line 162, in func
return obj(*argSet)
File "nose2/tests/functional/support/scenario/tests_in_package/pkg1/test/test_things.py", line 69, in test_params_func_multi_arg
assert a == b
AssertionError
</failure>
</testcase>
<testcase classname="pkg1.test.test_things" name="test_params_func_multi_arg:3" time="0.000096" />
<testcase classname="" name="test_fixt" time="0.000091" />
<testcase classname="" name="test_func" time="0.000084" />
<testcase classname="pkg1.test.test_things.SomeTests" name="test_failed" time="0.000113">
<failure message="test failure">Traceback (most recent call last):
File "nose2/tests/functional/support/scenario/tests_in_package/pkg1/test/test_things.py", line 17, in test_failed
assert False, "I failed"
AssertionError: I failed
</failure>
</testcase>
<testcase classname="pkg1.test.test_things.SomeTests" name="test_ok" time="0.000093" />
<testcase classname="pkg1.test.test_things.SomeTests" name="test_params_method:1" time="0.000099" />
<testcase classname="pkg1.test.test_things.SomeTests" name="test_params_method:2" time="0.000101">
<failure message="test failure">Traceback (most recent call last):
File "nose2/plugins/loader/parameters.py", line 144, in _method
return method(self, *argSet)
File "nose2/tests/functional/support/scenario/tests_in_package/pkg1/test/test_things.py", line 29, in test_params_method
self.assertEqual(a, 1)
AssertionError: 2 != 1
</failure>
</testcase>
<testcase classname="pkg1.test.test_things.SomeTests" name="test_skippy" time="0.000104">
<skipped />
</testcase>
<testcase classname="pkg1.test.test_things.SomeTests" name="test_typeerr" time="0.000096">
<error message="test failure">Traceback (most recent call last):
File "nose2/tests/functional/support/scenario/tests_in_package/pkg1/test/test_things.py", line 13, in test_typeerr
raise TypeError("oops")
TypeError: oops
</error>
</testcase>
<testcase classname="pkg1.test.test_things.SomeTests" name="test_gen_method:1" time="0.000094" />
<testcase classname="pkg1.test.test_things.SomeTests" name="test_gen_method:2" time="0.000090">
<failure message="test failure">Traceback (most recent call last):
File "nose2/plugins/loader/generators.py", line 145, in method
return func(*args)
File "nose2/tests/functional/support/scenario/tests_in_package/pkg1/test/test_things.py", line 24, in check
assert x == 1
AssertionError
</failure>
</testcase>
</testsuite>