Foundry测试怎么用:命令、配置与编写约定的速查手册
第一次跑 Foundry 测试的人最常问的就是「这工具到底怎么用」。本文围绕 Foundry测试怎么用这个问题,把命令、配置、测试文件三件事一次说清,让你跑通第一份测试不再卡壳。完整学习路径请见 Foundry测试入门指南。
一、forge 命令清单
开发期最常用的几条:
forge build:编译所有合约forge test:跑全部测试forge test -vv:打印 console.logforge test --match-test test_Increment:只跑匹配名字的测试forge test --gas-report:跑完输出 Gas 报告forge coverage:行覆盖率forge fmt:格式化 Solidity 代码
这些命令记不住没关系,写进 Makefile 或 package.json scripts 即可。这一约定与 Foundry测试最佳实践 推荐保持一致。
二、foundry.toml 配置核心字段
foundry.toml 是 Foundry 的中枢配置:
[profile.default]:默认配置src/out/libs:源码、产物、依赖目录solc_version:Solidity 版本optimizer与optimizer_runs:优化配置fuzz.runs:fuzz 运行次数(默认 256)invariant.runs:不变量测试运行次数eth_rpc_url:分叉测试默认节点
每个字段都有明确含义,必要时可以参考 Foundry测试官方文档。
三、测试文件命名约定
- 测试文件后缀
.t.sol,例如Counter.t.sol - 测试合约继承
forge-std/Test.sol中的Test - 测试函数以
test开头,fuzz 测试以testFuzz_开头 - 应当失败的测试用
testFail_前缀 setUp()函数在每个测试运行前调用
这种命名约定让 forge 能自动发现并分类测试,无需额外注册。
四、断言库与 cheatcodes
断言库由 forge-std 提供:
assertEq(a, b):相等断言assertGt/assertLt/assertGe/assertLeassertTrue/assertFalseassertApproxEqAbs/assertApproxEqRel:近似断言
cheatcodes 控制环境:
vm.prank模拟发送者vm.warp跳时间vm.deal改余额vm.expectRevert断言回退vm.expectEmit断言事件
这套 API 是 Foundry测试中文文档 翻译版重点讲解的内容。
五、fuzz 测试的写法
声明测试函数参数即开启 fuzz:
function testFuzz_Deposit(uint256 amount)- 用
vm.assume(amount > 0 && amount < 1e30)过滤 - 或用
bound(amount, 1, 1e18)把输入约束到合理范围 - 在 foundry.toml 的
[fuzz]section 调整 runs 值
fuzz 是 Foundry 最强大的能力之一,使用时建议把输入范围控制得贴近真实业务场景。
六、分叉测试操作
分叉测试让你能直接在主网/币安智能链状态下跑用例:
- 在 foundry.toml 配置
eth_rpc_url - 在测试中
vm.createSelectFork(rpc_url, blockNumber) - 或在命令行用
--fork-url一次性指定
这种模式特别适合复现线上事故,配合 Foundry测试漏洞案例 一起阅读效果更好。
七、与 Hardhat 协作
大型项目常常同时用:
- Foundry 跑测试,Hardhat 跑部署
- 共享 ABI 与 deployments 目录
- CI 中并行执行两套流程
八、币安智能链测试注意事项
BNB Chain 上的 Foundry 测试有几个细节:
- 分叉 URL 用付费节点防限流
- gas price 在分叉测试中以真实链为准
- 中文社区有详细配置范例
按上述命令、配置、约定三件事走一遍,Foundry 测试就能在你的项目中跑起来。掌握速查手册后,剩下的就是慢慢深入 cheatcodes 与 fuzz 的高级用法,让测试从「能跑」走向「跑得专业」。