# pytest conftest Fixture 依赖图与 mock.patch 泄漏检测器

静态解析 conftest.py 链：渲染四级作用域（function/class/module/package/session）的 fixture 依赖图，检测更深层 conftest 覆盖关系；标记 mock.patch().start() 无 .stop() 泄漏、monkeypatch 在宽作用域 fixture 中的静默泄漏（函数级 teardown 永不执行）以及 with mock.patch 跨 yield 长期生效等跨测试状态污染。

> 标准页面: https://elysiatools.com/zh/tools/pytest-conftest-fixture-dependency-graph-and-mock-patch-leak-detector

- **分类:** Development

- **关键词:** pytest, conftest, fixture, 依赖图, mock.patch 泄漏, monkeypatch, 作用域不匹配, 会话级 fixture, 测试污染, 静态分析, Python 测试, fixture 作用域

## 概述

规则依据 pytest 官方文档：作用域序 session > package > module > class > function；宽作用域 fixture 依赖窄作用域 fixture 会在收集期抛 ScopeMismatch；同名 fixture 由更深层 conftest 覆盖（从测试向外解析，第一个命中即生效）。泄漏检测：monkeypatch/capsys/tmp_path 等内建 fixture 为函数级，其 teardown 撤销只在函数级发生——在 module/session 级 fixture 中使用会导致补丁贯穿整个会话（pytest-mock issue #84 一类问题）；patcher.start() 无对应 .stop() 时补丁存活到进程退出；with mock.patch 跨 yield 在宽作用域下意味着所有测试都看到被补丁的目标。解析器为轻量 Python 扫描器（正确处理字符串/注释/三引号），无需 Python 运行时。多文件粘贴用 “# --- file: tests/unit/conftest.py ---” 标记分隔。

## 输入项

- **Python 源码（conftest 链）** (textarea): # --- file: conftest.py --- import pytest @pytest.fixture(scope="session") def db(): yield 1 …
- **Python 文件（可选，.py/.txt）** (file)
- **图中显示内建 fixture 节点** (checkbox)

## 适用场景

- 重构多层级 conftest.py 目录结构，排查 fixture 同名覆盖与依赖层级混乱时
- 测试套件出现随机失败（Flaky tests），怀疑存在 mock 状态残留或全局 patch 污染时
- 编写 session 或 module 级夹具时，排查是否误引入函数级内建 fixture 导致 ScopeMismatch

## 工作原理

- 在输入框中粘贴 conftest 源码（多文件使用“# --- file: 路径 ---”标记分隔）或直接上传 Python 脚本文件
- 轻量静态扫描器在无需 Python 运行时的情况下提取所有 fixture 声明、调用参数、作用域及 mock 调用上下文
- 根据 pytest 官方解析规则检验作用域依赖合法性、层级覆盖判定以及未释放的 patch 资源
- 生成分层依赖 SVG 拓扑图、fixture 清单明细以及按严重等级分类的状态泄漏警告报告

## 使用案例

- 排查自动化测试在单测通过但在全量运行时因状态污染随机崩溃的问题
- 审查多层微服务测试套件中根目录与子目录 conftest.py 的 fixture 覆盖逻辑
- 在代码评审阶段静态检查 mock.patch 资源释放与 yield 上下文管理规范

## 常见问题

### 为什么在 session 或 module 级 fixture 中使用 monkeypatch 会被标记错误？

monkeypatch 是函数级 fixture，其还原机制仅在单个测试结束时触发；在宽作用域中使用会导致 patch 持续污染整个会话，引发难以排查的跨测试副作用。

### 如何在单个输入框中同时分析项目中的多层 conftest.py 文件？

在代码段之间使用注释标记区分文件路径，例如“# --- file: tests/unit/conftest.py ---”，解析器会自动按层级和就近覆盖规则分析。

### 检测器是否需要安装 pytest 依赖或连接 Python 运行环境？

不需要。检测器采用纯前端静态语法扫描，无需执行代码或配置虚拟环境即可完成依赖图构建与规则检查。

### 什么是 ScopeMismatch 错误？

当较宽作用域的 fixture（如 session/module）依赖了较窄作用域的 fixture（如 function）时，pytest 在收集阶段会直接抛出 ScopeMismatch 异常。

### mock.patch().start() 为什么会被标记为严重泄漏？

调用 patcher.start() 后若没有在 teardown 阶段显式调用 patcher.stop()，被 mock 的目标对象将一直处于被替换状态直到 Python 进程退出。

## 相关工具

- [Stryd 跑步功率临界功率 CP 与 W′bal 重建器](https://elysiatools.com/zh/tools/stryd-running-power-critical-power-and-w-prime-bal-reconstructor): 由 3 分钟全力测试、功率-时间对或距离-时间试验推导跑步临界功率 CP 与无氧做功能力 W′,再重放 Stryd 功率会话(.fit/.tcx/CSV):按 Skiba 2012 积分模型与 Froncioni/Skiba/Clarke 微分模型逐秒积分 W′bal 衰减与恢复,输出力竭时间预报、Stryd 五区间分布与功率/W′bal 双面板图。
- [可变字体轴实例与 CSS font-variation-settings 构建器](https://elysiatools.com/zh/tools/variable-font-axis-instance-and-css-font-variation-settings-builder): 上传可变字体（TTF/OTF/WOFF/WOFF2），检视 fvar 轴与命名实例，浏览器内实时预览插值效果，并生成可直接复制的 font-variation-settings CSS、高级属性等价写法与可变 @font-face 声明。
- [SQL 执行计划可视化器](https://elysiatools.com/zh/tools/sql-explain-plan-visualizer): 粘贴 EXPLAIN / EXPLAIN ANALYZE 输出（PostgreSQL/MySQL/SQLite），渲染为成本树，标注估算行数与实际行数的偏差热点，并给出具体的索引建议
- [Windows PE / Linux ELF / Mach-O 二进制头部·节表·导入导出检查器](https://elysiatools.com/zh/tools/windows-pe-linux-elf-mach-o-binary-header-section-import-export-inspector): 上传 PE-COFF（.exe/.dll）、ELF 或 Mach-O 二进制，解析 DOS/PE/COFF/可选头、ELF e_ident/程序头/节头、Mach-O 头与加载命令；输出入口点/镜像基址、节表与 RVA↔文件偏移映射、导入/导出表、动态符号与重定位，跨架构注释（x86/x86-64/ARM/AArch64/RISC-V），ASLR/NX/PIE 等安全标志徽章与前 96 字节十六进制预览。
- [APNG IDAT/fdAT 分块流式 deflate 回放与 dispose 方法帧时序分析器](https://elysiatools.com/zh/tools/apng-idat-fdat-chunk-streaming-deflate-replay-and-disposal-method-analyzer): 上传 PNG/APNG，解析动画结构：PNG 签名与逐块 CRC32 校验、IHDR（位深/颜色类型/隔行）、acTL（帧数与播放次数，必须位于首个 IDAT 之前）、fcTL（序号、区域约束 x+y+w+h ≤ 画布、delay_num/delay_den 归一化、dispose_op none/background/previous、blend_op source/over）、IDAT 首帧 + fdAT 后续帧；共享的 fcTL+fdAT 序号必须从 0 连续递增；逐帧回放 deflate 流并核对解压尺寸 = 高 × (1 + 每行字节数)，报告 zlib 损坏；dispose 语义模拟提示首帧 previous 视作 background、零延迟帧等。
- [CSV 直方图、散点图与箱线图图表工作台](https://elysiatools.com/zh/tools/csv-histogram-scatter-box-plot-chart-studio): 上传或粘贴 CSV 即刻出图：支持 Sturges / Freedman-Diaconis / Scott 分箱的直方图、带 Pearson r 与最小二乘拟合的散点图、Tukey 箱线图——每张图均可下载 PNG 与 SVG。
- [图片隐写术：嵌入与检测](https://elysiatools.com/zh/tools/image-steganography-embed-detect): 把文字藏进 PNG 的最低有效位、再原样提取，并运行 Westfeld–Pfitzmann 卡方隐写分析（含滑窗 p 曲线与 LSB 位平面预览）。
- [OCR PDF 转结构化 JSON 桥](https://elysiatools.com/zh/tools/ocr-pdf-to-structured-json-bridge): 按几何结构抽取 PDF 文本层（y 坐标分行、列间隙识表、字号识标题、冒号键值对），然后逐字段填入用户提供的 JSON Schema——标签按归一化键名匹配、值按声明类型归一化，并用 ajv 校验。

## 示例

- [无版权MP3音频样本](https://elysiatools.com/zh/samples/mp3-samples): 免费使用和测试的无版权音频样本集合，包括自然声音、冥想音乐和环境音频，适用于测试和开发目的
- [代码注释示例](https://elysiatools.com/zh/samples/code-comment-samples): 用于测试注释移除的各种注释样式代码示例文件
- [二维码示例](https://elysiatools.com/zh/samples/qrcode-samples): 用于测试二维码读取和生成工具的示例二维码图像
- [GitHub Actions Testing - CI/CD测试集成](https://elysiatools.com/zh/samples/github-actions-testing): 全面的 GitHub Actions 测试工作流，包括自动化测试、并行执行、测试报告、缓存和现代开发流水线的高级 CI/CD 模式
