跳转到主要内容

基于unittest的测试运行器,具有类似Ant/JUnit的XML报告功能。

项目描述

License Latest Version Development Status Documentation Status

codecov.io Coverage Status Coveralls Coverage Status Requirements Status

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 插件

此插件不执行 XSD 验证(在编写本文时)并且应该能够无问题地解析 XML 文件。

Jenkins xUnit 插件版本 1.100

此插件执行 XSD 验证并使用更宽松的 XSD。这应该能够无问题地解析 XML 文件。

Jenkins xUnit 插件版本 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 下(见附带的许可证)。

您可能还会发现以下资源很有用

安装

安装 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 (18.0 kB 查看散列)

上传时间

构建分发

unittest_xml_reporting-3.2.0-py2.py3-none-any.whl (20.9 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持