ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

3步搞定ibc-go测试:Testing测试框架与E2E端到端测试实战指南

3步搞定ibc-go测试:Testing测试框架与E2E端到端测试实战指南 3步搞定ibc-go测试Testing测试框架与E2E端到端测试实战指南【免费下载链接】ibc-goInter-Blockchain Communication Protocol (IBC) implementation in Golang.项目地址: https://gitcode.com/gh_mirrors/ib/ibc-go 想快速掌握ibc-go 测试吗本文带你用3步上手先认识 ibc-go 官方testing 测试框架coordinator / chain / path / endpoint 四层结构再写第一个链间通信单元测试最后跑通E2E 端到端测试Docker 多链 中继器真实转账。新手友好无需深入源码上图ibc-go 中 IBC 数据包packet在两条链之间的发送、接收与确认ack流程——这正是 ibc-go 测试要模拟的核心场景。 第1步认识 ibc-go 的 Testing 测试框架ibc-go 的单元测试框架位于仓库的testing/目录官方说明见 testing/README.md。它由4 个组件构成一个测试栈从上到下分别是组件核心文件职责一句话记忆Coordinator 协调器testing/coordinator.go管理 N 条测试链统一全局时钟负责两条链之间 client / connection / channel 的基础搭建TestChain 测试链testing/chain.go一条模拟链内含 TestingApp负责生产区块、处理 SDK 消息Path 路径testing/path.go连接两个 endpoint 的通道负责在两端之间中继relay数据包Endpoint 端点testing/endpoint.go某条链上的一个 channel 端点含关联的 client 与 connection可发送、接收、确认数据包官方 README 里有一句经典的分工总结背下来就够了endpoint用于在 IBC 连接的一侧执行初始化与 IBC 逻辑path用于中继数据包chain用于提交 SDK 消息coordinator用于在两条链之间搭建一条 path 关键细节Coordinator 会维护一个全局时间每次 Commit 后通过IncrementTime()给所有链统一加 5 秒见testing/coordinator.go中的TimeIncrement这样就不会出现对端链的时间跑到未来这类棘手问题。 第2步写一个 ibc-go 单元测试3 个 API 就够把框架接入你的测试官方推荐三步走完整示例见 testing/README.md 的Integration与Example章节让你的应用实现TestingApp接口补齐GetBaseApp()、GetIBCKeeper()、GetTxConfig()等访问器参考testing/simapp/app.go提供一个初始化函数并赋值给ibctesting.DefaultTestingAppInit见testing/testing_app.go中的AppCreator在测试套件中搭链、建路、发包。核心套路只有三行Go testify suite 风格// ① 创建协调器 2 条测试链 suite.coordinator ibctesting.NewCoordinator(suite.T(), 2) suite.chainA suite.coordinator.GetChain(ibctesting.GetChainID(1)) suite.chainB suite.coordinator.GetChain(ibctesting.GetChainID(2)) // ② 建 path 并一键搭好 client / connection / channel path : ibctesting.NewPath(suite.chainA, suite.chainB) suite.coordinator.Setup(path) // ③ 发送 → 接收 → 确认或直接用 path.RelayPacket 中继 seq, err : path.EndpointA.SendPacket(timeoutHeight, timeoutTimestamp, data) path.EndpointB.RecvPacket(packet) path.EndpointA.AcknowledgePacket(packet, ack)coordinator.Setup(path)之所以强大是因为Path提供了分级的 Setup 方法你可以按需只搭一半定义在testing/path.goSetup()→ client connection channel 全搭好SetupClients()→ 只搭 clientSetupConnections()→ 只搭 client connection 测试中间件时还有神器testing/mock/目录提供了MockIBCApp它的每个 IBC 回调都是可替换的函数字段你可以单独改写某个回调来验证底层 app 不应影响 OnChanOpenTry 的结果之类的断言详见 testing/README.md 的Middleware Testing章节。上图ibc-go 的中间件栈结构。测试中间件时就是用 mock 模块模拟栈中的底层 app逐层验证回调行为。 第3步跑通 E2E 端到端测试Docker 多链 真实转账单元测试验证逻辑E2E 测试则验证真实世界它在 Docker 容器里拉起多条真实的 simd 链和中继器基于 interchaintest 框架执行完整的转账、升级、参数变更等流程。所有代码集中在e2e/目录官方指南见 e2e/README.md。目录结构速览目录 / 文件作用e2e/testsuite/E2ETestSuite基类封装建链、建路径、钱包、中继器等大量辅助方法核心e2e/testsuite/testsuite.goe2e/tests/按模块组织的测试用例transfer/、interchain_accounts/、packet_forward_middleware/、rate_limiting/、upgrades/等e2e/Makefilemake e2e-test/make e2e-suite入口e2e/sample.config.yaml最小配置文件链的 tag、chainId 等e2e/relayer/中继器Go / Hermes封装3 条命令从零跑起来# ① 配置把示例配置放到默认位置或自行修改 cp e2e/sample.config.yaml ~/.ibc-go-e2e-config.yaml # ② 跑单个测试entrypoint 为套件入口函数test 为具体测试方法 make e2e-test entrypointTestInterchainAccountsTestSuite testTestMsgSubmitTx_SuccessfulTransfer # ③ 跑整个套件 make e2e-suite entrypointTestTransferTestSuite 小技巧装了jq可以只写test再装fzf则直接make e2e-test进入交互式选测试配置文件默认在~/.ibc-go-e2e-config.yaml也可用环境变量E2E_CONFIG_PATH指定方便在 IDE 里跑本地跑 E2E不会向任何镜像仓库推送镜像镜像只存在本地。一个真实用例长什么样看e2e/tests/transfer/send_receive_test.go里的TransferTestSuiteSendReceivefunc (s *TransferTestSuiteSendReceive) SetupSuite() { // 套件级建链2 条链 1 个中继器注意是 SetupSuite 而非 SetupTest s.SetupChains(context.TODO(), 2, nil, func(o *testsuite.ChainOptions) { o.RelayerCount 1 }) }测试里则是标准的建路径 → 创建钱包 → 发转账 → 启动中继 → 断言到账流程s.CreatePaths(ibc.DefaultClientOpts(), s.TransferChannelOptions(), testName) transferTxResp : s.Transfer(ctx, chainB, chainBWallet, portID, channelID, amount, from, to, ...) s.AssertTxSuccess(transferTxResp) s.StartRelayer(relayer, testName) // 启动中继器 s.AssertPacketRelayed(ctx, chainA, portID, channelID, 1) // 断言包已中继、余额已变化编写 E2E 测试的 3 个规范文件命名新测试放e2e/tests/下文件名遵循module_name_test.go构建约束新文件必须加//go:build !test_e2e避免被本地make test误编译每个现有文件都有何时用t.Parallel()当测试会修改全链状态如 gov 提案改参数、重启链、或断言可能受其他测试影响时不要并行——E2E 套件在SetupSuite里建链、由每个测试自己建路径正是为了最大化并行安全。️ 排坑小抄Troubleshooting症状原因解决办法Mac 上容器反复超时Docker 状态累积异常docker system prune -af清理后重启 Docker本地想改 interchaintest 源码依赖的是发布版在e2e/go.mod加replace github.com/cosmos/interchaintest ../../interchaintest想知道 CI 会跑哪些测试矩阵是动态生成的本地执行go run cmd/build_test_matrix/main.go \| jqPR 上 E2E 不跑未标记 R4R标记 Ready for Review 后 E2E 才会触发 总结3步清单步骤做什么关键位置① 认框架coordinator → chain → path → endpoint 四层栈testing/② 写单测实现TestingApp→ 建 2 条链 →Setup(path)→ 发包断言testing/README.md③ 跑 E2E配置~/.ibc-go-e2e-config.yaml→make e2e-test/e2e-suitee2e/README.md单元测试用testing 框架保证逻辑正确E2E 测试用真实容器链保证集成可靠——两套工具组合拳就是你的 ibc-go 测试基本功。 祝测试全绿【免费下载链接】ibc-goInter-Blockchain Communication Protocol (IBC) implementation in Golang.项目地址: https://gitcode.com/gh_mirrors/ib/ibc-go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表