- 内置的简单报告:
unittest自带的功能。 - 使用
HTMLTestRunner生成精美的 HTML 报告:最常用、最直观的第三方方案。 - 使用
unittest-xml-reporting生成 JUnit 风格的 XML 报告:用于 CI/CD 集成。 - 使用
pytest生成报告:作为unittest的替代方案,其报告功能更强大。
内置的简单报告
这是最基础的方式,无需安装任何额外库,当你运行 unittest 测试时,它会直接在终端打印结果。

特点:
- 优点:开箱即用,无需配置。
- 缺点:输出格式单一,信息有限,不便于长期存储和分享。
示例代码:
# 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
输出示例:

..
----------------------------------------------------------------------
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 文件,非常适合阅读和归档。

安装:
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 文件。
运行方式:
-
生成 HTML 报告:
pytest test_math.py --html=reports/pytest_report.html --self-contained-html
--html=...:指定 HTML 报告输出路径。--self-contained-html:将 CSS 样式内嵌到 HTML 文件中,方便分享。
-
生成 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-reporting或pytest --junitxml是标准做法。 - 如果你正在开始一个新项目,或者觉得
unittest的写法有些繁琐,强烈推荐直接学习并使用pytest,它在保持简洁的同时,提供了无与伦比的扩展性和功能,是目前 Python 测试领域的主流选择。
