pytest:把 Python 测试写简单点

pytest 是 Python 社区最主流的测试框架之一,GitHub Star 数达到 13,913。由 pytest-dev 组织维护,项目定位很清晰:写小测试要简单,支撑复杂功能测试也要稳定。

正文顶部截图

assert 直接写

很多测试框架要求你背一堆断言方法名,assertEqual、assertTrue、assertRaises 之类的。pytest 的做法是直接用原生 assert,框架底层做断言内省。测试失败时,它能展开变量值、调用链和上下文,定位问题很直观。

看一个例子:

def inc(x):
    return x + 1

def test_answer():
    assert inc(3) == 5

运行 pytest,输出会明确报出 assert 4 == 5,以及 4 = inc(3) 这个推导过程。不需要额外配置,开箱就有这个效果。

README区域截图

自动发现测试文件

pytest 会按约定自动扫描项目中的测试模块和函数,不需要手动注册。只要文件以 test_ 开头、函数名以 test_ 开头,就能被自动收集。对于大型项目,这个特性省下了不少配置和维护的工作量。

Fixtures 管理测试资源

测试经常需要一些前置资源,比如数据库连接、临时目录、配置对象。pytest 的 fixture 机制把这些资源抽象成可复用组件,按需注入测试函数。fixture 支持参数化,也支持作用域控制,可以在多个测试间共享同一个实例,也能每个测试单独创建。这种设计让测试代码更容易复用和组织。

兼容 unittest 迁移无压力

如果你之前用 Python 标准库的 unittest 写了大量测试,想切换到 pytest,不用重写。pytest 能直接运行 unittest 的测试用例,包括 setUp、tearDown 这些生命周期方法都能识别。渐进式迁移完全可行,团队可以边用边切。

1300 多个插件覆盖各种场景

pytest 的插件架构很开放,社区贡献了 1300 多个外部插件。常见的场景都有覆盖:Django 和 Flask 的测试集成、并行执行加速、覆盖率统计、生成 HTML 测试报告等。遇到特定需求时,先搜插件往往比自己写更快。

适合谁用

pytest 支持 Python 3.10+ 和 PyPy3。个人项目用它写第一个测试几分钟就能跑起来;团队项目里,CI/CD 流水线集成也很顺畅。对于已有 unittest 基线的团队,可以渐进式迁移,不用一次性推翻重来。

这个项目专注于测试的核心环节,把断言内省、自动发现、fixture 这些基础能力做扎实了。如果你用 Python 做开发,这工具值得放进日常工具箱。

ture 这些基础能力做扎实了。如果你用 Python 做开发,这工具值得放进日常工具箱。

更多推荐