solidity-testing 属于 Solidity 智能合约测试规范类技能,标记为 [AUTO-INVOKE],要求在编写或修改任何测试文件(*.t.sol)之前必须先调用。
用途 该技能用于统一 Solidity 项目的测试标准,规范测试结构、命名约定、覆盖要求与模糊测试规则,帮助开发者按既定模式编写可维护、可复现的合约测试。
语言规则 技能要求始终使用用户所使用的语言进行回应:用户用中文提问则用中文回答,用户用英文提问则用英文回答。
测试组织
- 一个源合约对应一个测试合约:MyToken.sol → MyToken.t.sol。
- 文件位置:所有测试放在 test/ 目录。
- 命名:通过的测试使用 test_<feature><scenario>,预期回滚的测试使用 testFail<feature>_<scenario>。示例:test_transfer_revertsWhenInsufficientBalance、test_stake_updatesBalanceCorrectly。
- 独立性:每个测试必须隔离运行,共享状态使用 setUp(),不得存在跨测试依赖。
- 过滤:支持 --match-test 和 --match-contract 进行定向运行。
覆盖要求 每个核心函数都必须有测试覆盖以下方面:
- 正常路径(Happy path):标准输入 → 预期输出、正确的状态变化。
- 权限检查:未授权调用者 → 使用 vm.expectRevert 并匹配正确错误。
- 边界条件:零值、最大值(type(uint256).max)、差一错误。
- 失败场景:每个 require / revert / 自定义 error 路径。
- 状态变更:存储更新、余额变化、事件发出(vm.expectEmit)。
- 边界情况:空数组、重复调用、自转账。
Foundry 作弊码速查
- vm.prank(addr):下一次调用来自 addr。
- vm.startPrank(addr):在 vm.stopPrank() 之前所有调用均来自 addr。
- vm.warp(timestamp):设置 block.timestamp。
- vm.roll(blockNum):设置 block.number。
- vm.deal(addr, amount):设置 ETH 余额。
- vm.expectRevert(error):下一次调用必须以特定错误回滚。
- vm.expectEmit(true,true,false,true):验证事件发出(主题检查)。
- vm.record() / vm.accesses():追踪存储读写。
- makeAddr("name"):创建带标签地址以便于阅读调用轨迹。
模糊测试规则
- 所有涉及大量数学计算与资金流转的函数都必须有模糊测试。
- 命名模式:function testFuzz_<name>(uint256 amount) public。
- 使用 vm.assume() 约束输入:vm.assume(amount > 0 && amount < MAX_SUPPLY);
- 默认运行次数:256;关键函数可提升到 10,000+:forge test --fuzz-runs 10000。
常用命令
- 运行所有测试:forge test
- 运行特定测试函数:forge test --match-test test_transfer
- 运行特定测试合约:forge test --match-contract MyTokenTest
- 详细输出与完整轨迹:forge test -vvvv
- Gas 报告:forge test --gas-report
- 增加模糊运行次数:forge test --fuzz-runs 10000
- 测试覆盖率:forge coverage
- 带报告的覆盖率:forge coverage --report lcov
适用场景 适用于使用 Foundry 进行 Solidity 智能合约开发的项目,尤其是需要在编写测试前统一命名、覆盖与模糊测试标准的团队或智能体工作流。
限制 资料仅提供测试规范、作弊码参考与命令示例,未提供具体项目配置、收费标准、价格、平台支持范围或效果保证等信息,这些内容暂未提供。