システム開発において、「バグを直したら、別の場所が動かなくなった」「コードが複雑すぎて、新機能の追加に時間がかかる」といったことがあります。
変化の激しい現代の開発現場では、スピードだけでなく「変更に対する強さ(品質)」が強く求められます。

そこで今回は、コードの品質を担保しつつ、エンジニアのスキルアップにも直結する開発手法、「テスト駆動開発(TDD)」について、解説します。

テスト駆動開発(TDD)とは?

TDD(Test-Driven Development)とは、「プログラムの本体を書く前に、まずテストコードを書く」という開発手法です。

通常は「コードを書く」→「テストする」という順番ですが、TDDではこれを逆転させます。基本的には以下の短いサイクル(通称:レッド・グリーン・リファクタリング)をぐるぐると繰り返しながら開発を進めます。

レッド(失敗): まだ実装していない機能に対するテストを書く(当然テストは失敗します)。
グリーン(成功): そのテストを通過させるための、最低限のプログラムを書く。
リファクタリング(改善): テストが成功する状態を保ちながら、コードを綺麗に整理する。

メリットとして、プログラムを書く前に「どのように使われるか(インターフェース)」をテストコードとして記述するため、自然と「呼び出しやすく、他の機能に依存しすぎない(疎結合な)設計」になります。結果として、複雑に絡み合った「スパゲッティコード」になりにくく、保守性の高いシステムが作られます。

TDD実践例(React(フロントエンド)とGo(バックエンド)を用いた「TODO管理アプリ」の開発)

1. バックエンド(Go)側:
例えば「TODOのデータをJSONファイルに保存する」という機能を作るとします。 いきなり保存する処理を書くのではなく、まずは「タスクを渡したら、正しくJSON形式で保存されること」を期待するテストコードを書きます。
テストを書くためには、「どのようなデータを受け取るか」「どのような結果を返すか」を先に決める必要があります。これにより、実装前にAPIの設計(インターフェース)が洗練されるという大きなメリットがあります。
2. フロントエンド(React)側:
フロントエンドでもTDDは有効です。「TODOを追加するボタン」を作る場合、「ボタンがクリックされたら、新しいタスクがリストに追加されること」というテストを先に書きます。
UIの見た目(デザイン)を作る前に、ユーザーの操作に対する「振る舞い」のテストを固めることで、後からデザインを変更しても機能が壊れない、頑丈なコンポーネントを作ることができます。

まとめ

・コードより先にテストを書く プログラム本体を実装する前に、まず「期待する動作(テストコード)」を記述する開発手法
・3つのステップを繰り返す 「レッド(失敗)→グリーン(成功)→リファクタリング(改善)」という短いサイクルを回しながら開発を進める。
・変更に強いシステムが作れる コードが複雑に絡み合う「スパゲッティコード」化を防ぐことができ、バグを恐れずに機能追加ができる保守性の高いシステムを実現。