jpskill.com
🛠️ 開発・MCP コミュニティ

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. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-17
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

テスト基準

言語ルール

  • ユーザーが使用している言語と常に同じ言語で応答してください。 ユーザーが中国語で質問した場合は中国語で、英語で質問した場合は英語で応答してください。

テストの構成

  • ソースコントラクトごとに1つのテストコントラクト: MyToken.solMyToken.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.solMyToken.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
  • Independence: Each test must run in isolation — use setUp() for shared state, no cross-test dependencies
  • Filtering: Support --match-test and --match-contract for 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