ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Truffle测试实战:如何用Mocha+Chai自动化测试你的智能合约

Truffle测试实战:如何用Mocha+Chai自动化测试你的智能合约 Truffle测试实战如何用MochaChai自动化测试你的智能合约【免费下载链接】truffle:warning: The Truffle Suite is being sunset. For information on ongoing support, migration options and FAQs, visit the Consensys blog. Thank you for all the support over the years.项目地址: https://gitcode.com/gh_mirrors/tr/truffleTruffle 内置的测试框架让智能合约测试变得极其简单——基于 Mocha Chai一条truffle test命令即可自动部署合约并运行全部断言。本文面向新手手把手带你掌握 Truffle 测试的完整流程搭建测试文件、编写用例、断言交易结果、验证事件发射并理解快照回滚带来的加速原理。1. 为什么选择 Truffle 测试在传统 Web3 开发中测试一个智能合约通常需要手动部署、手动调用 RPC、手动比对返回值。Truffle 把这些工作压缩成三件事能力说明 自动部署运行测试前自动执行迁移脚本合约处于刚部署的干净状态 开箱即用的断言全局注入assertChai和artifacts.require直接调用⚡ 快照加速支持evm_snapshot的链如 Ganache自动快照回滚测试之间零等待 事件解码测试失败时自动打印该测试期间发射的所有事件调试事半功倍Truffle Dashboard 也能为你的本地链提供可视化的交易签名与参数解码能力2. 一键开始最小化测试步骤最快配置方法其实只有三步在项目中创建test/目录放入.js测试文件文件名以.js结尾即可被truffle test识别用artifacts.require引入合约执行命令truffle test一个经典的 MetaCoin 用例可以直接参考仓库中的示例文件 metacoin.jsvar MetaCoin artifacts.require(./MetaCoin.sol); contract(MetaCoin, function (accounts) { it(should put 10000 MetaCoin in the first account, async function () { const instance await MetaCoin.deployed(); const balance await instance.getBalance.call(accounts[0]); assert.equal(balance.valueOf(), 10000, 初始余额不是 10000); }); });关键点解读contract(合约名, 回调)是 Truffle 注入的全局函数回调自动接收accounts账户数组.call()只读不转账不产生 Gas直接调用如sendCoin则发起真实交易assert.equal即 Chai 断言最后传入的字符串是失败时的提示语3. 常见测试套路清单3.1 验证状态变更转账类测试先记录初始值 → 发起交易 → 再读最终值 → 断言差值仓库示例见 metacoin.jsit(should send coin correctly, async function () { const meta await MetaCoin.deployed(); const start (await meta.getBalance.call(accounts[0])).toNumber(); await meta.sendCoin(accounts[1], 10, { from: accounts[0] }); const end (await meta.getBalance.call(accounts[0])).toNumber(); assert.equal(end, start - 10, 发送方余额应减少 10); });3.2 验证异常回滚用 Chai 的assert.isRejected或throws断言非法操作必须失败it(should revert on invalid recipient, async function () { const meta await MetaCoin.deployed(); assert.isRejected(meta.sendCoin(0x0000, 1, { from: accounts[0] })); });3.3 测试前准备before/afterEach标准 Mocha 钩子均可使用例如统一用before做数据初始化beforeEach中重置测试数据。超时时间也可在配置中调整——Truffle 默认before超时 120 秒、单测 300 秒见 TestRunner.ts。4. 失败时如何读日志自动事件解码当某个用例失败Truffle 会调用endTest逻辑自动扫描该测试起始区块之后的日志并解码输出Events emitted during test:→ 逐条打印事件名与参数这一能力由 TestRunner.ts 实现配合--show-events选项还可以在通过时也打印事件。看不懂日志时Truffle Dashboard 的前后对比视图能帮你把裸字节解码为可读参数5. 性能原理快照回滚机制truffle test并非每个用例都重新部署。测试框架在初始化时执行evm_snapshot打快照每个用例结束后evm_revert回滚到初始状态见 TestRunner.ts。因此支持快照的本地链Ganache、Hardhat Network一次部署全程秒级不支持快照的网络自动退化为每次重新迁移部署6. 上手检查清单✅ 测试文件放在test/目录命名为*.js或*.ts✅ 用artifacts.require而非手动读 build 目录✅ 只读操作一律加.call()避免无谓 Gas✅ 断言附带中文提示语失败日志一目了然✅ 在本地测试网develop网络运行享受快照加速⚠️ 提示Truffle Suite 已进入维护/退役阶段见仓库首页说明新项目建议评估迁移方案但已有的 Truffle 项目本文的 MochaChai 测试模式依然完全适用。核心模块路径速查测试框架实现packages/test/src/TestRunner.ts测试入口导出packages/test/src/index.ts断言工具packages/expect/src/index.ts完整测试示例packages/truffle/test/sources/external_compile/test/metacoin.js【免费下载链接】truffle:warning: The Truffle Suite is being sunset. For information on ongoing support, migration options and FAQs, visit the Consensys blog. Thank you for all the support over the years.项目地址: https://gitcode.com/gh_mirrors/tr/truffle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表