テスト駆動開発 は何をしますか?
TDD はレッド(赤)→ グリーン(緑)のループです。このスキルは、そのループが保存する価値のあるテストを生成するためのリファレンスです。良いテストとは何か、テストをどこに配置するか、アンチパターン、そしてループのルールを定義します。すべてのセクションはすべてのサイクルで適用されます。ループの前および最中に参照し、後回しにしないでください。
コードベースを探索するときは、CONTEXT.md(存在する場合)を読み、テスト名とインターフェースの語彙がプロジェクトのドメイン言語と一致するようにし、触れている領域の ADR を尊重してください。
良いテストとは
テストは、実装の詳細ではなく、公開インターフェースを通じて振る舞いを検証します。コードは完全に変更される可能性がありますが、テストは変更されるべきではありません。良いテストは仕様のように読み取れます。「ユーザーは有効なカートでチェックアウトできる」は、どのような機能が存在するかを正確に示し、内部構造を気にしないため、リファクタリング後も存続します。
例については tests.md を、モッキングのガイドラインについては mocking.md を参照してください。
シーム:テストを配置する場所
シームとは、テスト対象の公開境界です。内部に立ち入らずに振る舞いを観察できるインターフェースです。テストはシームに配置され、内部に対しては決して配置されません。
事前に合意されたシームでのみテストします。 テストを書く前に、テスト対象のシームを書き出し、ユーザーと確認してください。確認されていないシームにはテストを書きません。すべてをテストすることはできないため、シームを事前に合意することで、テスト作業をすべてのエッジケースではなく、重要なパスと複雑なロジックに集中させることができます。
「公開インターフェースは何ですか?どのシームをテストすべきですか?」と尋ねてください。
インターフェースの形状自体が疑問である場合(モジュールの深さ、シームの属する場所、インターフェースが公開すべき内容)、Skill ツールを "codebase-design" で呼び出してください。これはモジュール、インターフェース、深さ、シーム、アダプター、レバレッジ、ローカリティの用語の共有ソースであり、実行するセッションではなく、参照するリファレンスです。
アンチパターン
- 実装結合:内部の協力者をモックし、プライベートメソッドをテストする、またはサイドチャネル(インターフェースではなくデータベースに問い合わせる)を通じて検証する。兆候:リファクタリングしても振る舞いが変わっていないのにテストが壊れる。
- 同語反復:アサーションがコードと同じ方法で期待値を再計算する(
expect(add(a, b)).toBe(a + b)、手動で同じ方法で導出されたスナップショット、それ自体に等しいとアサートされた定数)。そのため、構築上常にパスし、コードと矛盾することがない。期待値は、既知の正しいリテラル、実演例、仕様など、独立した情報源から得られなければなりません。 - 水平スライス:最初にすべてのテストを書き、次にすべての実装を書く。大量のテストは想像上の振る舞いを検証します。つまり、ユーザー向けの振る舞いではなく、ものの形状をテストし、テストは実際の変更に鈍感になり、実装を理解する前にテスト構造にコミットしてしまいます。代わりに垂直スライスで作業してください。1 テスト → 1 実装 → 繰り返し。各テストは、前のサイクルから学んだことに応答するトレーサーブレットです。
ループのルール
- レッドの前にグリーンはない。 最初に失敗するテストを書き、次にそれをパスさせるのに十分なコードだけを書く。将来のテストを予測したり、推測による機能を追加したりしないでください。
- 一度に 1 スライス。 1 サイクルにつき、1 つのシーム、1 つのテスト、1 つの最小限の実装。
- リファクタリングはループの一部ではない。 リファクタリングはレビューステージ(
matt-code-reviewスキルを参照)に属し、レッド → グリーンの実装サイクルには属しません。