杰瑞科技汇

Python unittest报告如何生成?

  1. 内置的简单报告unittest 自带的功能。
  2. 使用 HTMLTestRunner 生成精美的 HTML 报告:最常用、最直观的第三方方案。
  3. 使用 unittest-xml-reporting 生成 JUnit 风格的 XML 报告:用于 CI/CD 集成。
  4. 使用 pytest 生成报告:作为 unittest 的替代方案,其报告功能更强大。

内置的简单报告

这是最基础的方式,无需安装任何额外库,当你运行 unittest 测试时,它会直接在终端打印结果。

Python unittest报告如何生成?-图1
(图片来源网络,侵删)

特点:

  • 优点:开箱即用,无需配置。
  • 缺点:输出格式单一,信息有限,不便于长期存储和分享。

示例代码:

# test_math.py
import unittest
class TestMathOperations(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(1 + 1, 2)
        self.assertEqual(5 + 5, 10)
    def test_subtraction(self):
        self.assertEqual(10 - 5, 5)
    def test_division_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            result = 10 / 0
if __name__ == '__main__':
    unittest.main()

运行方式:

python -m unittest test_math.py

输出示例:

Python unittest报告如何生成?-图2
(图片来源网络,侵删)
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK

或者使用更详细的模式:

python -m unittest test_math.py -v

详细输出示例:

test_addition (test_math.TestMathOperations) ... ok
test_subtraction (test_math.TestMathOperations) ... ok
test_division_by_zero (test_math.TestMathOperations) ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK

如果测试失败,输出会显示错误信息,

F.
======================================================================
FAIL: test_addition (__main__.TestMathOperations)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_math.py", line 6, in test_addition
    self.assertEqual(1 + 1, 3)
AssertionError: 2 != 3
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)

使用 HTMLTestRunner 生成精美的 HTML 报告

这是最受欢迎的方案之一,可以生成一个包含图表、详细错误信息的独立 HTML 文件,非常适合阅读和归档。

Python unittest报告如何生成?-图3
(图片来源网络,侵删)

安装:

pip install HTMLTestRunner

注意: HTMLTestRunner 的版本和兼容性需要注意,以下代码适用于较新的版本。

示例代码:

# test_runner_example.py
import unittest
import HTMLTestRunner
import os
# 1. 定义测试用例 (与上面相同)
class TestMathOperations(unittest.TestCase):
    def test_addition(self):
        self.assertEqual(1 + 1, 2)
    def test_subtraction(self):
        self.assertEqual(10 - 5, 5)
    def test_division_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            result = 10 / 0
# 2. 创建测试套件
suite = unittest.TestLoader().loadTestsFromTestCase(TestMathOperations)
# 3. 定义报告文件路径
report_dir = "reports"
if not os.path.exists(report_dir):
    os.makedirs(report_dir)
report_file = os.path.join(report_dir, "test_report.html")
# 4. 运行测试并生成报告
with open(report_file, 'wb') as f:
    # HTMLTestRunner 的参数
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=f,
        title='单元测试报告',
        description='这是使用 HTMLTestRunner 生成的报告',
        verbosity=2,  # 详细程度
        report_name='MyTestReport'
    )
    runner.run(suite)
print(f"报告已生成: {report_file}")

运行方式:

python test_runner_example.py

结果:

运行后,你会在 reports 目录下找到一个 test_report.html 文件,用浏览器打开它,会看到一个非常美观的报告,包含:

  • 总体概览(通过/失败/总数)
  • 测试用例列表
  • 每个用例的详细状态
  • 失败用例的错误堆栈信息
  • 可视化图表

使用 unittest-xml-reporting 生成 JUnit 风格的 XML 报告

这种报告格式是许多持续集成/持续部署工具(如 Jenkins, GitLab CI, Azure DevOps)的标准输入,工具可以解析这个 XML 文件来显示测试结果、统计覆盖率等。

安装:

pip install unittest-xml-reporting

示例代码:

# test_xml_report.py
import unittest
import xmlrunner
# 1. 定义测试用例
class TestStringMethods(unittest.TestCase):
    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')
    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())
    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # 检查当分隔符不是默认值时会发生什么
        with self.assertRaises(TypeError):
            s.split(2)
if __name__ == '__main__':
    # 使用 xmlrunner 的 main 函数
    # 报告会保存在当前目录的 'test-reports' 文件夹中
    xmlrunner.main(
        output='test-reports',
        verbosity=2,
        failfast=False
    )

运行方式:

python test_xml_report.py

结果:

运行后,你会在 test-reports 目录下看到一个或多个 XML 文件(TEST-MyTestSuite.xml),文件内容类似这样:

<testsuite name="__main__" tests="3" failures="0" errors="0" time="0.001">
  <testcase name="test_upper" classname="__main__.TestStringMethods" time="0.000">
  </testcase>
  <testcase name="test_isupper" classname="__main__.TestStringMethods" time="0.000">
  </testcase>
  <testcase name="test_split" classname="__main__.TestStringMethods" time="0.000">
  </testcase>
</testsuite>

如果测试失败,<failure><error> 标签会嵌入在对应的 <testcase> 标签内。


使用 pytest 生成报告

pytest 是一个比 unittest 更强大、更灵活的测试框架,它本身就能很好地运行 unittest 的测试用例,并且其报告生态系统非常丰富。

安装:

pip install pytest

安装报告插件:

pip install pytest-html  # 生成 HTML 报告
pip install pytest-junitxml # 生成 JUnit XML 报告

示例代码:

我们可以直接使用上面写的 test_math.py 文件。

运行方式:

  1. 生成 HTML 报告:

    pytest test_math.py --html=reports/pytest_report.html --self-contained-html
    • --html=...:指定 HTML 报告输出路径。
    • --self-contained-html:将 CSS 样式内嵌到 HTML 文件中,方便分享。
  2. 生成 JUnit XML 报告:

    pytest test_math.py --junitxml=reports/pytest_junit_report.xml

pytest 的优势:

  • 简洁的语法:写测试用例比 unittest 更简单。
  • 丰富的插件生态:除了报告,还有覆盖率(pytest-cov)、参数化(pytest.mark.parametrize)等大量插件。
  • 强大的发现机制:能自动发现 test_*.py*_test.py 文件中的测试用例。
  • 更好的断言信息:当断言失败时,pytest 会提供更详细的 diff 信息。

总结与对比

特性 unittest 内置 HTMLTestRunner unittest-xml-reporting pytest
报告类型 控制台文本 HTML 文件 JUnit XML 文件 HTML, JUnit XML, 等多种
安装 无需安装 pip install HTMLTestRunner pip install unittest-xml-reporting pip install pytest
易用性 简单,功能有限 中等,需要编写代码生成报告 中等,需要编写代码生成报告 非常简单,命令行参数即可
美观度 非常高 不适用(机器可读)
主要用途 快速本地调试 生成可读性强的报告,用于分享和归档 与 CI/CD 工具(如 Jenkins)集成 功能强大的测试框架,适用于各种复杂场景
推荐场景 简单脚本、快速验证 个人项目、团队内部报告、需要展示给非技术人员 企业级项目、自动化流水线 新项目、追求效率和功能的项目

最终建议:

  • 如果你只是想快速在本地看看结果,用 python -m unittest -v 就足够了。
  • 如果你需要生成一份漂亮、直观的 HTML 报告来分享或归档HTMLTestRunner 是一个很好的选择。
  • 如果你的项目需要接入 Jenkins、GitLab CI 等自动化工具unittest-xml-reportingpytest --junitxml 是标准做法。
  • 如果你正在开始一个新项目,或者觉得 unittest 的写法有些繁琐,强烈推荐直接学习并使用 pytest,它在保持简洁的同时,提供了无与伦比的扩展性和功能,是目前 Python 测试领域的主流选择。
分享:
扫描分享到社交APP
上一篇
下一篇