pytest-mock:让 Python 测试中的 mock 更优雅
pytest-mock:让 Python 测试中的 mock 更优雅
写 Python 测试时,mock 几乎是个绕不开的话题。用 pytest 做测试框架的项目,虽然标准库 unittest.mock 提供了完整的 mock 能力,但每次都要手动 import、手动 cleanup,代码里全是 setup 和 teardown,看着就累。
pytest-mock 就是专门解决这个痛点的。它是 pytest 官方生态下的一个插件,GitHub 上 2000 多 Star。核心思路很直接:把 mock 整合进 pytest 的 fixture 体系,让创建、使用和清理变得自然流畅。

一个 fixture 搞定所有 mock
熟悉 pytest 的人都知道,fixture 是它最具特色的设计。pytest-mock 提供的 mocker fixture,几乎把 mock 相关的操作都封装好了。
import os
class UnixFS:
@staticmethod
def rm(filename):
os.remove(filename)
def test_unix_fs(mocker):
mocker.patch('os.remove')
UnixFS.rm('file')
os.remove.assert_called_once_with('file')
测试函数直接传 mocker 参数,用它来 patch。测试结束后 mock 自动清理,不用手动写 stopall。代码简洁了不少,也少了一些容易漏掉的清理步骤。
对比传统写法,不用 mocker fixture 时,需要在 setup 方法里写 patcher、在 teardown 里写 stop,一个不留神就漏了。用 mocker 之后,这些都不需要操心,fixture 的生命周期帮你全管了。
不只是 patch
除了 mock.patch,pytest-mock 还封装了 spy 和 stub。
spy 用来监控已有方法的调用情况。和 patch 不同,spy 不修改方法行为,只是记录调用次数、参数和返回值。适合只想做断言检查、不想改变方法逻辑的场景。
stub 则是 mock 的简化版,直接生成一个什么都不做的替身。不需要配置返回值,不需要定义行为逻辑,适合测试中只需要填充参数的地方。

项目还利用了 pytest 的内省能力。mock 断言失败时,pytest 会展示更清晰的差异对比,快速定位断言失败的原因。
小工具解决大问题
pytest-mock 做的事情不多,但它把测试中一个高频痛点处理得很干净。不需要学习新的 mock 框架,不需要改现有测试结构,装好插件就能用。安装就是一行 pip,加到 pytest 插件列表就能立即生效。
对于用 pytest 的团队来说,这是个值得加进项目依赖的工具。它不会改变测试的写法,只是让 mock 的过程少了一些样板代码。
这是个值得加进项目依赖的工具。它不会改变测试的写法,只是让 mock 的过程少了一些样板代码。
更多推荐

所有评论(0)