From general-dev-skills
テストの設計・実装・レビューを行うスキル。単体テスト・統合テスト・E2Eテストすべてに対応する。 テストケースの洗い出し、テストコードの実装、既存テストのレビュー(不要テストの削除含む)の3フェーズで作業する。 テスト作成、テスト修正、テストケース選定、テストレビュー、テスト戦略の相談、 「このコードのテストを書いて」「テストを見直して」「何をテストすべきか」といったリクエストで使用する。 テストに関する作業が発生したら積極的にこのスキルを使うこと。
How this skill is triggered — by the user, by Claude, or both
Slash command
/general-dev-skills:test-driven-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
このスキルは、質の高いテストを設計・実装・レビューするためのワークフローを提供する。
このスキルは、質の高いテストを設計・実装・レビューするためのワークフローを提供する。
背景にある思想は references/testing-principles.md に詳述されている。
テストの価値は4本の柱の 掛け算 で決まる。どれか1つでもゼロなら価値はゼロ。
テストの価値 = 退行に対する保護 × リファクタリングへの耐性 × 迅速なフィードバック × 保守のしやすさ
判断に迷ったら以下の優先順位に従う
ユーザーのリクエストに応じて、以下の3フェーズのうち必要なものを実行する。 すべてを毎回やる必要はない。ユーザーが「テストを書いて」と言えば「洗い出し→実装」、 「テストを見直して」と言えば「レビュー」、のように柔軟に対応する。
対象コードを読み、テストすべきケースを特定する。
| 分類 | 複雑さ/重要性 | 協力者の数 | テスト方針 |
|---|---|---|---|
| ドメインモデル / アルゴリズム | 高い | 少ない | 単体テストの最優先対象 |
| 取るに足らないコード | 低い | 少ない | テストしない |
| コントローラ | 低い | 多い | 統合テストで検証 |
| 過度に複雑なコード | 高い | 多い | リファクタリングで分割してからテスト |
以下に該当するものはテスト対象から除外する。退行保護の価値がゼロに等しい。
| カテゴリ | 説明 |
|---|---|
| 言語・ランタイムの保証 | 使用言語やランタイムが仕様として保証する振る舞い(例外送出・配列操作の順序保証・型変換など) |
| 外部ライブラリの内部挙動 | 利用しているライブラリ・フレームワークの実装詳細(ORMのクエリ生成ロジック、テストランナーのアサーション内部動作など) |
仕様・データフローが不明瞭な箇所はその都度ユーザーに確認してから進める。
テストケースは describe と it.todo を使い、階層構造とケース名のみを定義したコードブロックで提示する。
describe("割引計算", () => {
describe("正常系", () => {
describe("会員ランクによる割引", () => {
it.todo("ゴールド会員の場合、20%割引が適用されること")
it.todo("シルバー会員の場合、10%割引が適用されること")
})
})
describe("異常系", () => {
describe("無効な入力値", () => {
it.todo("注文金額が0以下の場合、エラーが発生すること")
})
})
})
テストケース名の規則:
IsDeliveryValid_InvalidDate_ReturnsFalse のような形式的命名は使わないテスト手法の選定(優先順):
優先度の判定基準:
テストケースを列挙したら、以下の3つの観点でカバレッジを確認する
| 観点 | 説明 | テストケースの例 |
|---|---|---|
| 事前条件 | 関数・メソッドが正しく動作するために、呼び出し側が満たすべき条件 | 引数が null / 範囲外の値が渡された場合 |
| 事後条件 | 正常終了後に必ず成立すべき保証 | 戻り値が期待の型・範囲内にある、副作用が正しく反映される |
| 不変条件 | オブジェクトのライフタイムを通じて常に成立すべき性質 | 処理前後でオブジェクトの整合性が保たれる |
契約設計における検証の徹底:
ユーザーに提示し、合意を得てからフェーズ2に進む。
フェーズ1で合意した describe / it.todo のアウトラインをベースに実装する。
describe の構造とテストケース名(ドキュメントとしての意図)はそのまま維持し、it.todo を実行可能な it に変換する。
注意: 実装コードが期待通りの振る舞いをしていない可能性がある。テスト実装中に実装の誤りやバグの疑いに気づいた場合は、テストを書き進める前にユーザーにコメントして確認する。
フェーズ1で定義した describe 階層をそのまま使う。構造を変える場合はユーザーに確認する。
グルーピングの粒度はビジネスの文脈に合わせる。「このグループを読めばどんな前提条件・シナリオか分かる」という単位を意識する。
すべてのテストを以下の構造で書く。各フェーズは空行で区切る
test("会員ランクがゴールドの場合20%割引が適用される", () => {
// Arrange(準備)
const sut = createPricingService()
const order = createOrder({ memberRank: "gold", amount: 10000 })
// Act(実行)
const result = sut.calculateDiscount(order)
// Assert(確認)
expect(result).toBe(2000)
})
sut にする(System Under Test の略、慣例的にテスト対象を指す)| 依存の種類 | 扱い | 理由 |
|---|---|---|
| 管理下にある依存(専用DB等) | 実物を使い、最終状態を検証 | モック化するとリファクタリング耐性が失われる |
| 管理下にない依存(外部API、メッセージバス等) | モックで最終出力を検証 | 外部との通信は観察可能な振る舞い |
| 共有依存(テスト間で共有される状態) | テスト・ダブルに置き換える | テスト間の干渉を防ぐ |
重要: 単体テストではモックを使わない。モックは統合テストで管理下にない依存に対してのみ使用する。
スタブへの呼び出しを検証するのはアンチパターン(過剰検証)。
テスト実装後、テストを実行して結果を確認する。 失敗したテストがあれば、以下の順で原因を切り分ける
全件パスするまでこのサイクルを繰り返す。
既存テストを読み、以下の観点で評価する。
以下に該当するテストは削除を提案する
| 問題 | 説明 | 例 |
|---|---|---|
| 実装の詳細を検証している | 内部メソッドの呼び出し順序・回数を検証 | expect(mock).toHaveBeenCalledTimes(3) で内部手順を確認 |
| 取るに足らないコードのテスト | 1行プロパティや自明なコードのテスト | getter/setter のテスト |
| スタブを検証している | 入力用のテスト・ダブルへの呼び出しを検証 | データ取得用スタブの呼び出し回数を検証 |
| テスト内でドメイン知識を再実装 | 期待値をロジックで算出している | expect(result).toBe(price * taxRate) |
| private メソッドを直接テスト | テストのために private を public に変更 | 内部ヘルパーの直接テスト |
| private 状態を公開してテスト | テストのために内部状態を public に変更 | 内部フラグの直接検証 |
削除ではなく改善が適切な場合
以下の形式で報告する
## テストレビュー結果
### 削除推奨
| ファイル:行 | テスト名 | 理由 |
|---|---|---|
### 改善推奨
| ファイル:行 | テスト名 | 現在の問題 | 改善案 |
|---|---|---|---|
### 問題なし
| ファイル:行 | テスト名 | 評価 |
|---|---|---|
ユーザーの合意を得てから削除・修正を実行する。
テストで何を検証すべきかの判断に迷ったら、この基準を適用する
判別方法: 「クライアントが1つの目標を達成するために、複数メソッドを順番に呼ぶ必要があるか?」 → Yes なら実装の詳細が漏洩している。テストではなく設計の改善を提案する。
/ E2E \ ← 最小限。保護と耐性は最大だがフィードバックが遅い
/ 統合 \ ← ハッピーパスと単体で検証できないケースのみ
/ 単体テスト \ ← 最多。ドメインモデル/アルゴリズムを高速に検証
すべての層でブラックボックステスト(観察可能な振る舞いのみ検証)を徹底する。
原則の詳細や背景理論が必要な場合は references/testing-principles.md を参照する。
npx claudepluginhub suntory-n-water/suntory-n-water-marketplace --plugin general-dev-skillsProvides stack-agnostic testing strategies, the testing pyramid, test design heuristics, and patterns for fixing flaky tests and applying TDD.
Provides test design patterns, coverage strategies (80-100% targets), types (unit/integration/E2E), organization, and best practices for comprehensive test suites. Use for new suites, coverage improvement, or test design.
Provides a checklist for writing and reviewing tests: naming tests/files, designing data/fixtures/mocks, choosing assertions. Use for unit/integration/E2E tests.