先定义系统保证,再写测试
好的测试描述系统在什么条件下必须成立,而不是把实现代码换一种写法再算一遍。

- 先写最小合约和明确不变量,再增加功能。
- 测试正常、失败、边界和组合调用。
- 固定依赖、编译器、优化和 EVM 配置。
- 漏洞实验只在本地或明确授权环境执行。
先看安装,再看测试怎么写
下面是 Cyfrin / Patrick Collins 的 Foundry 长课。本页只要求你看完安装与第一个 forge test。其余章节当作工具书,用到再回看。
四层测试解决不同问题
先掌握这组命令
vm.prank改变下一次调用的 msg.sender。
vm.expectRevert断言调用必须以指定方式失败。
deal为地址设置 ETH 或 Token 测试余额。
bound约束 fuzz 输入到有效业务范围。
Lab:证明一个访问控制错误
创建 Vulnerable.sol,让任意地址都能修改 owner。先写攻击测试证明未授权调用成功,再增加权限检查和回归测试。
function test_AttackerCanTakeOwnership() public {
vm.prank(attacker);
vault.setOwner(attacker);
assertEq(vault.owner(), attacker);
}
function test_RevertWhenCallerIsNotOwner() public {
vm.prank(attacker);
vm.expectRevert();
fixedVault.setOwner(attacker);
}完成证据
仓库同时保留 vulnerable、fixed、攻击测试和修复后的回归测试。网页测验通过不算完成,本地测试绿了才算。
课末自测
为什么 100% 测试覆盖率仍然不能证明合约没有漏洞?
信心