solidity-testing
Solidityのテストファイル作成や修正前に、テスト構造、命名規則、カバレッジ要件、ファジング、Foundryチートコードを自動で網羅するSkill。
📜 元の英語説明(参考)
[AUTO-INVOKE] MUST be invoked BEFORE writing or modifying any test files (*.t.sol). Covers test structure, naming conventions, coverage requirements, fuzz testing, and Foundry cheatcodes. Trigger: any task involving creating, editing, or running Solidity tests.
🇯🇵 日本人クリエイター向け解説
Solidityのテストファイル作成や修正前に、テスト構造、命名規則、カバレッジ要件、ファジング、Foundryチートコードを自動で網羅するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
テスト基準
言語ルール
- ユーザーが使用している言語と常に同じ言語で応答してください。 ユーザーが中国語で質問した場合は中国語で、英語で質問した場合は英語で応答してください。
テストの構成
- ソースコントラクトごとに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 — 重要な関数では10,000回以上に増やします:
forge test --fuzz-runs 10000
一般的なコマンド
# すべてのテストを実行
forge test
# 特定のテスト関数を実行
forge test --match-test test_transfer
# 特定のテストコントラクトを実行
forge test --match-contract MyTokenTest
# 完全なトレースを含む詳細な出力
forge test -vvvv
# ガスレポート
forge test --gas-report
# より多くの実行回数でファズテスト
forge test --fuzz-runs 10000
# テストカバレッジ
forge coverage
# レポート付きカバレッジ
forge coverage --report lcov 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Testing Standards
Language Rule
- Always respond in the same language the user is using. If the user asks in Chinese, respond in Chinese. If in English, respond in English.
Test Organization
- One test contract per source contract:
MyToken.sol→MyToken.t.sol - File location: All tests in
test/directory - Naming:
test_<feature>_<scenario>for passing tests,testFail_<feature>_<scenario>for expected reverts- Example:
test_transfer_revertsWhenInsufficientBalance - Example:
test_stake_updatesBalanceCorrectly
- Example:
- Independence: Each test must run in isolation — use
setUp()for shared state, no cross-test dependencies - Filtering: Support
--match-testand--match-contractfor targeted runs
Coverage Requirements
Every core function must have tests covering:
| Scenario | What to verify |
|---|---|
| Happy path | Standard input → expected output, correct state changes |
| Permission checks | Unauthorized caller → vm.expectRevert with correct error |
| Boundary conditions | Zero values, max values (type(uint256).max), off-by-one |
| Failure scenarios | Every require / revert / custom error path |
| State changes | Storage updates, balance changes, event emissions (vm.expectEmit) |
| Edge cases | Empty arrays, duplicate calls, self-transfers |
Foundry Cheatcodes Quick Reference
| Cheatcode | Usage |
|---|---|
vm.prank(addr) |
Next call from addr |
vm.startPrank(addr) |
All calls from addr until vm.stopPrank() |
vm.warp(timestamp) |
Set block.timestamp |
vm.roll(blockNum) |
Set block.number |
vm.deal(addr, amount) |
Set ETH balance |
vm.expectRevert(error) |
Next call must revert with specific error |
vm.expectEmit(true,true,false,true) |
Verify event emission (topic checks) |
vm.record() / vm.accesses() |
Track storage reads/writes |
makeAddr("name") |
Create labeled address for readable traces |
Fuzz Testing Rules
- All math-heavy and fund-flow functions must have fuzz tests
- Pattern:
function testFuzz_<name>(uint256 amount) public - Use
vm.assume()to constrain inputs:vm.assume(amount > 0 && amount < MAX_SUPPLY); - Default runs: 256 — increase to 10,000+ for critical functions:
forge test --fuzz-runs 10000
Common Commands
# 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