monkeypatch 是什么
monkeypatch 是 pytest 的内置夹具:在用例范围内临时替换属性、字典项与环境变量,用例结束后自动还原,用来隔离时间、网络地址与外部依赖。替换范围随用例生命周期回收,不需要手工写清理代码。
基本信息
| 类型 | pytest 内置夹具,用例级生效 |
|---|---|
| 常用方法 | setattr、setenv、delenv、setitem、delitem、chdir |
| 还原方式 | 用例结束自动还原,无需 teardown 代码 |
| 替换目标 | 用模块路径字符串定位,避免提前导入导致错位 |
| 与 mock 的关系 | 擅长替换值与环境;复杂行为打桩常配 mocker 使用 |
替换示例
替换示例
def test_api_url(monkeypatch):
# 替换环境变量,用例结束自动还原
monkeypatch.setenv("API_URL", "http://localhost:9999")
# 用字符串路径替换属性,避免提前导入
monkeypatch.setattr("app.client.TIMEOUT", 0.1)
# 断言必须写在同一用例内
assert read_api_url() == "http://localhost:9999"
assert app.client.TIMEOUT == 0.1典型使用场景
- 环境隔离:临时改环境变量,验证不同配置分支。
- 时间与超时:缩短超时阈值,快速验证重试逻辑。
- 地址替换:把外部服务指向本地桩,避免真实调用。
- 字典与配置:临时覆盖配置表项,验证默认值与回退。
- 工作目录:切换目录验证相对路径相关行为。
- 文件路径:配合 tmp_path 把落盘位置指到临时目录。
常用方法速览
| 方法 | 用途 | 示例目标 |
|---|---|---|
| setenv | 环境变量 | 切换配置分支 |
| setattr | 属性替换 | 缩短超时、换地址 |
| setitem | 字典项 | 覆盖配置表 |
| chdir | 工作目录 | 验证相对路径 |
与配置相关的用例要在本地与 CI 都能跑:替换值不要依赖本机既有环境,显式给定才能复现。
setattr 用「模块路径字符串」形式,避免提前导入导致替换目标错位。
替换的是「使用方的引用」:from x import y 之后要替换使用方模块里的 y,而不是 x.y。
依赖替换值的断言必须写在同一个用例内,结束后替换即失效。
替换范围尽量小:只动用例真正依赖的那一项,替换面越大,用例与实现耦合越深。