システム開発には、さまざまな開発手法があります。
企画段階でシステムの仕様を決めて上流工程から下流工程まで順次進める「ウォーターフォール開発」と小さな単位でテストと実装を繰り返す「アジャイル開発」の2つが代表的です。
今回は、アジャイル開発で取り入れられている、テスト駆動開発という手法について、内容と目的をご紹介します。
テスト駆動開発とは?

テスト駆動開発(Test-Driven Development)とは、テスト用のプログラムであるテストコードを初めに作成してから、そのテストを通過するようにテストコードの実装、修正を繰り返す開発手法です。
まず、システムに必要な機能を全体的に定義した後、それに基づいて各機能が実装されるであろう条件からテストコードを作成していきます。あくまでテストコードのため、この時点でテストを行っても通りません。
テストコードを書いてテストが通らないことを確認した後は、今度はテストに合格するための最小限のコードとして修正していきます。
これを何度も繰り返して徐々に通過するテストを増やしていき、その過程で重複したコードを削除、修正等を行い最適化していきます。このコードを最適化する工程は、リファクタリングとも呼ばれます。
テスト駆動開発では「コーディング→テスト→リファクタリング」の工程を何度も繰り返し、プログラムを完成させます。
テスト駆動開発のメリットは3つ
テスト駆動開発のメリットとして、次の3つが挙げられます。
- 開発する機能についての仕様の理解が早まる
- バグを早期に発見、修正できる
- 質の高いプログラムを実装できる
それぞれの詳しい内容を解説します。
1.開発する機能についての仕様の理解が早まる
テストコードは、機能について細分化して理解しなければ書くことはできません。テスト駆動開発では、はじめにテストコードを書くため、早い段階で仕様を理解できます。
さらに、その後もテストコードを何度も繰り返し書くことで、理解をより深められます。
2.バグを早期に発見、修正できる
テスト駆動開発では、小さい単位からプログラムを開発して、こまめにテストを繰り返します。
その都度バグを発見すれば、デバッグを行いバグを修正していくため、後に重大なバグが発見されて手戻りが発生してしまうリスクを減らせます。
これにより、開発者の負担も軽減されて、開発に伴う心理的な不安も軽減されるしょう。デバッグについては、こちらの記事でも詳しく紹介しているのでぜひご確認ください。
3.質の高いプログラムを実装できる
小さい単位からプログラムを書いてリファクタリングを繰り返すため、無駄なコードがなく質の高いプログラムを実装できます。
テスト駆動開発のデメリットは2つ
テスト駆動開発はメリットが多い反面、デメリットもあります。主なデメリットは次の2つです。
- 開発にかかるコストが増える傾向にある
- テスト駆動開発に慣れるのに時間がかかる
それぞれの詳しい内容を解説します。
1.開発にかかるコストが増える傾向にある
テスト駆動開発では、本体のプログラムとは別にテストコードも書くため、管理しなければならないコードが多くなります。
また、途中で大きな仕様変更が起こり手戻りが発生するとテストコードから修正しなければならなくなるため、かかるコストも増えます。
2.テスト駆動開発に慣れるのに時間がかかる
テスト駆動開発は、コーディング→テスト→リファクタリングを繰り返す手法のため慣れが必要です。
初期段階で意図した通りのテストコードを書くには、ある程度の技術や経験が求められます。テスト駆動開発の導入について開発チーム内でよく共有して、少しでも早く慣れる必要があります。
テスト駆動開発の4つの種類
テスト駆動開発は、大きく次の4つの種類に分類されます。
- ユニットテスト
- 統合テスト
- 回帰テスト
- 受入テスト
それぞれの種類についてご紹介します。
1.ユニットテスト
ユニットテストとは、プログラムを構成するそれぞれの単位(ユニット)が、個々の機能を満たしているかを確認するテストです。ユニットテストは「単体テスト」とも呼ばれます。
複数機能を組み合わせて行う結合テストよりも前の段階で実施するテストであるため、不具合の特定や修正が容易です。
このユニットテストの段階でテスト駆動開発手法を用いることで、機能単位で質の高いプログラムを実装できます。
2.統合テスト
統合テストは、個々の機能を複数組み合わせて動作を確認するテストです。ユニットテストで検証したプログラムを組み合わせて動作させ、不具合を発見・修正します。
ユニットテストで正常に動いたモジュールも、複数が組み合わされると不具合が発生する可能性もあります。そのため、統合テストの段階で不具合をさらに解消します。
3.回帰テスト
回帰テストとは「リグレッションテスト」とも呼ばれ、機能の追加や変更があったプログラムに対して、デグレードが発生していないかを確認するテストです。
システムの規模が大きいほど、修正した箇所の影響が広範囲に及ぶことが多く、不具合が発生する可能性を見落としてしまいがちです。
テスト駆動開発手法により作成されたテストコードは、回帰テスト時にも役立ちます。テストが正確に行われれば、その分デグレードのリスクも低くなります。
デグレードについては、こちらの記事でも詳しく紹介しているのでぜひご確認ください。
4.受入テスト
受入テストとは、システム開発の発注側が実際の業務同等またはそれに近い環境で実際にシステムを動作させるテストを指します。
発注側に業務の中でテストしてもらうため、イレギュラーな不具合を発見しやすいのが特徴です。受入テストは開発側での実装や一通りのテストが終わった状態で行われることが多いです。
テスト駆動開発の手法には、開発に先立って「受入テストケース」や「テストコード」を作成して、開発を進めて行く方法があります。これを、受入テスト駆動開発「Acceptance Test Driven Development」とも呼びます。
受入テストのテストケースを開発に先立って作成することで、開発側と発注側の認識のずれを早期に発見し、解消できるメリットがあります。受入テストについては、こちらの記事でも詳しく紹介しているのでぜひご確認ください。
テスト駆動開発の目的とは?
テスト駆動開発はテストから先に書く、テストファーストな方法が特徴ではありますが、この手法を取り入れる一番の目的は質が高く、かつ可読性に長けて正しく動くプログラムを書くことです。
システムは仕様通りに正しく動くことが大前提です。そしてその後に、メンテナンスがしやすい、質の高いプログラムかどうかが求められてきます。
テスト駆動開発は、システムとして正しく機能するためのプログラムを小さい単位で「コーディング→テスト→リファクタリング」を繰り返しながら作り上げていくため「システムとしての仕様を満たしながら、かつ保守性・拡張性の高いプログラム」を実現出来る手法であるといえます。
【まとめ】テスト駆動開発について理解を深めよう
テスト駆動開発は、質の高いプログラムを書くための重要な開発手法です。まずはテストコードを書くという、普段の実装では行わない順序で作業が進むため、最初は慣れるまでに時間やコストがかかる可能性があります。
しかし、不具合が少なく、保守性・拡張性の高いプログラムを作り上げるためには最適な手法といえるでしょうテスト駆動開発についての理解を深めて、開発手法の候補として取り入れてみてはいかがでしょうか。