Python单元测试怎么写_unittest与pytest对比

4次阅读

python单元测试主流选pytest,因其简洁灵活、功能丰富;unittest是标准库框架,结构严谨但样板代码多。两者在定义方式、断言、参数化、fixtures等方面差异显著,新项目优先选pytest,旧项目可兼容运行。

python单元测试主要用 unittestpytest 两种框架,前者是标准库自带、风格偏“类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 封装重复逻辑。

text=ZqhQzanResources