テスト駆動開発(TDD)とは? | 品質を保証するテストではない

【注目記事】

・SEの転職体験談 | 受託開発から自社製品開発へ
・SIer勤務のSEがパソナキャリアに相談してみた
・SIer勤務のSEがマイナビエージェントに相談してみた

ソフトウェアの開発手法の1つである「テスト駆動開発」を紹介します。

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

開発手法の1つ

テスト駆動開発(TDD)は、ソフトウェアを効率的に開発するための開発手法の1つです。

テスト駆動開発では最初にテストを作成し、そのテストを通すことを目指してプログラムを書きます。

テストはどのようにプログラムを書くのかを検討する「補助線」になります。

なお、テスト駆動開発の「テスト」は、必ずしも製品の仕様を満たしているかを確認するためのものではありません。

開発の過程で「 次にどのような挙動ができれば先に進めるのかを示す」ためのもので、製品の仕様を満たしているかのテストは追加で実施します。

メリット

進捗が明確になる

テストがどこまで成功しているかをみれば、開発の進捗が明確に分かります。

進捗が明確になることで、より正確な情報に基づいて対策※が打てます。

※ (例) 進捗が遅れている場合、スケジュールやリソースの調整をする

疎結合な設計を促す

基本的にメソッド単位でテストを作成するため、プログラムが密結合だと確認したい単位でテストが作れません。

結果、疎結合で設計しようというモチベーションにつながります。

不具合の発生を減らせる

テストを作る際に要求を精査したり、考慮すべきパターンを網羅的に把握しようとするため、開発フェーズでの不具合を減らせます。

海外の事例では不具合が20%近く減少しました。

(参考)TDD(テスト駆動開発)の適用評価を紹介した研究論文 – エリクソンはじめ3社 | オルタナティブ・ブログ

開発者の不安を減らせる

開発中は様々な不安を感じます。

どのように仕様を実現すればいいのか、パターンを網羅できているのかなど考えることは沢山あり、それらが整理できないと不安が大きくなります。

テスト駆動開発ではやるべきことを全てテストという明確な形で表現し、それを成功させることだけに集中するため状況を整理でき、開発者の不安を軽減します。

一人で始められる

テスト駆動開発はエンジニア個人で完結して実施できるため、関係者を説得したりといったコストが不要です。

デメリット

開発工数が増加する

今までの開発に加えて、テストの作成と実行が必要なため、開発工数が増加します。

テスト駆動開発を導入しなかった場合と比べて約20%工数が増加したというデータもあります。

(参考) テスト駆動開発(TDD)の事例 – IBMとMS 計4プロジェクトを紹介した論文 – | オルタナティブ・ブログ

仕様変更が多いとテストのメンテナンスが大変

新製品開発などで仕様変更が頻繁する場合、テストコードのメンテナンスに多大な工数が必要になります。

そのようなケースは、テスト駆動開発に向かないことが多いです。

導入箇所の判断が重要

テスト駆動開発のデメリットを抑えるためには、導入箇所の判断が重要です。

テスト駆動開発の適用判断

テスト実行時間が短く仕様変更が少ない箇所は積極的に導入し、それ以外は時間がかかる部分をモックで代用したり、自動テストを諦めるといった対応をします。

実践方法

基本手順

テスト駆動開発の手順は次の通りです。

1.レッド:動作しない、おそらく最初のうちはコンパイルも通らないテストを1つ書く。

2.グリーン:そのテストを迅速に動作させる。このステップでは罪を犯してもよい。

3.リファクタリング:テストを通すために発生した重複をすべて除去する。

(引用)『テスト駆動開発』 | Kent Beck 著 | 和田 卓人 訳

1.レッド:動作しない、おそらく最初のうちはコンパイルも通らないテストを1つ書く

製品のプログラムを書く前に、まずはテストを書きます。

1つ1つの実装に集中するため、テストを1つ書いたらそれが成功するまで次のテストは書きません。

やるべきことを同時に複数思いつくこともありますが、その場合はTODOリストに追加しておき後で取り組みます。

また、1つのテストで複数の観点を確認しようとすると一度に考えるべきことが増えてしまうため観点を絞ります。

どこからテストを書けばいいか迷う時は、手を付けやすい所からスタートします。

2.グリーン:そのテストを迅速に動作させる。このステップでは罪を犯してもよい

プログラムの重複や値のベタ書きなどを気にせず、最短でテストの成功を目指します。

とくかく動作する状態にすることで、その後はプログラムの改善に集中できます。

3.リファクタリング:テストを通すために発生した重複をすべて除去する

重複を削除したり、どんな値が来ても対応できるように一般化したりといったリファクタリングをします。

修正を加えるたびにテストを実行し、デグレードがないかを確認しながら作業します。

デグレードを心配せずに済むので、安心してリファクタリングに集中できるのがテスト駆動開発の良い所です。

備考

デザインパターンとの整合性

MVCやMVPなどのデザインパターンを導入することで、結合度が低く凝集度が高いシステムを構築できます。

デザインパターンは開発途中での導入が難しいため、開発前にどれを採用するのかを決めます。

テスト駆動開発はテストを先に書くことが基本のルールですが、デザインパターンは上記の理由でルールの対象外と考えます。

参考書籍

テスト駆動開発に関する代表的な書籍で、ペアプログラミンする感覚でテスト駆動開発を学べます。


【おすすめ記事】


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です