首页/开发/软件测试速查/pytest monkeypatch 临时替换
自动化测试66 条

pytest monkeypatch 临时替换

monkeypatch 夹具在用例范围内临时替换属性、字典项与环境变量,用例结束后自动还原;适合隔离时间、网络地址与外部依赖。

软件测试速查开发更新于 2026-10-13

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。
依赖替换值的断言必须写在同一个用例内,结束后替换即失效。
替换范围尽量小:只动用例真正依赖的那一项,替换面越大,用例与实现耦合越深。

易错点

  • 手工修改全局状态后还原遗漏,影响后续用例
  • 对已导入对象的副本做替换,实际调用路径并未被改写
  • 环境变量改动不走 monkeypatch,遗留污染让 CI 上其他用例随机失败
  • 替换只做在测试模块的本地引用上,被测代码仍走真实依赖,形成假隔离
  • 替换值类型与被替换项不一致,运行期报错掩盖用例逻辑本身的缺陷

数据来源与参考

  • pytest 官方文档:Monkeypatching/mocking modules and environments
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌