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

テスト戦略とパターン

testing-ops

テストピラミッドや単体テスト、結合テストといった様々なテスト戦略やパターンを理解し、テスト駆動開発やモック戦略など、効果的なテスト設計と実装を支援するSkill。

📜 元の英語説明(参考)

Cross-language testing strategies and patterns. Triggers on: test pyramid, unit test, integration test, e2e test, TDD, BDD, test coverage, mocking strategy, test doubles, test isolation.

🇯🇵 日本人クリエイター向け解説

一言でいうと

テストピラミッドや単体テスト、結合テストといった様々なテスト戦略やパターンを理解し、テスト駆動開発やモック戦略など、効果的なテスト設計と実装を支援するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o testing-ops.zip https://jpskill.com/download/5947.zip && unzip -o testing-ops.zip && rm testing-ops.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/5947.zip -OutFile "$d\testing-ops.zip"; Expand-Archive "$d\testing-ops.zip" -DestinationPath $d -Force; ri "$d\testing-ops.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して testing-ops.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → testing-ops フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 この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-18
同梱ファイル
1

📖 Skill本文(日本語訳)

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

テストパターン

言語を問わず適用できる普遍的なテスト戦略とパターンです。

テストピラミッド

        /\
       /  \     E2E テスト (少ない、遅い、高価)
      /    \    - フルシステムテスト
     /------\   - 実際のブラウザ/API呼び出し
    /        \
   /  Integ   \ 統合テスト (いくつか)
  /   Tests    \ - サービス境界
 /--------------\ - データベース、API
/                \
/   Unit Tests    \ 単体テスト (多い、速い、安価)
------------------  - 単一の関数/クラス
                    - モックされた依存関係

テストの種類

単体テスト

スコープ:      単一の関数/メソッド/クラス
速度:      ミリ秒
依存関係: すべてモック
いつ:       すべてのコード変更時
カバレッジ:   コードベースの80%以上

統合テスト

スコープ:      複数のコンポーネントをまとめて
速度:      秒
依存関係: 実際のデータベース、モックされた外部API
いつ:       PR/マージ時、クリティカルパス
カバレッジ:   主要な統合ポイント

エンドツーエンドテスト

スコープ:      完全なユーザー体験
速度:      分
依存関係: 実際のシステム (またはステージング)
いつ:       デプロイ前、夜間
カバレッジ:   重要なユーザーフローのみ

テスト命名規則

test_<unit>_<scenario>_<expected>

例:
- test_calculate_total_with_discount_returns_reduced_price
- test_user_login_with_invalid_password_returns_401
- test_order_submit_when_out_of_stock_raises_error

Arrange-Act-Assert (AAA)

def test_calculate_discount():
    # Arrange - テストデータと依存関係を設定します
    cart = Cart()
    cart.add_item(Item(price=100))
    discount = Discount(percent=10)

    # Act - テスト対象のコードを実行します
    total = cart.calculate_total(discount)

    # Assert - 結果を検証します
    assert total == 90

テストダブル

タイプ 目的
Stub 決められたデータを返します stub.get_user.returns(fake_user)
Mock インタラクションを検証します mock.send_email.assert_called_once()
Spy 呼び出しを記録し、実際の実装を使用します spy.on(service, 'save')
Fake 動作する簡略化された実装です 実際のDBの代わりに FakeDatabase()
Dummy プレースホルダーで、決して使用されません 必須パラメータの null オブジェクト

テスト分離戦略

データベース分離

オプション 1: トランザクションロールバック (高速)
- テスト前にトランザクションを開始します
- テスト後にロールバックします

オプション 2: テーブルの切り捨て (中速)
- テスト間で全てのデータをクリアします

オプション 3: データベースの分離 (低速)
- 各テストが新しいデータベースを取得します

外部サービス分離

オプション 1: 境界でのモック
- HTTPクライアントをモックに置き換えます

オプション 2: フェイクサーバー
- WireMock, MSW, VCR cassettes

オプション 3: 契約テスト
- Pact, コンシューマー駆動契約

テストすべきこと

必須でテストすべきこと

  • ビジネスロジックと計算
  • 入力検証とエラー処理
  • セキュリティに敏感なコード (認証、権限)
  • エッジケースと境界条件

テストすべきこと

  • 統合ポイント (DB, API)
  • 状態遷移
  • 設定処理

テストを避けるべきこと

  • フレームワークの内部
  • サードパーティライブラリの動作
  • 単純なゲッター/セッター
  • プライベートな実装の詳細

テスト品質チェックリスト

  • [ ] テストは独立しています (順序依存性がない)
  • [ ] テストは決定的です (不安定なテストがない)
  • [ ] テストは高速です (単体 < 100ms, 統合 < 5s)
  • [ ] テストは動作を記述する明確な名前を持っています
  • [ ] テストはハッピーパスとエラーケースの両方をカバーしています
  • [ ] テストは本番ロジックを繰り返しません
  • [ ] モックは最小限です (外部境界のみ)

追加リソース

  • ./references/tdd-workflow.md - テスト駆動開発サイクル
  • ./references/mocking-strategies.md - モックするタイミングと方法
  • ./references/test-data-patterns.md - フィクスチャ、ファクトリ、ビルダー
  • ./references/ci-testing.md - CI/CDパイプラインでのテスト

スクリプト

  • ./scripts/coverage-check.sh - カバレッジを実行し、しきい値を下回った場合に失敗させます
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Testing Patterns

Universal testing strategies and patterns applicable across languages.

The Test Pyramid

        /\
       /  \     E2E Tests (few, slow, expensive)
      /    \    - Full system tests
     /------\   - Real browser/API calls
    /        \
   /  Integ   \ Integration Tests (some)
  /   Tests    \ - Service boundaries
 /--------------\ - Database, APIs
/                \
/   Unit Tests    \ Unit Tests (many, fast, cheap)
------------------  - Single function/class
                    - Mocked dependencies

Test Types

Unit Tests

Scope:      Single function/method/class
Speed:      Milliseconds
Dependencies: All mocked
When:       Every code change
Coverage:   80%+ of codebase

Integration Tests

Scope:      Multiple components together
Speed:      Seconds
Dependencies: Real databases, mocked external APIs
When:       PR/merge, critical paths
Coverage:   Key integration points

End-to-End Tests

Scope:      Full user journey
Speed:      Minutes
Dependencies: Real system (or staging)
When:       Pre-deploy, nightly
Coverage:   Critical user flows only

Test Naming Convention

test_<unit>_<scenario>_<expected>

Examples:
- test_calculate_total_with_discount_returns_reduced_price
- test_user_login_with_invalid_password_returns_401
- test_order_submit_when_out_of_stock_raises_error

Arrange-Act-Assert (AAA)

def test_calculate_discount():
    # Arrange - Set up test data and dependencies
    cart = Cart()
    cart.add_item(Item(price=100))
    discount = Discount(percent=10)

    # Act - Execute the code under test
    total = cart.calculate_total(discount)

    # Assert - Verify the results
    assert total == 90

Test Doubles

Type Purpose Example
Stub Returns canned data stub.get_user.returns(fake_user)
Mock Verifies interactions mock.send_email.assert_called_once()
Spy Records calls, uses real impl spy.on(service, 'save')
Fake Working simplified impl FakeDatabase() instead of real DB
Dummy Placeholder, never used null object for required param

Test Isolation Strategies

Database Isolation

Option 1: Transaction rollback (fast)
- Start transaction before test
- Rollback after test

Option 2: Truncate tables (medium)
- Clear all data between tests

Option 3: Separate database (slow)
- Each test gets fresh database

External Service Isolation

Option 1: Mock at boundary
- Replace HTTP client with mock

Option 2: Fake server
- WireMock, MSW, VCR cassettes

Option 3: Contract testing
- Pact, consumer-driven contracts

What to Test

MUST Test

  • Business logic and calculations
  • Input validation and error handling
  • Security-sensitive code (auth, permissions)
  • Edge cases and boundary conditions

SHOULD Test

  • Integration points (DB, APIs)
  • State transitions
  • Configuration handling

AVOID Testing

  • Framework internals
  • Third-party library behavior
  • Simple getters/setters
  • Private implementation details

Test Quality Checklist

  • [ ] Tests are independent (no order dependency)
  • [ ] Tests are deterministic (no flaky tests)
  • [ ] Tests are fast (unit < 100ms, integration < 5s)
  • [ ] Tests have clear names describing behavior
  • [ ] Tests cover happy path AND error cases
  • [ ] Tests don't repeat production logic
  • [ ] Mocks are minimal (only external boundaries)

Additional Resources

  • ./references/tdd-workflow.md - Test-Driven Development cycle
  • ./references/mocking-strategies.md - When and how to mock
  • ./references/test-data-patterns.md - Fixtures, factories, builders
  • ./references/ci-testing.md - Testing in CI/CD pipelines

Scripts

  • ./scripts/coverage-check.sh - Run coverage and fail if below threshold