Skip to main content

TDD(テスト駆動)50章:詳細アウトライン🧪✨(C# / Windows / AI前提)

前提環境(2026想定)🪟🔧

  • .NET 10(LTS)+ C# 14 を前提に進めます✨(.NET 10は2025/11リリース、2026/01/13時点で10.0.2が最新) (Microsoft)
  • IDEは Visual Studio 2026 を基本にして、必要に応じて VS Code(C# Dev Kit) も補足します😊 (窓の杜)
  • テストは xUnit(最新安定版・v3系) を基本にします🧪 (xUnit.net)
  • AI(Copilot / Codex等)は**“常に使ってOK”**だけど、最終判断はテストと自分の意図でいきます🤖✅

Part 1:TDDの地図を持つ(迷子防止)🗺️😊(1〜6)

第1章:TDDって結局なに?(全体像を1枚にする)🙂

  • ねらい:TDDを「作業手順」として説明できる
  • 学ぶこと:テスト=仕様、設計=テストから育つ
  • 手を動かす:超ミニ例で「テスト→実装→整理」を眺める
  • AI:AIに「TDDの3ステップを短く説明して」と頼む→自分の言葉に直す
  • チェック:TDDは“テストが先”であって“テストが多い”とは別

第2章:Red / Green / Refactor の意味を体で覚える🚦

  • ねらい:3ステップを“最小単位”で回せる
  • 学ぶこと:失敗の作り方/成功の最小化/整理の目的
  • 手を動かす:失敗するテストをわざと書く→最短で通す
  • AI:失敗ログを貼って「原因候補を3つ」と出させる
  • チェック:Greenで“作り込み”しない(それは次)

第3章:「小さく刻む」練習(1ステップ10分以内)⏱️

  • ねらい:課題を“細切れ”にできる
  • 学ぶこと:受け入れ条件→最小テストへの分解
  • 手を動かす:仕様文を3つの小テストに分割
  • AI:仕様を貼って「最小テストの順番を提案して」
  • チェック:粒度が大きいとRefactorが怖くなる

第4章:TDDが得意な領域/苦手な領域🎯

  • ねらい:TDDを使う場所を選べる
  • 学ぶこと:純粋ロジック◎/UI見た目△/外部I/Oは工夫
  • 手を動かす:自分の過去コードを“テストしやすさ”で分類してみる
  • AI:コード断片を貼って「テストしやすくする分離案」
  • チェック:「全部TDD」じゃなく“効く所から”

第5章:テストは“仕様書”になる(読み物化のコツ)📘

  • ねらい:あとで読めるテストを書ける
  • 学ぶこと:意図が伝わる命名/Arrangeの見やすさ
  • 手を動かす:テスト名を「日本語で意図→英語名へ」変換
  • AI:命名候補を複数出させて、最も誤解が少ないものを選ぶ
  • チェック:テストが“実装の写し”になると死ぬ😵

第6章:AI時代のTDD作法(使いどころを固定)🤖✅

  • ねらい:AIで速度UPしつつ品質を落とさない
  • 学ぶこと:AIは「案出し」「抜け探し」「置き換え提案」に強い
  • 手を動かす:AIに“テストケース洗い出し”だけやらせる
  • AI:固定プロンプト例(後述の章でも毎回使う)
  • チェック:AIのコード採用条件=「テストが通る+意図に一致」

Part 2:環境づくり(手が止まらない状態にする)🪟🔧(7〜10)

第7章:Visual Studioでテストが回る土台を作る🏗️

  • ねらい:新規プロジェクト+テストが1分で起動
  • 学ぶこと:ソリューション構成(App / Tests)
  • 手を動かす:xUnitテストを1本作って実行
  • AI:README雛形(実行手順)をAIに作らせる
  • チェック:最初からフォルダが散らかると後がつらい

第8章:VSのテスト実行に慣れる(赤の読み方)🔍

  • ねらい:失敗ログから原因を絞れる
  • 学ぶこと:Assert失敗/例外/タイムアウトの違い
  • 手を動かす:3種類の失敗をわざと起こして見分ける
  • AI:ログを貼って「原因候補→確認手順」を出させる
  • チェック:最初のうちは“焦らずログの型を見る”

第9章:dotnet test(CLI)も使えるようにする⌨️

  • ねらい:IDE無しでもテストが回る
  • 学ぶこと:dotnet test / フィルタ / 失敗時の出力
  • 手を動かす:1テストだけ実行→失敗を確認
  • AI:コマンド例をAIに整理させて自分用メモ化
  • チェック:CIで必要になるのはだいたいCLI

第10章:VS Code補足(ミニ構成で迷わない)🧩

  • ねらい:VS Codeでも“学習が続く”
  • 学ぶこと:C# Dev Kit / テスト探索 / 実行
  • 手を動かす:VS Codeでテストを1本追加→実行
  • AI:VS Codeでの“ハマりがち”をAIに列挙させる
  • チェック:メインはVS、VS Codeは補助でOK

Part 3:テストの書き方(読みやすさ最優先)🧪📚(11〜18)

第11章:AAA(Arrange/Act/Assert)で形を固定🧱

  • ねらい:テストが毎回同じ形で書ける
  • 学ぶこと:準備→実行→確認を混ぜない
  • 手を動かす:散らかったテストをAAAに整形
  • AI:テストを貼って「AAAに直して」
  • チェック:Assertは最後に集める(読みやすさUP)

第12章:Assertの基本(何を確認すべき?)✅

  • ねらい:テストが“ちゃんと検証”できる
  • 学ぶこと:値/例外/コレクション/状態変化
  • 手を動かす:同じ仕様を“3種類のAssert”で表現してみる
  • AI:「この仕様でAssertするべき観点」を3つ出させる
  • チェック:確認が弱いとテストが“通るだけ”になる😇

第13章:テスト名の付け方(読むだけで仕様)📝✨

  • ねらい:失敗しても何が壊れたか即わかる
  • 学ぶこと:Given/When/Then(または日本語でもOK)
  • 手を動かす:命名が弱いテスト名を10個改善
  • AI:命名案を3つ出させて「誤解が少ない」ものを選ぶ
  • チェック:メソッド名の暗記じゃなく“振る舞い”を書く

第14章:1テスト1意図(欲張り禁止)🍰🙅‍♀️

  • ねらい:壊れた理由が一瞬で分かる
  • 学ぶこと:複数Assertの扱い(同一意図ならOK)
  • 手を動かす:1テストに混ざった意図を分割
  • AI:混ざってる意図をAIに見つけさせる
  • チェック:失敗原因が多いテストは“読むのが地獄”

第15章:パラメータ化(同じ形でケースを増やす)🔁

  • ねらい:境界値や例外ケースが増やしやすい
  • 学ぶこと:Theory/Data(データ列挙の考え方)
  • 手を動かす:境界値を5ケース追加
  • AI:仕様から「境界値候補」を自動で列挙させる
  • チェック:増やすほど読みづらいなら“分ける”

第16章:テストデータの作り方(小さく・分かりやすく)🧸

  • ねらい:Arrangeがスッキリする
  • 学ぶこと:テストデータビルダーの超入門
  • 手を動かす:同じArrangeをヘルパー化
  • AI:ビルダー雛形をAIに作らせて最小に削る
  • チェック:共通化しすぎると意図が隠れる🙈

第17章:“決定性”の確保(テストが毎回同じ結果)🎲🚫

  • ねらい:たまに落ちるテストを作らない
  • 学ぶこと:時間/乱数/並列/順序依存の罠
  • 手を動かす:乱数を固定して安定化
  • AI:不安定になりそうな点をAIに指摘させる
  • チェック:フレーク(たまに落ちる)は敵😵‍💫

第18章:ここまでの総合ミニ演習:カフェ会計①☕️🧾

  • ねらい:AAA+命名+境界値が一通りできる
  • 学ぶこと:合計/税/端数(まずは簡単な仕様)
  • 手を動かす:3テスト→最小実装→整理
  • AI:テストケース案だけ出させる(実装は自分主導)
  • チェック:Greenで作り込みしない(次章以降で育てる)

Part 4:TDDの“手筋”を覚える(設計が自然に整う)🧠✨(19〜28)

第19章:仮実装(ベタでもいいから先に通す)🩹

  • ねらい:Red→Greenに最短で到達
  • 学ぶこと:仮実装の役割(設計を後回しにする技)
  • 手を動かす:一旦ベタで通してから次へ
  • AI:仮実装を“やりすぎない”チェックをAIにさせる
  • チェック:仮実装は“永住”させない😂

第20章:三角測量(2ケース目で一般化)📐

  • ねらい:一般化のタイミングが分かる
  • 学ぶこと:2例目でルールが見える
  • 手を動かす:2ケース目のテスト追加→一般化
  • AI:次に追加すべきテストケース候補を提案させる
  • チェック:一般化が早すぎると複雑になる

第21章:明白な実装(迷いがない時は素直に)🌼

  • ねらい:ムダに回り道しない
  • 学ぶこと:仮実装/三角測量/明白の使い分け
  • 手を動かす:同じ仕様を別の手で実装して比較
  • AI:手の選択理由をAIに言語化させる(理解チェック)
  • チェック:「いつも同じ手」になってない?

第22章:失敗の種類を増やす(例外のテスト入門)🚫🧪

  • ねらい:異常系も“仕様”として書ける
  • 学ぶこと:例外型/メッセージ/エラー分類(超基礎)
  • 手を動かす:無効入力で例外を投げるテスト
  • AI:想定すべき無効入力を列挙させる
  • チェック:例外は“投げっぱなし”にしない(意味を持たせる)

第23章:“におい”を嗅ぐ(テストが設計の警報器)👃🚨

  • ねらい:設計の崩れを早めに気付ける
  • 学ぶこと:Arrangeが重い/依存が多い/テストが辛い=設計改善サイン
  • 手を動かす:辛いテストを1つ選び、原因を言語化
  • AI:原因→改善案を3案出させる
  • チェック:テストが辛いのに“気合で書く”のはNG

第24章:リファクタの安全運転(テストがある時の整理)🛡️

  • ねらい:怖くなくコードを整えられる
  • 学ぶこと:小さな置き換え/名前改善/重複除去
  • 手を動かす:リネーム→抽出→整理(各手順でテスト実行)
  • AI:リファクタ案をAIに出させて“最小”だけ採用
  • チェック:一気に変えない、こまめにテスト

第25章:テスト側のリファクタ(テストもコード)🧹

  • ねらい:テストが増えても読める
  • 学ぶこと:共通化の限度/ヘルパーの作法
  • 手を動かす:重複Arrangeを整理して読みやすく
  • AI:共通化候補を出させて“やりすぎ”を削る
  • チェック:ヘルパーが多すぎると意図が消える

第26章:カフェ会計②:割引・クーポン・上限🎟️🧾

  • ねらい:仕様追加でも壊れない進め方
  • 学ぶこと:小テスト追加→最小実装→整理を守る
  • 手を動かす:割引ルールを段階的に足す
  • AI:境界値(上限/下限/0円)案を出させる
  • チェック:条件分岐が増えたら“設計サイン”かも

第27章:条件分岐地獄の回避(表にして考える)🗂️

  • ねらい:ifが増える前に整理できる
  • 学ぶこと:決定表/ルールの見える化
  • 手を動かす:ルールを表にしてテストケース化
  • AI:決定表のたたき台を作らせる
  • チェック:仕様が増えたら“テストケース表”を更新

第28章:小さな設計の基本(超入門:責務を分ける)🧩

  • ねらい:1クラスに全部入れない感覚をつくる
  • 学ぶこと:責務/分離/名前の付け方
  • 手を動かす:計算とルールを小さなクラスに分ける
  • AI:クラス分割案を出させて“最小”だけ採用
  • チェック:分けすぎもNG(必要になってからでOK)

Part 5:依存を切る(テストしやすい設計の入口)🔌✨(29〜40)

第29章:依存ってなに?(時間・乱数・外部)⏰🎲

  • ねらい:テストを壊す“外部要因”を説明できる
  • 学ぶこと:I/O境界の考え方(超基礎)
  • 手を動かす:依存リストを作る(自分の題材で)
  • AI:依存を列挙させて抜けを補う
  • チェック:不安定の原因はだいたい依存

第30章:依存の差し替え①:インターフェースの最小導入🔁

  • ねらい:差し替え可能にできる
  • 学ぶこと:interfaceは“外側の都合”を閉じ込める
  • 手を動かす:Clockをinterface化
  • AI:interface名の候補を出させる(読みやすいのを採用)
  • チェック:抽象化は“必要になった分だけ”

第31章:依存の差し替え②:コンストラクタ注入(DI入門)📦

  • ねらい:newを減らしてテスト可能にする
  • 学ぶこと:注入=外から渡すだけ
  • 手を動かす:newを消して注入に変える
  • AI:差分が最小になる修正案を出させる
  • チェック:DIコンテナはまだ不要(ここでは使わない)

第32章:スタブとモックの気持ち(混乱しない説明)🎭

  • ねらい:テストダブルを使い分けられる
  • 学ぶこと:スタブ=返すだけ/モック=呼ばれ方も確認
  • 手を動かす:同じ依存をスタブでテスト→モックでテスト
  • AI:違いを“自分の題材”で説明させて理解チェック
  • チェック:最初はスタブ中心でOK

第33章:モックフレームワーク入門(最小だけ)🧪

  • ねらい:必要な時だけ使える
  • 学ぶこと:戻り値設定/呼び出し回数確認
  • 手を動かす:外部通知(例:メール送信)をモック化
  • AI:モック設定の雛形を出させて最小に削る
  • チェック:モックしすぎると“実装の写し”になる

第34章:呼び出し確認(副作用を仕様にする)📣✅

  • ねらい:「通知した/しない」をテストできる
  • 学ぶこと:いつ呼ぶ?呼ばない?が仕様
  • 手を動かす:条件で通知有無が変わるテスト
  • AI:副作用の観点(通知・ログ・保存)を列挙させる
  • チェック:副作用は“境界”に寄せると楽

第35章:例外の扱い(依存先が落ちた時)💥

  • ねらい:外部失敗時の仕様を決められる
  • 学ぶこと:リトライする?しない?ユーザーに何を返す?
  • 手を動かす:依存が例外を投げるケースのテスト
  • AI:失敗時の方針案を3つ出させる(採用は自分)
  • チェック:例外を握りつぶすのはNG🙅‍♀️

第36章:テストを速く保つ(遅いテストは続かない)🐢➡️⚡️

  • ねらい:テストの速度目標を持てる
  • 学ぶこと:ユニットは速い/重いのは別枠
  • 手を動かす:遅いテストの原因を分解(依存/I/O/大きいデータ)
  • AI:高速化案を箇条書きで出させる
  • チェック:遅い→回さない→壊れる、の悪循環😵

第37章:並列実行の落とし穴(順序依存を消す)🧵

  • ねらい:テストが順不同でも落ちない
  • 学ぶこと:共有状態の排除/テスト独立
  • 手を動かす:共有staticをやめる/初期化を見直す
  • AI:順序依存になりそうな点を指摘させる
  • チェック:テストは“他と関係ない”が理想

第38章:データ生成の整理(毎回手で作らない)🧸✨

  • ねらい:Arrange地獄を避ける
  • 学ぶこと:ビルダー/ファクトリ/最小データ
  • 手を動かす:テストデータ作成を1箇所に集約
  • AI:生成ヘルパーの雛形→不要部分を削る
  • チェック:データ生成が賢すぎると逆に読めない

第39章:“境界”を増やす(I/Oを薄くする)🚪

  • ねらい:中心ロジックがテストしやすくなる
  • 学ぶこと:入出力は薄い層へ、中心は純粋に
  • 手を動かす:Console入出力を別クラスへ追い出す
  • AI:分離後の責務名を提案させる
  • チェック:中心にI/Oが混ざるとテストが辛い

第40章:総合演習:推し活グッズ管理①(登録・検索)🎀📦

  • ねらい:依存分離+DI+テストダブルを使う
  • 学ぶこと:UseCaseっぽい単位でテスト
  • 手を動かす:登録/検索の仕様→テスト→実装
  • AI:仕様からテストケース表を作らせる
  • チェック:UI(表示)にロジックが入り始めたら分離

Part 6:設計が育つTDD(“壊れにくい形”へ)🏗️✨(41〜46)

第41章:ドメインルールを“型”で守る入門(超やさしく)🧷

  • ねらい:無効状態を作りにくくする
  • 学ぶこと:値のチェックを入口に寄せる
  • 手を動かす:価格・数量のバリデーションをテストから作る
  • AI:無効パターン列挙(負数、0、上限、null)
  • チェック:ifを増やすより“入れない”が強い

第42章:CQSの超入門(更新と参照を混ぜない)🔀🚫

  • ねらい:副作用が読みやすくなる
  • 学ぶこと:Command(変える)/ Query(見る)
  • 手を動かす:同じメソッドに混ざった責務を分ける
  • AI:分離案(命名含む)を提案させる
  • チェック:Queryが状態変更してたら事故る😇

第43章:状態が増えたら“状態遷移”で整理(超入門)🧠🗺️

  • ねらい:ステータスの抜け漏れが減る
  • 学ぶこと:許可される遷移だけ通す
  • 手を動かす:グッズの“予約/在庫/販売中”などを簡単に状態化
  • AI:状態遷移表のたたき台を作らせる
  • チェック:状態が増えたらif地獄になりやすい

第44章:例外の設計(ドメインエラーと外部エラーを分ける)🧯

  • ねらい:エラーが暴れない
  • 学ぶこと:ユーザーに見せる失敗/運用に出す失敗
  • 手を動かす:ドメインエラーをテストで固定
  • AI:エラー分類案(リトライ可否)を出させる
  • チェック:何でもExceptionは卒業🎓

第45章:リファクタの型(“安全な変形”リストを持つ)🛠️

  • ねらい:整理が手早くなる
  • 学ぶこと:抽出・インライン・リネーム・移動
  • 手を動かす:テストを回しながら3回リファクタ
  • AI:候補を出させる→「いちばん小さい」だけやる
  • チェック:大改造は小改造の積み重ねで

第46章:推し活グッズ管理②(集計・並び替え・条件検索)📊✨

  • ねらい:仕様が増えてもテストで守れる
  • 学ぶこと:パラメータ化/境界値/読みやすいテスト
  • 手を動かす:集計(合計数・カテゴリ別)をTDD
  • AI:検索条件の組合せテストを提案させる
  • チェック:テストが重くなったら“責務の見直し”サイン

Part 7:BlazorならOK!(UIでもTDDを回す)🎨🧪(47〜49)

第47章:Blazorの“テストしやすい分離”を作る(UIとロジックを分ける)🧩

  • ねらい:UIは薄く、ロジックはテスト可能に
  • 学ぶこと:コンポーネントは表示+イベント、処理は別クラスへ
  • 手を動かす:同じロジックを“UI外”に移してユニットテスト
  • AI:分離案(どの責務をどこへ)を提案させる
  • チェック:UIに計算ロジックを入れるほどテストが辛い

第48章:Blazorコンポーネントテスト入門(bUnit想定)🧪🖼️

  • ねらい:画面の振る舞いを“自動で”確認できる
  • 学ぶこと:レンダリング→イベント→表示変化の確認
  • 手を動かす:ボタン押下→表示が変わるテスト
  • AI:テストケース(ユーザー操作の流れ)を出させる
  • チェック:見た目全部は追わず“重要な振る舞い”に絞る

第49章:Blazor + DI(依存の差し替えをUIでも活かす)🔁

  • ねらい:UIから呼ぶサービスを差し替えられる
  • 学ぶこと:依存注入されたサービスをテストで差し替える
  • 手を動かす:データ取得サービスをスタブ化してUIテスト
  • AI:スタブ実装の雛形を出させて最小化
  • チェック:ネットワークやDBに繋ぐテストは“別枠”へ

Part 8:運用に耐える(続けられるTDD)🏁💪(50)

第50章:卒業制作:推し活グッズ管理③(Blazorで完成)🎓🎉

  • ねらい:TDDの流れを最初から最後まで一人で回せる

  • 学ぶこと:仕様→テスト→実装→整理→自動化の一連

  • 手を動かす:

    • 重要ユースケースをテストで固定
    • UIは必要最低限のテスト(重要導線だけ)
    • 最後に“テスト実行手順”をREADME化
  • AI:PRレビュー役として「抜けてる観点」「リファクタ候補」を出させる

  • チェック:完成条件=“テストが仕様として読める+壊しても直せる安心感”


追加:AIに毎章使える“固定プロンプト”例🤖✨

(コピペ用に短くしてます😊)

  • 「この仕様のテストケースを、正常/異常/境界値で列挙して」
  • 「このテスト、意図が伝わる命名案を3つ出して」
  • 「このコード、テストしやすくするための分離案を3つ」
  • 「この失敗ログから、原因候補→確認手順を順番に」

  • 各章に「到達目標」「課題」「提出物(コミット単位)」「小テスト問題」まで付けた“講義台本化”📘
  • 推し活グッズ管理を、章ごとに少しずつ育てる“完全な課題設計”🎀
  • Visual Studio中心で、操作手順も含めた“実際の教材文章”化🪟🧪