ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

fuels-rs智能合约测试实战:setup_program_test!宏与本地测试链完全指南

fuels-rs智能合约测试实战:setup_program_test!宏与本地测试链完全指南 fuels-rs智能合约测试实战:setup_program_test!宏与本地测试链完全指南【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rsfuels-rs 是 Fuel Network 官方 Rust SDK也是开发 Fuel 智能合约的首选工具。本文带你实战setup_program_test!宏一行声明即可启动本地测试链、批量创建钱包、自动生成合约绑定并一键部署彻底告别繁琐的测试样板代码。无论你是 Rust 新手还是 Sway 开发者跟着本文 5 分钟就能跑通第一个智能合约测试 为什么智能合约测试需要本地测试链智能合约一旦部署到主网就难以回滚因此上线前必须在隔离环境里反复验证。fuels-rs 为此内置了本地测试链in-process 启动一个真实的 fuel-core 节点每个测试函数都能获得一条干净、互不干扰的链无需手动安装、启动节点测试进程内自动拉起钱包、代币余额由测试助手自动配置测试结束后链即销毁零状态残留本地节点的核心实现在 packages/fuels-test-helpers/src/service.rs它负责根据NodeConfig、ChainConfig、StateConfig三份配置启动节点并暴露本地地址。 传统写法需要手动FuelService::start→Provider::from→Contract::load_from→deploy一大串步骤。setup_program_test!宏把它们全部压缩成了声明式的一小段代码。快速上手5 行代码完成合约测试setup_program_test!宏接受COMMAND(ARG...)...形式的输入内置 5 个命令命令作用示例Wallets启动本地 provider 并生成 N 个测试钱包Wallets(wallet)Abigen从已编译的 Sway 项目生成 Rust 绑定Abigen(Contract(name MyContract, project ...))Deploy用指定钱包部署合约创建可调用实例Deploy(name inst, contract MyContract, wallet wallet)LoadScript加载脚本实例LoadScript(name s, script MyScript, wallet wallet)Options设置构建 profilerelease默认 /debugOptions(profile debug)完整命令语法见官方文档 docs/src/testing/the-setup-program-test-macro.md。一个最小可用的合约测试长这样摘自 examples/contracts/src/lib.rssetup_program_test!( Wallets(wallet), Abigen(Contract( name TestContract, project e2e/sway/contracts/contract_test )), Deploy( name contract_instance, contract TestContract, wallet wallet ), ); // 直接调用合约方法并断言结果 let response contract_instance .methods() .initialize_counter(42) .call() .await?; assert_eq!(42, response.value);宏会自动生成名为wallet、TestContract、contract_instance的 Rust 变量测试体里像普通结构体一样使用即可。进阶玩法多合约部署与手动钱包一条链上部署多个合约Deploy命令支持带random_salt参数。由于盐值不同同一份合约可以重复部署为多个不同 ID 的实例非常适合测试合约间互调场景。e2e 测试 e2e/tests/contracts.rs 中就有真实案例setup_program_test!( Wallets(wallet), Abigen( Contract(name LibContract, project e2e/sway/contracts/lib_contract), Contract(name LibContractCaller, project e2e/sway/contracts/lib_contract_caller), ), Deploy(name lib_contract_instance, contract LibContract, wallet wallet, random_salt false), Deploy(name contract_caller_instance, contract LibContractCaller, wallet wallet), Deploy(name contract_caller_instance2, contract LibContractCaller, wallet wallet), ); // 盐值部署保证两次部署的合约 ID 不同 assert_ne!(contract_caller_instance.contract_id(), contract_caller_instance2.contract_id());两个 caller 实例可以互相调用同一个lib_contract_instance全部运行在同一条本地测试链上。手动创建钱包再交给宏如果需要自定义余额、初始链状态可以先手动启动 provider 拿到钱包再让宏只负责 Abigen 和 Deploylet config WalletsConfig::new(Some(2), Some(1), Some(DEFAULT_COIN_AMOUNT)); let mut wallets launch_custom_provider_and_get_wallets(config, None, None).await?; let wallet wallets.pop().unwrap(); setup_program_test!( Abigen(Contract(name TestContract, project e2e/sway/contracts/contract_test)), Deploy(name contract_instance, contract TestContract, wallet wallet, random_salt false), );⚠️ 前提Abigen引用的 Sway 项目必须已经用forc build --release编译过宏会直接读取out/release/下的 ABI 与二进制文件。宏背后发生了什么setup_program_test!是一个编译期 proc-macro。解析逻辑位于 packages/fuels-macros/src/setup_program_test/parsing.rs代码生成逻辑位于 packages/fuels-macros/src/setup_program_test/code_gen.rs。它按顺序展开为四段代码Abigen—— 加载各项目的-abi.json生成类型安全的methods()绑定Wallets—— 调用launch_custom_provider_and_get_wallets启动本地链并分发钱包Deploy—— 按 salt 加载.bin、执行deploy_if_not_exists、构造合约实例LoadScript—— 构造脚本实例也就是说宏展开后与你手写的那套长代码完全等价只是写起来短得多、也不容易写错。如何组织你的测试项目fuels-rs 自身采用一个测试分类 一个.rs文件 对应 Sway 目录的结构分类包括contracts、predicates、scripts、types、wallets等规范见 docs/src/contributing/tests-structure.md。其 e2e 目录下 Sway 合约示例分布在 e2e/sway/contracts/可以直接参考其中contract_test、storage、liquidity_pool等小项目。断言方面遵循 docs/src/testing/basics.md 的约定用assert!/assert_eq!/assert_ne!校验结果用println!输出调试信息。运行命令# 正常运行测试 cargo test # 查看测试中的打印输出 cargo test -- --nocapture常见问题速查宏报错 unable to canonicalize forc project pathproject路径写错或忘记先执行forc build --release编译 Sway 项目想调试 Sway 项目编译产物把Options(profile debug)加进宏宏会读取out/debug/下的产物两个部署实例 ID 相同导致冲突给Deploy加上默认开启的随机盐值random_salt false才会固定为[0; 32]想让某函数只连接已有节点不用宏改用Provider::connect(url)手动创建实例即可总结setup_program_test!宏把 Fuel 智能合约测试中最枯燥的三件事——起本地测试链、造钱包、部署合约——变成了一段声明式配置能力对应命令收益启动本地测试链 钱包Wallets零基础设施测试自动隔离生成类型安全绑定Abigen编译期发现 ABI 不匹配一键部署合约/脚本Deploy/LoadScript支持盐值多实例部署从 examples/contracts/src/lib.rs 的完整示例出发配合 e2e/tests/ 里的端到端用例你就能快速建立起一套健壮的 Fuel 智能合约测试体系。祝编码愉快 【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表