テスト駆動開発とは、ソフトウェア開発におけるベストプラクティスの一つ(効率の良い開発技法や手法のこと)です。
プログラム開発に携わっていれば、テスト駆動開発という言葉を耳にしたことがあるかもしれません。

今回は、より実践的なテストを理解するために、テスト駆動開発の概要とその流れについて解説していきます。

テスト駆動開発

テスト駆動開発は、テストファーストのプログラム開発手法です。
英語で「Test-Driven Development(TDD)」と呼ばれているように、まずテストを書いてからそのテストが通るようにコードを書いていく方法を指します。

一般的にはコードを書いてからテストを実装するイメージがありますが、その反対のアプローチがテスト駆動開発です。

テスト駆動開発の流れ

テスト駆動開発は、テストが成功した場合の「グリーン」、失敗した場合の「レッド」、さらにコードの改善を行う「リファクタリング」の状態を1つのサイクルとして構成しています。

Jestをはじめとするテストフレームワークを使うと、緑文字で「PASS」、または赤文字で「FAIL」と表示されるように、テストの結果が色分け表示されることから、グリーンやレッドと呼ばれています。

では、もう少しテスト駆動開発の流れを細かく見ていきましょう。

1. テストを書く

テスト駆動開発では、プログラムの実装の前にテストコードを記述します。
そのため、開発者はプログラムの機能や仕様を十分に理解している必要があります。

2. テストが失敗する

この時点ではプログラムが実装されていないため、テストは必ず失敗します。
テストが失敗するという動作により、テストフレームワークが正常に動いているかを確認するためです。
この工程のことをレッドと呼びます。

3. コードを書く

上記でテストフレームワークが正常に動くことを確認したら、次はテストが通るためのコードを書いていきます。
ここでは、テストが成功するための必要最低限のコードを確実に記述することが重要です。
この工程のことをグリーンと呼びます。

4. テストが通る

コードを書き終えたらテストを実行し、テストが通ることを確認します。

5. コードを改善する

テストが通過することを確認したら、テストが成功する状態を保ちながらコードの可読性を高めるために改善を行なっていきます。
この工程のことをリファクタリングと呼びます。

テストが成功したからと言ってリファクタリングを後回しにしてしまうと、プログラムの規模が大きくなるにつれて修正への負担が増えたり、どの部分を修正すれば良いのか分からなくなってしまう場合があります。
そのため、テストが通過する度にコードをリファクタリングしていくことが大切です。

6. 繰り返す

プログラムの安全性、コードの可読性を高めていくために、上記のステップを繰り返します。

テスト駆動開発を行うメリット

テスト駆動開発は、テストコードを記述しながら開発を進めていくため、プログラムの機能に加えてテストコードのメンテナンスが必要です。
そのため、開発コストが大きくなってしまうことや、そもそも開発手法に慣れていない場合には難しく感じることがあります。

一見遠回りに感じる開発手法にも見えますが、どのようなメリットがあるか知っておくことも大切です。

最大のメリットとしては、予めコードがどのような動きをするのか明確にできることです。開発段階から不具合を察知し修正することが容易くなるため、バグが発生しても後工程に影響することが少なくなります。
こまめにテストが行えるような環境であれば、品質的メリットだけでなく、開発者が安心してコーディングを行える側面もあります。

また、テスト駆動開発では、テストコードの作成と実際の機能を加えながら繰り返し行なっていくため、システムの要件や仕様の理解にも繋がります。

まとめ

今回は、テスト駆動開発とは何か、またその流れについて解説しました。

テスト駆動開発は、テストコードと必要な機能の実装をこまめに積み重ねて行う開発手法の一つです。
開発のプロセスやコストを考えると容易い手法ではありませんが、必要な機能を無駄なく確実に作ることで品質向上に期待ができます。

メリットとデメリットを理解したうえで採用するのはもちろんですが、まずは小さなプログラムから練習してみると実践の場で役に立ちます。

合わせて読みたいテストシリーズ

第1回:テストフレームワーク -Jest
第2回:テストコードの書き方
第3回:テスト駆動開発(当記事)