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を入力して読み込まれたか確認します。
詳細
テスト標準
言語ルール
- 常にユーザーが使用しているのと同じ言語で応答してください。 ユーザーが中国語で尋ねた場合は中国語で、英語で尋ねた場合は英語で応答してください。
テストの構成
- ソースコントラクトごとにテストコントラクトを1つ作成します:
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 チートコード早見表
| チートコード | 用途 |
|---|---|
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。重要な関数では
forge test --fuzz-runs 10000のように10,000回以上に増やします
よく使うコマンド
# 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 対応