測試驅動開發(TDD)入門與實作教學

測試驅動開發(Test-Driven Development,簡稱 TDD)是一種軟體開發方法:先寫出會失敗的測試案例,再撰寫讓測試通過的程式碼,最後重構。目標是快速反饋、提升程式碼品質、推動簡單設計。

TDD 的基本步驟

TDD 的開發循環遵循「紅-綠-重構」模式:

  1. 紅色階段(Red):先寫一個會失敗的測試。這個測試對應你想實作的下一個功能。
  2. 綠色階段(Green):寫足夠讓測試通過的程式碼。不追求完美,只要通過即可。
  3. 重構階段(Refactor):整理程式碼,改善結構與設計,同時確認所有測試仍然通過。

使用 C# 實作 TDD

以下用一個簡單的 C# 範例,走完 TDD 的完整流程。

前提條件

確保開發環境已安裝 .NET Core SDK,並熟悉基本的 C# 與單元測試。

實作步驟

目標:開發一個類別庫,計算兩個整數的和。

步驟 1:建立新的方案

1
dotnet new sln -n TDDExample

步驟 2:加入類別庫專案與測試專案

1
2
3
4
5
dotnet new classlib -n CalculatorLibrary
dotnet new xunit -n CalculatorLibrary.Tests
dotnet sln add CalculatorLibrary
dotnet sln add CalculatorLibrary.Tests
dotnet add CalculatorLibrary.Tests reference CalculatorLibrary

步驟 3:紅色階段

CalculatorLibrary.Tests 專案新增測試案例,測試加法函式。此時 Calculator 類別尚未存在,執行 dotnet test 會編譯失敗——這正是 TDD 要的起點。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using Xunit;
using CalculatorLibrary;

namespace CalculatorLibrary.Tests {
public class CalculatorTests {
[Fact]
public void Add_ShouldCalculateCorrectSum() {
// Arrange
var calculator = new Calculator();
// Act
var result = calculator.Add(5, 5);
// Assert
Assert.Equal(10, result);
}
}
}

步驟 4:綠色階段

CalculatorLibrary 專案實作 Calculator 類別與 Add 方法,讓測試通過即可。

1
2
3
4
5
6
7
namespace CalculatorLibrary {
public class Calculator {
public int Add(int a, int b) {
return a + b;
}
}
}

步驟 5:執行測試

1
dotnet test

確認測試通過後再繼續。

步驟 6:重構階段

以這個例子而言,Add 本身已夠簡單,不需要特別整理。實務上重構的時機是:命名不清楚、邏輯重複、方法過長、類別職責混雜。例如若之後新增了 SubtractMultiply,卻發現每個方法都重複做邊界檢查,這時就抽出一個私有方法統一處理——重構前跑測試,重構後再跑一次,確認沒有破壞現有行為。

重構是持續的小整理,不是大改版。

結語

TDD 的節奏一開始會顯得慢,原本先寫實作的習慣要調整。但強迫自己先想清楚「這段程式碼應該做到什麼」,往往能在動手前就發現設計問題,後期反而少改很多。