关于 solidity-testing
solidity-testing 是一套面向 Foundry Solidity 项目的测试规范,指导开发者组织测试、覆盖不同场景、编写模糊测试,并运行指定测试或完整测试集。
主要功能
- 01测试文件组织与命名规范
- 02核心函数场景覆盖要求
- 03Foundry 测试作弊码参考
- 04针对数学与资金流的模糊测试
- 05运行指定测试的命令
适用场景
- 01为各合约组织测试文件
- 02检查权限、边界与失败路径
- 03为资金流函数添加模糊测试
- 04运行指定测试或完整测试集
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ 0xlayerghost/ solidity-agent-kit --skill solidity-testing安装后在 Claude Code 中输入/solidity-testing确认已加载。
详细介绍
测试规范
语言规则
- 始终使用用户所用的语言回复。 如果用户用中文提问,就用中文回复;如果用户用英语提问,就用英语回复。
测试组织
- 每个源合约对应一个测试合约:
MyToken.sol→MyToken.t.sol - 文件位置:所有测试都放在
test/目录中 - 命名:通过的测试使用
test_<feature>_<scenario>,预期回滚的测试使用testFail_<feature>_<scenario>- 示例:
test_transfer_revertsWhenInsufficientBalance - 示例:
test_stake_updatesBalanceCorrectly
- 示例:
- 独立性:每个测试都必须独立运行——使用
setUp()设置共享状态,测试之间不得相互依赖 - 筛选:支持使用
--match-test和--match-contract进行定向运行
覆盖率要求
每个核心函数都必须有测试覆盖以下场景:
| 场景 | 验证内容 |
|---|---|
| 正常路径 | 标准输入 → 预期输出、正确的状态变更 |
| 权限检查 | 未授权调用者 → 使用 vm.expectRevert 验证正确的错误 |
| 边界条件 | 零值、最大值(type(uint256).max)、差一错误 |
| 失败场景 | 每条 require / revert / 自定义错误路径 |
| 状态变更 | 存储更新、余额变更、事件发出(vm.expectEmit) |
| 边缘情况 | 空数组、重复调用、自转账 |
Foundry Cheatcodes 快速参考
| Cheatcode | 用途 |
|---|---|
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
常用命令
# Run all tests
forge test
# Run specific test function
forge test --match-test test_transfer
# Run specific test contract
forge test --match-contract MyTokenTest
# Verbose output with full trace
forge test -vvvv
# Gas report
forge test --gas-report
# Fuzz with more runs
forge test --fuzz-runs 10000
# Test coverage
forge coverage
# Coverage with report
forge coverage --report lcov
评论
支持 Markdown