本文へスキップ
BecomeCoder

C#デザインパターンコース · 第2章 TDD ― テスト駆動開発 · レッスン16

TDD実践 ― 仕様変更に立ち向かう

ブラウザで完結

導入

TDDの真価は仕様変更のときに現れます。テストがあれば「変更で過去の機能を壊していないか」を一瞬で確認できます。割り勘計算を例に、仕様追加を安全に行いましょう。

図解

flowchart TB
    OLD["既存テスト(緑)"] --> CHG["仕様追加で実装を変更"]
    CHG --> CHK{"既存テストは緑のまま?"}
    CHK -->|はい| SAFE["過去の機能は無事 ✅"]
    CHK -->|いいえ| BUG["デグレを即検知 🛑"]
    style SAFE fill:#e8f5e9

サンプル

// 仕様: 割り勘。端数は切り上げ
Assert(Split(3000, 3) == 1000, "3000/3=1000");
Assert(Split(1000, 3) == 334,  "1000/3=334(切り上げ)");
Console.WriteLine("全テスト成功");

int Split(int total, int people)
{
    if (people <= 0) throw new ArgumentException("人数は1以上");
    return (total + people - 1) / people;   // 切り上げ除算
}

void Assert(bool c, string n) { if (!c) throw new Exception($"FAIL: {n}"); }
  • 仕様をテストとして書き出しておくと、実装変更のたびに全件を再確認できる
  • 既存テストが緑のまま=デグレ(過去機能の破壊)が起きていない証明
  • 「切り上げ除算」(a + b - 1) / bは実務頻出のテクニック

演習

// 新仕様: 幹事は支払い免除(人数 - 1 で割る)
Assert(SplitExemptOrganizer(3000, 3) == 1500, "3000を幹事免除3人→1500");
Console.WriteLine("全テスト成功");

// TODO: 幹事を除いた (people - 1) 人で割り勘(切り上げ)する
//       SplitExemptOrganizer を実装してください
void Assert(bool c, string n) { if (!c) throw new Exception($"FAIL: {n}"); }
___
  • 期待される出力: 全テスト成功
ヒント1を見る

支払人数はpeople - 1。切り上げ除算を使います

ヒント2を見る

int SplitExemptOrganizer(int total, int people) { int payers = people - 1; return (total + payers - 1) / payers; }

まとめ

  • テストがあれば仕様変更後もデグレを即検知できる
  • 既存テストが緑=過去の機能を壊していない証明
  • テストは「実行できる仕様書」として資産になる

次回: 依存を偽物に差し替えるMoqです。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。