mcpField
T
tdd

tdd

github.com/mattpocockテスト・品質305.7k1.2M 回インストール1 日前に更新
リポジトリ

tdd について

tdd は、テスト駆動開発の赤から緑へのサイクルを導くテスト関連のエージェントスキルです。テストは公開インターフェースを通じて振る舞いを検証すること、テストを書く前にユーザーとシームを合意すること、縦方向のスライスで進めることを定めています。

主な機能

  1. 01公開インターフェースを通じて振る舞いを検証
  2. 02テスト前に合意したシームのみを対象とする
  3. 03壊れやすいテストにつながるアンチパターンを整理
  4. 04一括記述ではなく縦方向のスライスで実装
  5. 05失敗するテストを先に書き最小限の実装を行う

活用シーン

  1. 01新機能に赤から緑のサイクルでテストを追加
  2. 02実装への結合や同語反復的なアサーションのレビュー
  3. 03コーディング開始前に優先すべき重要経路を合意

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mattpocock/skills --skill tdd

インストール後、Claude Code で/tddを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

mocking.md
tests.md
agents/
openai.yaml

詳細

テスト駆動開発

TDD は、red → green のループです。このスキルは、そのループで価値のあるテストを作成するためのリファレンスです。優れたテストとは何か、テストをどこに配置するか、アンチパターン、そしてループのルールを説明します。すべてのセクションは、各サイクルで適用されます。ループの後ではなく、ループの前と最中に参照してください。

コードベースを調査するときは、テスト名やインターフェースの用語がプロジェクトのドメイン用語と一致するよう、GLOSSARY.md(存在する場合)を読み、その領域に関係する ADR を尊重してください。

優れたテストとは

テストは、実装の詳細ではなく、公開インターフェースを通じて振る舞いを検証します。コードは全面的に変更されることがあっても、テストはそうあるべきではありません。優れたテストは仕様のように読めます。「ユーザーは有効なカートでチェックアウトできる」とあれば、どの機能が存在するかが正確にわかり、内部構造を気にしないため、リファクタリング後もそのまま使えます。

例は tests.md、モックのガイドラインは mocking.md を参照してください。

シーム:テストする場所

シームとは、テストする公開境界、つまり内部に立ち入らずに振る舞いを観察するインターフェースです。テストはシームに配置し、内部実装を対象にしてはいけません。

事前に合意したシームだけをテストしてください。 テストを書く前に、テスト対象のシームを書き出し、ユーザーに確認してください。確認されていないシームに対するテストは書きません。すべてをテストすることはできないため、事前にシームに合意しておくことで、あらゆるエッジケースではなく、重要な経路や複雑なロジックにテストの労力を集中できます。

「公開インターフェースは何ですか? どのシームをテストすべきですか?」と尋ねてください。提案するシームごとに、何を検出し、何を検出できないかを一行で記してください。

そのインターフェースの形自体が検討事項である場合(モジュールの深さ、シームの位置、インターフェースが公開する内容など)は、用語を確認するために Skill ツールで「codebase-design」を呼び出してください。これは、モジュール、インターフェース、深さ、シーム、アダプター、レバレッジ、局所性に関する用語の共有ソースであり、実行するセッションではなく、参照するための資料です。

アンチパターン

  • 実装との結合:内部の協力オブジェクトをモックする、プライベートメソッドをテストする、またはサイドチャネルを通じて検証する(インターフェースを使わずデータベースに問い合わせるなど)。見分け方:振る舞いは変わっていないのに、リファクタリングでテストが壊れます。
  • 同語反復:アサーションが、コードと同じ方法で期待値を再計算する(expect(add(a, b)).toBe(a + b)、手作業で同じ方法を使って作成したスナップショット、自分自身と等しいとアサートする定数など)ため、必ず成立し、コードと食い違うことがありません。期待値は、正しいことが確認されたリテラル、計算例、仕様など、独立した真実のソースに基づいている必要があります。
  • 水平分割:すべてのテストを書いてから、すべての実装を書くことです。まとめて書いたテストは、_想像上の_振る舞いを検証します。ユーザー向けの振る舞いではなく、物事の_形_をテストするため、実際の変更に反応しなくなり、実装を理解する前にテスト構造を確定してしまいます。代わりに垂直スライスで進めます。テストを1つ書き、実装を1つ行い、それを繰り返します。各テストは、前のサイクルで得た学びに応じて変化するトレーサーバレットです。

ループのルール

  • green の前に red。 まず失敗するテストを書き、それを通すために必要な最小限のコードだけを書きます。将来のテストを先回りしたり、推測で機能を追加したりしないでください。
  • 一度に1つのスライス。 1サイクルにつき、シーム1つ、テスト1つ、最小限の実装1つです。
  • リファクタリングはループの一部ではありません。 リファクタリングはレビュー段階で行うものであり(code-review スキルを参照)、red → green の実装サイクルには含まれません。

コメント