導入
テスト駆動開発(TDD)は、ソフトウェア開発のプロセスにおいて、テストを先に書くことでコードの品質を高める手法です。特に中級エンジニアにとって、TDDは日々の開発業務において重要なスキルとなります。本記事では、TypeScriptを用いた具体的なシチュエーションを通じて、TDDの実践的なアプローチを学びます。
教科書レベルの解説(テスト駆動開発)
重要な概念の整理
TDDの基本は「赤・緑・リファクタリング」のサイクルです。まず失敗するテスト(赤)を作成し、その後そのテストを通過させるための最小限のコード(緑)を実装します。最後に、コードを整理し、可読性や保守性を向上させるリファクタリングを行います。このサイクルを繰り返すことで、機能追加やバグ修正が容易になります。
コード例(TypeScript)
class Calculator {
add(a: number, b: number): number {
return a + b;
}
subtract(a: number, b: number): number {
return a - b;
}
}
// テスト
describe('Calculator', () => {
let calculator: Calculator;
beforeEach(() => {
calculator = new Calculator();
});
it('should add two numbers correctly', () => {
expect(calculator.add(2, 3)).toBe(5);
});
it('should subtract two numbers correctly', () => {
expect(calculator.subtract(5, 2)).toBe(3);
});
});
コードの行ごとの解説
- class Calculator { – Calculatorクラスを定義し、基本的な計算機能を提供します。
- add(a: number, b: number): number { – 2つの数値を受け取り、その合計を返すメソッドです。
- subtract(a: number, b: number): number { – 2つの数値を受け取り、その差を返すメソッドです。
- describe(‘Calculator’, () => { – テストスイートを定義し、Calculatorクラスのテストをまとめます。
- beforeEach(() => { – 各テストの前に新しいCalculatorインスタンスを作成します。
- it(‘should add two numbers correctly’, () => { – addメソッドが正しく動作するかを検証するテストケースです。
- expect(calculator.add(2, 3)).toBe(5); – 期待される結果と実際の結果を比較します。
- it(‘should subtract two numbers correctly’, () => { – subtractメソッドが正しく動作するかを検証するテストケースです。
- expect(calculator.subtract(5, 2)).toBe(3); – 期待される結果と実際の結果を比較します。
練習問題編
以下の練習問題に取り組むことで、TDDの理解を深めてください。
- 問題1: 乗算メソッドをCalculatorクラスに追加し、テストを作成してください。
- 問題2: 割り算メソッドをCalculatorクラスに追加し、0で割った場合のエラーハンドリングを含めたテストを作成してください。
- 問題3: Calculatorクラスに履歴機能を追加し、過去の計算結果を取得するメソッドを実装し、そのテストを作成してください。
模範解答と解説
問題1の模範解答は、addメソッドと同様にmultiplyメソッドを追加し、適切なテストを作成することです。問題2では、divideメソッドを追加し、0で割った場合に例外をスローするテストを作成します。問題3では、計算結果を配列で保持し、履歴を取得するメソッドを実装します。
まとめ
- TDDはソフトウェアの品質を高める手法であり、実務において役立つスキルです。
- テストを先に書くことで、コードの設計が改善されることがあります。
- 練習問題を通じて、TDDの実践的な理解を深めることができます。