python单元测试主流选pytest,因其简洁灵活、功能丰富;unittest是标准库框架,结构严谨但样板代码多。两者在定义方式、断言、参数化、fixtures等方面差异显著,新项目优先选pytest,旧项目可兼容运行。
python单元测试主要用 unittest 和 pytest 两种框架,前者是标准库自带、风格偏“类java”,后者第三方但更简洁灵活,实际项目中 pytest 已成主流选择。
unittest:标准库,结构严谨但写法略重
unittest 遵循 xUnit 风格,必须继承 unittest.TestCase,方法名以 test_ 开头,断言用 self.assertEqual() 等专属方法:
- 测试类必须继承
unittest.TestCase - 每个测试方法独立运行,自动识别
test_*命名的方法 - 支持
setUp()/tearDown()控制单个测试前后的准备与清理 - 运行需调用
unittest.main()或用命令行python -m unittest test_file.py
适合对标准库依赖强、或需要严格控制测试生命周期的场景,但样板代码多,参数化、跳过、标记等功能需额外写法。
pytest:简洁高效,开箱即用功能丰富
pytest 不强制继承、不强制命名规范,函数名含 test 即可被识别,断言直接用 Python 原生 assert,失败时自动显示上下文:
- 无需继承类,普通函数即可写测试(如
def test_add():) - 断言失败时输出变量值、表达式结果,调试更直观
- 内置参数化(
@pytest.mark.parametrize)、跳过(@pytest.mark.skip)、异常断言(pytest.raises) - 插件生态强大:支持 HTML 报告(pytest-html)、覆盖率(pytest-cov)、异步测试(pytest-asyncio)等
运行只需 pytest 命令,默认查找当前目录下 test_*.py 或 *_test.py 文件,支持按文件、类、方法粒度执行,例如:pytest test_math.py::test_add。
立即学习“Python免费学习笔记(深入)”;
关键差异速查表
(常见使用维度对比)
- 定义方式:unittest → 类+方法;pytest → 普通函数或类均可
-
断言语法:unittest →
self.assertXxx();pytest → 原生assert -
参数化:unittest → 需手动循环或借助
subTest;pytest →@pytest.mark.parametrize一行搞定 -
Fixtures(夹具):unittest →
setUp/tearDown作用域固定;pytest →@pytest.fixture支持函数/类/模块/会话级,且可复用、可传参 - 兼容性:pytest 可直接运行大部分 unittest 编写的测试,迁移成本低
怎么选?看团队和项目阶段
- 新项目、小团队、追求开发效率 → 优先用 pytest
- 已有大量 unittest 测试、暂无重构计划 → 继续维护,必要时用 pytest 运行
- 学习 Python 测试基础原理 → 先理解 unittest 的设计逻辑,再过渡到 pytest
- CI/CD 中需统一报告格式 → pytest + pytest-html 或 pytest-cov 更易集成
不复杂但容易忽略:哪怕只用 pytest,也建议保持测试函数职责单一、命名清晰(如 test_calculate_total_with_discount),并合理使用 fixture 封装重复逻辑。










