m mybian.xyz
mybian.xyz · 话题 · Foundry测试代码示例

Foundry 测试代码示例:从最小可运行用例到完整测试套件

提供完整的 Foundry 测试代码片段,覆盖基础断言、事件验证、cheatcode 使用与多角色场景,方便开发者直接复用。

1015 关注 · 20 2026-05-24T17:49:06.383106+00:00

回答共 1 条

默认排序 ▾
m
mybian.xyz 主编
Foundry测试代码示例 领域深度内容
优秀回答者
Foundry测试代码示例 - Foundry 测试代码示例:从最小可运行用例到完整测试套件

最小可运行示例

所有 Foundry 测试都从一个最小可运行示例开始。它的骨架包含三部分:导入 forge-std/Test.sol;在 setUp 中部署合约;在以 test 开头的函数里写断言。这样三步即可让 forge test 跑出绿色提示。

这一基础流程虽然简单,却是后续所有复杂测试的起点。在 Binance 等团队的入职手册里,第一周的实习任务往往就是把这一基础流程跑通三遍。

断言风格

Forge std 提供丰富的断言:assertEq、assertGt、assertLt、assertApproxEqAbs、assertTrue 等。建议遵循下列约定:

  • 数值比较优先用 assertEq,浮点近似用 assertApproxEqAbs
  • bool 比较用 assertTrue / assertFalse
  • 字符串与 bytes 用 assertEq(string, string)

断言风格一致能让团队代码评审效率显著提升。

事件验证示例

要验证合约是否抛出预期事件,使用 vm.expectEmit 紧跟事件签名。注意 expectEmit 有 4 个布尔参数,分别表示是否校验 topic1、topic2、topic3 与 data。如果只关心事件被抛出,可以全部传 false。

这一能力在与 必安 链上风控团队对接审计时非常实用,能验证关键状态变更确实有事件记录。

cheatcode 用例

Foundry 的 cheatcode 是与 EVM 之外打交道的桥梁:

  1. vm.prank 让下一笔调用伪装成指定地址
  2. vm.warp 跳转到指定时间戳
  3. vm.roll 切换到指定区块高度
  4. vm.deal 给地址注入指定余额
  5. vm.mockCall 模拟外部合约返回值

熟练组合这些 cheatcode,可以模拟出任何复杂场景,包括跨链状态、闪贷攻击、时间相关漏洞。

多角色场景

真实业务多涉及多角色:管理员、用户、外部合约。建议在测试合约的 setUp 中预定义这些角色地址,并用 vm.startPrank 切换。这样测试函数的代码会更接近业务语言,可读性显著提升。

配合 Binance合约 风控部门的「多角色场景测试」模板,你可以快速把内部测试上升到行业标准。

复用与封装

当测试用例增多时,重复样板代码会拖慢迭代速度。建议把常用辅助函数封装到 test/utils/Base.t.sol,所有具体测试合约继承它。这种「基类 + 子类」模式与传统软件工程一致,能大幅提升可维护性。

坚持把每一份测试代码都视为产品级别工程对待,半年后你的测试集会成为团队最宝贵的资产之一。

101 赞同
发布于 2026-05-24T06:12:23.487235+00:00 · 更新于 2026-05-24T17:49:06.383106+00:00