基于unittest的测试运行器,具有类似Ant/JUnit的XML报告功能。
项目描述
unittest-xml-reporting (又称xmlrunner)
一个可以将测试结果保存为xUnit格式的XML文件的unittest测试运行器。这些文件可以被各种工具消费,例如构建系统、IDE和持续集成服务器。
要求
- Python 3.7+
- 请注意,Python 3.6的生命周期已于2021年12月结束,支持3.6的最后一个版本是3.1.0
- 请注意,Python 3.5 的生命周期已于 2020 年 9 月结束,支持 3.5 的最后一个版本是 3.1.0。
- 请注意,Python 2.7 的生命周期已于 2020 年 1 月结束,支持 2.7 的最后一个版本是 2.5.2。
- 请注意,Python 3.4 的生命周期已于 2019 年 3 月结束,支持 3.4 的最后一个版本是 2.5.2。
- 请注意,Python 2.6 的生命周期已于 2013 年 10 月结束,支持 2.6 的最后一个版本是 1.14.0。
对 unittest.TestCase.subTest
的有限支持
https://docs.pythonlang.cn/3/library/unittest.html#unittest.TestCase.subTest
unittest
有为 unittest.TestCase
提供子测试的概念;这并不很好地映射到现有的 xUnit 概念,因此在模式中找不到它。这意味着您将失去子测试报告的一些粒度。
unittest
还不会报告成功的子测试,因此计数不会完全准确。
Jenkins 插件
- Jenkins JUnit 插件: https://plugins.jenkins.io/junit/
- Jenkins xUnit 插件: https://plugins.jenkins.io/xunit/
Jenkins JUnit 插件
此插件不执行 XSD 验证(在编写本文时)并且应该能够无问题地解析 XML 文件。
Jenkins xUnit 插件版本 1.100
此插件执行 XSD 验证并使用更宽松的 XSD。这应该能够无问题地解析 XML 文件。
Jenkins xUnit 插件版本 1.104+
- Jenkins (junit-10.xsd), xunit 插件 (2018-当前),版本
1.104
+。
此插件执行 XSD 验证并使用更严格的 XSD。
请参阅 https://github.com/xmlrunner/unittest-xml-reporting/issues/209
import io
import unittest
import xmlrunner
# run the tests storing results in memory
out = io.BytesIO()
unittest.main(
testRunner=xmlrunner.XMLTestRunner(output=out),
failfast=False, buffer=False, catchbreak=False, exit=False)
转换结果以删除额外的属性。
from xmlrunner.extra.xunit_plugin import transform
with open('TEST-report.xml', 'wb') as report:
report.write(transform(out.getvalue()))
JUnit 架构?
有众多工具声称可以编写 JUnit 报告,因此您将找到许多存在细微差异的架构。
我们使用了 Jenkins xUnit 插件版本 1.100
中可用的 XSD;副本位于 tests/vendor/jenkins/xunit-plugin/.../junit-10.xsd
下(见附带的许可证)。
您可能还会发现以下资源很有用
- https://stackoverflow.com/questions/4922867/what-is-the-junit-xml-format-specification-that-hudson-supports
- https://stackoverflow.com/questions/11241781/python-unittests-in-jenkins
- JUnit 架构 (JUnit.xsd)
- Windyroad (JUnit.xsd)
- 一个 gist (Jenkins xUnit 测试结果架构)
安装
安装 unittest-xml-reporting 最简单的方法是通过 Pip。
$ pip install unittest-xml-reporting
如果您使用 Git 并希望获取最新的 开发 版本
$ git clone https://github.com/xmlrunner/unittest-xml-reporting.git
$ cd unittest-xml-reporting
$ sudo python setup.py install
或作为 tarball 获取最新的开发版本
$ wget https://github.com/xmlrunner/unittest-xml-reporting/archive/master.zip
$ unzip master.zip
$ cd unittest-xml-reporting
$ sudo python setup.py install
或者,您可以手动从 PyPI 下载最新的发布版本。
命令行
python -m xmlrunner [options]
python -m xmlrunner discover [options]
# help
python -m xmlrunner -h
例如。
python -m xmlrunner discover -t ~/mycode/tests -o /tmp/build/junit-reports
用法
下面的脚本,改编自 unittest,展示了如何以非常简单的方式使用 XMLTestRunner
。实际上,此脚本与原始脚本之间唯一的区别是最后一行
import random
import unittest
import xmlrunner
class TestSequenceFunctions(unittest.TestCase):
def setUp(self):
self.seq = list(range(10))
@unittest.skip("demonstrating skipping")
def test_skipped(self):
self.fail("shouldn't happen")
def test_shuffle(self):
# make sure the shuffled sequence does not lose any elements
random.shuffle(self.seq)
self.seq.sort()
self.assertEqual(self.seq, list(range(10)))
# should raise an exception for an immutable sequence
self.assertRaises(TypeError, random.shuffle, (1,2,3))
def test_choice(self):
element = random.choice(self.seq)
self.assertTrue(element in self.seq)
def test_sample(self):
with self.assertRaises(ValueError):
random.sample(self.seq, 20)
for element in random.sample(self.seq, 5):
self.assertTrue(element in self.seq)
if __name__ == '__main__':
unittest.main(
testRunner=xmlrunner.XMLTestRunner(output='test-reports'),
# these make sure that some options that are not applicable
# remain hidden from the help menu.
failfast=False, buffer=False, catchbreak=False)
将报告输出到单个文件
if __name__ == '__main__':
with open('/path/to/results.xml', 'wb') as output:
unittest.main(
testRunner=xmlrunner.XMLTestRunner(output=output),
failfast=False, buffer=False, catchbreak=False)
Doctest 支持
XMLTestRunner
还可以用来报告关于 docstrings 风格的测试。
import doctest
import xmlrunner
def twice(n):
"""
>>> twice(5)
10
"""
return 2 * n
class Multiplicator(object):
def threetimes(self, n):
"""
>>> Multiplicator().threetimes(5)
15
"""
return 3 * n
if __name__ == "__main__":
suite = doctest.DocTestSuite()
xmlrunner.XMLTestRunner().run(suite)
Django 支持
要将 XMLTestRunner
连接到 Django 项目,请在您的 settings.py
中添加以下内容
TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'
另外,还提供了以下设置,以便您可以微调报告
设置 | 默认值 | 值 | 描述 |
---|---|---|---|
TEST_OUTPUT_VERBOSE |
1 |
0|1|2 |
除了测试运行器生成的XML报告外,还有一堆有用的信息被打印到sys.stderr 流中,就像TextTestRunner 所做的那样。使用此设置可以在详细和非详细输出之间进行选择。 |
TEST_OUTPUT_DESCRIPTIONS |
False |
True|False |
如果您的测试方法包含docstrings,您可以选择显示这些docstrings而不是显示测试名称(例如:module.TestCase.test_method )。要使用此功能,您必须通过设置 TEST_OUTPUT_VERBOSE = 2 来启用详细输出。仅影响stdout,不影响XML输出。 |
TEST_OUTPUT_DIR |
"." |
<str> |
告诉测试运行器将XML报告放在哪里。如果找不到目录,测试运行器将在生成XML文件之前尝试创建它。 |
TEST_OUTPUT_FILE_NAME |
None |
<str> |
告诉测试运行器在os.path.join(TEST_OUTPUT_DIR, TEST_OUTPUT_FILE_NAME) 下输出一个具有此文件名的单个XML报告。请注意,对于长时间运行的测试,这将在内存中保留结果的时间比多个报告更长,并且可能会使用更多资源。 |
贡献
我们一直在寻找好的贡献,所以请随意fork存储库并发送pull请求(附有测试!)。
如果您想获得对存储库的写访问权限或成为维护者,请随时联系我们。
使用tox
测试更改
在发送pull请求之前,请使用tox
测试您的更改。您可以在https://testrun.org/tox/latest/找到有关tox
的更多信息。
$ pip install tox
# basic sanity test, friendly output
$ tox -e pytest
# all combinations
$ tox
项目详情
下载文件
下载适用于您的平台文件。如果您不确定选择哪个,请了解更多有关安装包的信息。
源分发
构建分发
unittest-xml-reporting-3.2.0.tar.gz的散列
算法 | 哈希摘要 | |
---|---|---|
SHA256 | edd8d3170b40c3a81b8cf910f46c6a304ae2847ec01036d02e9c0f9b85762d28 |
|
MD5 | f12aeab63ff44e295526e103313d66c8 |
|
BLAKE2b-256 | ed403bf1afc96e93c7322520981ac4593cbb29daa21b48d32746f05ab5563dca |
unittest_xml_reporting-3.2.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f3d7402e5b3ac72a5ee3149278339db1a8f932ee405f48bcb9c681372f2717d5 |
|
MD5 | b40dbb6db271b259826b2c293bd3d4a9 |
|
BLAKE2b-256 | 3988f6e9b87428584a3c62cac768185c438ca6d561367a5d267b293259d76075 |