1. テスト駆動アプローチ入門 MOC
- ソフトウェア開発におけるテストの役割の変化
- アジャイル開発とテスト駆動アプローチ
- TDDとBDDの概要と比較の導入
2. テスト駆動開発 (Test-Driven Development - TDD) MOC
2.1. TDDの基本原則と哲学 MOC
- TDDとは何か
- TDDの目的
- TDDの3つの法則 (Three Laws of TDD)
[[1. テストが失敗するまでは、プロダクションコードを書いてはならない。]][[2. 失敗するテストは、一度に1つだけ書く。コンパイルエラーも失敗とみなす。]][[3. 失敗したテストが通るようになったら、それ以上プロダクションコードを書いてはならない。]]
2.2. TDDのサイクル (Red-Green-Refactor) MOC
- レッド (Red) フェーズ: 失敗するテストを書く
- 何をテストするか決定する (要求の明確化)
- テストのインターフェースを設計する
- 期待される結果を定義する
- テストが「正しく失敗する」ことの確認 (存在しないクラス/メソッド、間違ったロジックなど)
- グリーン (Green) フェーズ: テストをパスさせる
- リファクタリング (Refactor) フェーズ: コードを改善する
- TDDサイクルの継続とリズム
2.3. TDDにおけるテストの種類とレベル MOC
- ユニットテスト (Unit Test) とTDD (TDDの主な焦点)
- ユニットの定義 (クラス、メソッド、関数)
- Thorough)
[[テストダブル (Test Double) の利用 MOC]][[スタブ (Stub)]][[モック (Mock)]](状態検証 vs. 振る舞い検証)[[フェイク (Fake)]][[ダミー (Dummy)]][[スパイ (Spy)]][[モックライブラリの利用 (Mockito, Moq, unittest.mockなど)]]
- (オプション) 受入テスト駆動開発 (ATDD - Acceptance Test-Driven Development) とTDD (BDDとの関連)
- (オプション) インテグレーションテストとTDD (適用範囲と注意点)
2.4. TDDのプラクティスとテクニック MOC
- テストファースト (Test First) (原則の再確認)
- インクリメンタルな設計 (Incremental Design)
- 緊急回避的な仮実装 (Triangulation) (複数のテストケースから一般化)
- テストリストの作成と管理
- 明白な実装 (Obvious Implementation)
- 設計上の決定を遅らせる
- テストしやすいコードを書くための設計 (依存性の注入など)
- TDDにおけるテストカバレッジの考え方 (目標としての100%とその意味)
- レガシーコードとTDD
2.5. TDDの利点と課題 MOC
- TDDの利点
- TDDの課題と欠点
2.6. TDDとソフトウェア設計 MOC
- TDDが設計に与える影響
- テスト容易性 (Testability) を考慮した設計
[[依存性の注入 (Dependency Injection - DI)]][[インターフェースの活用]][[関心の分離 (SoC)]]
- TDDとSOLID原則
- TDDによる設計の創発 (Emergent Design)
- TDDとアーキテクチャ
2.7. TDDアンチパターン MOC
[[テストアフター (TDDサイクルの無視)]][[大きすぎるテスト (ユニットテストになっていない)]][[テストがプロダクションコードの実装詳細に依存しすぎる (脆いテスト)]][[網羅性の低いテスト / ハッピーパスのみのテスト]][[リファクタリングフェーズの省略]][[テストコードの品質軽視]][[テストが遅すぎる]][[モックの乱用 / 過剰なモック設定]][[アサーションが少なすぎる / 多すぎる]][[テストが互いに依存している]]
2.8. TDDツールとフレームワーク MOC
- xUnitファミリー
[[JUnit (Java)]][[NUnit (.NET)]][[pytest / unittest (Python)]][[PHPUnit (PHP)]][[RSpec (Ruby - BDD寄りだがユニットテストにも)]][[Jest / Mocha (JavaScript)]][[Google Test (C++)]]
- モックライブラリ (再掲)
- テストカバレッジツール (JaCoCo, Coverage.py, Istanbulなど)
- IDEとの統合
3. ビヘイビア駆動開発 (Behavior-Driven Development - BDD) MOC
3.1. BDDの基本原則と哲学 MOC
- BDDとは何か
- BDDの目的
- BDDの核となる考え方
3.2. BDDのサイクルとプロセス MOC
- ディスカバリー (Discovery / Specification Workshop)
- フォーミュレーション (Formulation)
- オートメーション (Automation)
- BDDループ (フィーチャーの実現と検証)
3.3. BDDにおける主要な概念とテクニック MOC
- ユーザーストーリー (User Story) (
As a <role>, I want <feature> so that <benefit>) - フィーチャー (Feature) (振る舞いの単位)
- シナリオ (Scenario) (フィーチャーの具体的な例)
- Gherkin言語 MOC (Cucumberなどで使われる記述言語)
[[Featureキーワード]][[Scenarioキーワード]][[Given(前提条件 / コンテキスト)]][[When(操作 / イベント)]][[Then(期待される結果 / 検証)]][[And,But(ステップの追加)]][[Background(共通の前提条件)]][[Scenario OutlineとExamples(データ駆動シナリオ)]][[Tags(シナリオの分類とフィルタリング)]][[Doc StringsとData Tables(ステップへの詳細データ提供)]]
- ステップ定義 (Step Definitions)
- 生きたドキュメント (Living Documentation)
- Outside-In Development (外側からの開発)
- Example Mapping (ディスカバリーのためのテクニック)
- Feature Mapping (ディスカバリーのためのテクニック)
3.4. BDDの利点と課題 MOC
- BDDの利点
- BDDの課題と欠点
3.5. BDDツールとフレームワーク MOC
- Cucumberファミリー (Gherkinパーサー + テスト実行)
[[Cucumber (Ruby)]][[Cucumber-JVM (Java)]][[Cucumber.js (JavaScript)]][[SpecFlow (.NET)]][[Behave (Python)]]
- RSpec (Ruby) (BDDスタイルのテストフレームワーク)
- JBehave (Java)
- Gauge (ThoughtWorks) (Markdownベースの仕様記述)
- Serenity BDD (旧Thucydides) (Java, よりリッチなレポート)
- Webテスト自動化ツールとの連携 (Selenium, Playwright, Cypressなど)
4. TDDとBDDの比較と関係 MOC
- 焦点の違い (TDD: ユニットの正しい実装 vs. BDD: システムの正しい振る舞い)
- 対象読者の違い (TDD: 開発者 vs. BDD: チーム全体 - ビジネス含む)
- 使用する言語の違い (TDD: プログラミング言語 vs. BDD: 自然言語に近いGherkinなど)
- シナリオ)
- 「TDDはBDDのサブセット」か「BDDはTDDの拡張」か
- TDDとBDDの補完関係
- どちらをいつ使うべきか (プロジェクトの特性、チームのスキル)
5. テスト駆動アプローチの組織への導入と展開 MOC
- 導入のステップと戦略
- チームへの教育とトレーニング
- 文化醸成とマインドセットの変革
- 経営層やマネジメントの理解と支援
- ツール選定と環境構築
- 導入時の一般的な障壁と対策
- テスト駆動アプローチの成熟度モデル (例)