# Ape 测试单独通过、一起失败：检查本地 provider 与 fixture 隔离

整理：链小知（AI 辅助）
资料核对日期：2026-10-12
引用地址：https://lianxiaozhi.com/tools/guides/ape-local-test-state-isolation
难度：进阶
核验方式：官方文档整理，未执行真实账户操作

从实际网络选择、snapshot 和高作用域 fixture 排查顺序依赖，让失败结果能对应同一套测试初始状态。

## 使用工具
- [Ape Framework](https://lianxiaozhi.com/tools/ape) · [官方入口](https://docs.apeworx.io/ape/stable/)

## 前置条件
- 准备已隔离的 Ape 测试工程、失败用例名和 ape-config 配置；依赖和编译器已经准备。
- 先读测试与 fixture，确认没有生产账户、外部请求或主动切换 provider；教程针对 Eth-Tester 本地路径。

## 1. 确认完整网络三元组

先查看 ape networks list，并把测试命令固定为 ape test --network ethereum:local:test。ethereum 是 ecosystem，local 是网络，test 是 Eth-Tester provider；省略的字段会按默认值补齐。不要仅凭命令里有 test 就认定脚本不会访问远端，继续检查 fixture 内的网络上下文。

核对结果：记录完整三元组；配置和测试代码中没有意外的 mainnet、RPC URL 或 fork 切换。
依据：[Ape：网络三元组、本地 provider 与插件](https://docs.apeworx.io/ape/stable/userguides/networks.html)
依据：[Ape：测试隔离与 fixture 生命周期](https://docs.apeworx.io/ape/stable/userguides/testing.html)

## 2. 找到改变共同基线的 fixture

打开失败用例使用的 conftest.py，列出每个合约 fixture 的 scope 和初始化操作。function 默认每次请求重新执行；session/module 等高作用域 fixture 可以将部署或初始化保留到后续测试共同基线，哪怕后面的用例没有直接引用它。

核对结果：每个部署、初始化和 scope 能对应到实际 fixture。
依据：[Ape：测试隔离与 fixture 生命周期](https://docs.apeworx.io/ape/stable/userguides/testing.html)

## 3. 核对隔离有没有被关掉

检查命令是否带 --disable-isolation，以及配置是否关闭某些 scope 的 isolation。正常情况下，每个测试前取快照，完成后恢复；关掉隔离会把前一个测试的修改留给下一个。先恢复预期的隔离设置，再观察失败是否仍和执行顺序有关。

核对结果：保存隔离开关及预期初始值；不把顺序依赖误报为合约随机错误。
依据：[Ape：测试隔离与 fixture 生命周期](https://docs.apeworx.io/ape/stable/userguides/testing.html)

## 4. 比较单用例与组合结果

在相同本地 provider 下用 ape test test_my_contract --network ethereum:local:test 选择实际用例名，再与完整本地测试结果比较。记录断言期望值、实际值及 fixture 首次激活位置；晚激活的高作用域 fixture 可能让较低作用域快照失效并重放。

核对结果：两种结果都有 provider、选中的用例、断言和 fixture 激活记录。
依据：[Ape：测试隔离与 fixture 生命周期](https://docs.apeworx.io/ape/stable/userguides/testing.html)
依据：[Ape：网络三元组、本地 provider 与插件](https://docs.apeworx.io/ape/stable/userguides/networks.html)

## 5. 按失败阶段收尾

若 provider 名不存在，先检查已安装插件与 networks list；若未编译成功，先修依赖/编译器而不要解释链状态。若组合才失败，优先改成明确的初始状态断言或合适的 function fixture。只将这套本地用例作为本地状态验证，fork 与真实网络另行评估。

核对结果：能说明失败来自连接、编译还是状态断言；修复后本地组合与单用例初始条件一致。
依据：[Ape：测试隔离与 fixture 生命周期](https://docs.apeworx.io/ape/stable/userguides/testing.html)
依据：[Ape：网络三元组、本地 provider 与插件](https://docs.apeworx.io/ape/stable/userguides/networks.html)

## 常见错误
- 高作用域 fixture 的初始化本身可以成为共同状态；默认测试隔离并不会让它消失。
- --disable-isolation 会继承前序状态；提高测试速度可能引入顺序依赖。
- local provider 参数不能拦截 Python 测试主动发起的其他网络请求。

## 完成检查
- 有完整 provider、fixture scope、隔离设置及两次测试结果记录。
- 本文核验范围为官方文档；未提供实际执行或真实网络测试证明。

## 相关知识

## 官方依据
- [Ape：网络三元组、本地 provider 与插件](https://docs.apeworx.io/ape/stable/userguides/networks.html)
- [Ape：测试隔离与 fixture 生命周期](https://docs.apeworx.io/ape/stable/userguides/testing.html)
