pytest:Python 测试框架里最舒服的那个

做 Python 开发,测试绕不开。不管你写的是小脚本还是大型项目,总得验证代码跑得对不对。Python 自带的 unittest 能用,但写起来有点啰嗦,光那个 self.assertEqual 就够烦的。pytest 就是来解决这个问题的,13900 多个 Star,Python 测试领域的事实标准。

正文顶部截图

写测试最大的痛点是什么

用 unittest 写过测试的人都知道,断言失败的时候报错信息经常看不懂。哪里不对、实际值是多少、期望值是多少,得自己去翻。pytest 在这方面做了很聪明的事:你直接用 Python 自带的 assert 就行,它会自动分析失败原因,把细节全展示出来。

比如你写了一个加法函数,测试 assert inc(3) == 5 失败了,pytest 会告诉你 4 == 5,还标出 where 4 = inc(3)。哪一行出的问题,实际算出来是多少,一目了然。

自动发现测试文件

pytest 不需要你手动注册测试文件,它会自动扫描项目目录里所有 test_ 开头的文件和函数。你只管写测试,运行 pytest 命令就行,它帮你把能跑的全找出来。

这个特性看着简单,但省了不少事。项目大了以后,几十个测试文件散落在不同目录,手动管理太累了。

Fixture 管理测试资源

测试经常需要准备数据、连接数据库、创建临时文件这些前置操作。pytest 的 Fixture 机制专门处理这类需求,通过装饰器声明,用起来很灵活。

你可以让 Fixture 在每个测试函数执行前都跑一遍,也可以限定只在某个模块或整个测试会话中执行一次。比如数据库连接这种重量级资源,只在会话级别创建一次就行了,不用每个测试都连一遍。

插件生态

pytest 自身是个轻量核心,大部分功能靠插件实现。目前已知的第三方插件超过 1300 个,覆盖代码覆盖率统计、并行执行、参数化测试等各种需求。

这个插件架构是 pytest 能长久保持活力的关键。核心保持简洁,社区根据实际需要扩展功能,各取所需。

README区域截图

兼容 unittest

如果你的项目已经有一堆 unittest 写的测试,迁移成本很低。pytest 可以直接运行 unittest 测试套件,不需要改任何代码。先用 pytest 跑起来,后续再逐步重写成 pytest 风格就行。

什么项目适合用

基本上所有 Python 项目都适合。新项目直接用 pytest,省心。老项目如果有 unittest 测试,也能无缝切换。项目需要 Python 3.10 以上版本,或者 PyPy3。

pytest 能处理小项目里几个函数的简单测试,也能支撑大型项目复杂的集成测试场景。这种从简单到复杂的平滑过渡,是它受欢迎的重要原因。

总的来说,pytest 把写测试这件事变得简单了。不需要记一堆 API,不需要复杂的配置,assert 加上几个装饰器就能把测试写好。如果你还在纠结用什么测试框架,pytest 就是答案。

加上几个装饰器就能把测试写好。如果你还在纠结用什么测试框架,pytest 就是答案。

更多推荐