Ape 测试单独通过、一起失败:检查本地 provider 与 fixture 隔离
链小知 · 进阶 · 核验 · 依官方文档整理
从实际网络选择、snapshot 和高作用域 fixture 排查顺序依赖,让失败结果能对应同一套测试初始状态。
开始前准备
- 准备已隔离的 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 切换。
2. 找到改变共同基线的 fixture
打开失败用例使用的 conftest.py,列出每个合约 fixture 的 scope 和初始化操作。function 默认每次请求重新执行;session/module 等高作用域 fixture 可以将部署或初始化保留到后续测试共同基线,哪怕后面的用例没有直接引用它。
检查结果:每个部署、初始化和 scope 能对应到实际 fixture。
3. 核对隔离有没有被关掉
检查命令是否带 --disable-isolation,以及配置是否关闭某些 scope 的 isolation。正常情况下,每个测试前取快照,完成后恢复;关掉隔离会把前一个测试的修改留给下一个。先恢复预期的隔离设置,再观察失败是否仍和执行顺序有关。
检查结果:保存隔离开关及预期初始值;不把顺序依赖误报为合约随机错误。
4. 比较单用例与组合结果
在相同本地 provider 下用 ape test test_my_contract --network ethereum:local:test 选择实际用例名,再与完整本地测试结果比较。记录断言期望值、实际值及 fixture 首次激活位置;晚激活的高作用域 fixture 可能让较低作用域快照失效并重放。
检查结果:两种结果都有 provider、选中的用例、断言和 fixture 激活记录。
5. 按失败阶段收尾
若 provider 名不存在,先检查已安装插件与 networks list;若未编译成功,先修依赖/编译器而不要解释链状态。若组合才失败,优先改成明确的初始状态断言或合适的 function fixture。只将这套本地用例作为本地状态验证,fork 与真实网络另行评估。
检查结果:能说明失败来自连接、编译还是状态断言;修复后本地组合与单用例初始条件一致。
怎样确认完成
- 有完整 provider、fixture scope、隔离设置及两次测试结果记录。
- 本文核验范围为官方文档;未提供实际执行或真实网络测试证明。
常见错误与边界
- 高作用域 fixture 的初始化本身可以成为共同状态;默认测试隔离并不会让它消失。
- --disable-isolation 会继承前序状态;提高测试速度可能引入顺序依赖。
- local provider 参数不能拦截 Python 测试主动发起的其他网络请求。