導入
テスト駆動開発(TDD)は、ソフトウェア開発において品質を確保するための強力な手法です。特に中級エンジニアにとって、TDDは実務における問題解決力を高めるための重要な技術です。今回は、C#を用いてTDDの実践的なケーススタディを通じて、具体的なシチュエーションにおけるテスト作成の流れとその落とし穴を探ります。
教科書レベルの解説(テスト駆動開発)
重要な概念の整理
TDDは「テストファースト」のアプローチであり、まずテストを作成し、その後に実装を行います。このサイクルは、以下の3つのステップで構成されます。
- 赤:失敗するテストを書く。
- 緑:テストを通過させるための最小限のコードを書く。
- リファクタリング:コードを整理し、品質を向上させる。
特に注意が必要なのは、リファクタリングの際にテストが常に通過することを確認することです。このプロセスを通じて、コードの可読性や保守性が向上します。
コード例(C#)
// 数値のリストから中央値を計算するクラス
public class MedianCalculator
{
public double CalculateMedian(List numbers)
{
if (numbers == null || numbers.Count == 0)
throw new ArgumentException("リストが空またはnullです。");
var sortedNumbers = numbers.OrderBy(n => n).ToList();
int count = sortedNumbers.Count;
if (count % 2 == 0)
{
return (sortedNumbers[count / 2 - 1] + sortedNumbers[count / 2]) / 2.0;
}
else
{
return sortedNumbers[count / 2];
}
}
}
コードの行ごとの解説
- リストがnullまたは空である場合に例外を投げることで、入力の妥当性を確認します。
- 数値を昇順にソートするためにLINQを使用し、リストを作成します。
- 要素数が偶数か奇数かを判定し、中央値を計算します。
- 偶数の場合は、中央の2つの値の平均を返します。奇数の場合は、中央の値をそのまま返します。
練習問題編
以下の練習問題に取り組んでみてください。各問題には模範解答と解説が付いています。
- 問題1:リストから最小値を返すメソッドを作成し、テストを記述してください。
- 問題2:リストから重複を排除するメソッドを作成し、テストを記述してください。
- 問題3:与えられた数値が素数かどうかを判定するメソッドを作成し、テストを記述してください。
模範解答と解説
問題1の模範解答:
// 最小値を返すメソッド
public int FindMinimum(List numbers)
{
if (numbers == null || numbers.Count == 0)
throw new ArgumentException("リストが空またはnullです。");
return numbers.Min();
}
このメソッドは、引数として渡されたリストの最小値を返します。リストが空またはnullの場合は例外を投げます。
問題2の模範解答:
// 重複を排除するメソッド
public List RemoveDuplicates(List numbers)
{
if (numbers == null)
throw new ArgumentException("リストがnullです。");
return numbers.Distinct().ToList();
}
このメソッドは、LINQのDistinctメソッドを使用して重複を排除します。リストがnullの場合は例外を投げます。
問題3の模範解答:
// 素数判定メソッド
public bool IsPrime(int number)
{
if (number <= 1) return false;
for (int i = 2; i <= Math.Sqrt(number); i++)
{
if (number % i == 0) return false;
}
return true;
}
このメソッドは、与えられた数値が素数かどうかを判定します。1以下の数は素数ではないため、falseを返します。
まとめ
- TDDの実践において、テストを先に書くことでコードの品質が向上します。
- 具体的なシチュエーションに基づいた問題解決能力が求められます。
- 練習問題を通じて、実務に役立つスキルを磨くことができます。