跳到正文
← 使用教程

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 测试主动发起的其他网络请求。

本教程根据官方资料整理,尚未完成逐步操作验收。界面、支持范围及费用变化时,先核对官方说明。 纯文本版 · 提交纠错依据