
テスト駆動開発
ソフトウェア開発に関係する用語で、テスト駆動開発やテストファーストなどという言葉を耳にしたことがあるかと思います。今回はこれらの概要、メリット・デメリット、知っておくべき注意点について解説していきます。
1.テスト駆動開発とは?
テスト駆動開発(TDD:Test-Driven Development)とは、ソフトウェアの要件を満たすためのテストコード(以下、テスト)を作成し、そのテストを通すためのプロダクトコード(以下、コード)を作成・変更することで開発を進める手法です。
具体的には以下の3つのステップを繰り返します。
1. レッド:動作しないテストを作成する
まず、何もない状態からソフトウェアの要件を満たすテストを書くため、 最初は必ずテストに通りません。このように、テストから書き始めるという方法がテストファーストと呼ばれます。
テストに通らない時、テストツールは赤色でエラーを表示することが多いため、このステップはレッドと呼ばれます。
2. グリーン:テストを通すためのコードを書く
次に、ステップ1で作成したテストを通すためのコードを書きます。この時にポイントとなるのが、一刻も早くテストに通すことだけを考えるため、コードの妥当性などは後回しにし、べた書きも許容します。
テストに通った時、テストツールは緑色で成功を表示することが多いため、このステップはグリーンと呼ばれます。
3. リファクタリング:テストを通すために生じた重複を除去する
最後に、ステップ2で後回しにしたコードの妥当性について見直します。メソッドの共通化やべた書きを変数にするなどの改善を施し、コード内の重複を除去します。
簡潔にいえば、テストを書き、動作させ、それから正しくするという流れです。
テストファーストはテストだけを先に羅列していくことではなく、テストをひとつ書いたらコードを実装するという、ステップ1→ステップ2を小さなサイクルで進めることが前提の考え方です。そしてその後のステップ3にあたるリファクタリングと、それを含む大きなサイクルの中で思考し、仕様を理解したうえで設計を改善していくという部分がテスト駆動開発の本質であり、ここが単なるテストファーストとの違いとなります。
さて、次はテスト駆動開発のメリット、デメリットについて見ていきましょう。
①メリット
●欠陥の減少
テスト駆動開発において、コードはテストをパスするように書かれるため、書いたコードは基本的に少なくとも一回はテストされます。これにより欠陥はすぐに発見→修正され、欠陥が作りこまれるリスクは低減し、手戻りも少なくなります。
●保守性の向上
テスト駆動開発のサイクルを通して作成されたコードは、新たな機能追加や修正をした際にも同様にサイクルを実行し、既存のテストが通らない部分を影響範囲として特定できます。また、デグレの防止にもつながるため、既存機能を担保しつつ、より短時間で必要な部分のみを修正することができるようになります。
加えて、テスト内容を見ることで、コードで実現されるべきことが分かるといった副次的な効果もあります。
②デメリット
●開発コストの増加
テスト駆動開発ではテストを書くための工数が増加し、最終的に「テストコードの行数≒プロダクトコードの行数」となると言われています。また、その書いたテストをメンテナンスするためのコストもついてきます。これらの増加した工数がメリットにより回収できるかは十分に分析する必要があります。
●効果実感までに時間がかかる
初めのうちはテストから書き始めるという方法に慣れず、どれくらいのペースでテストを回していくと効率的になるのかなどのノウハウもないため、テスト駆動開発の効果を実感するまでにはどうしても時間がかかってしまいます。
2.テスト駆動開発の注意点
テスト駆動開発のメリット・デメリットが分かったところで、次は知っておくべき注意点について触れたいと思います。
●既存コードに適用する場合は対象を選別する
既存のコードにテスト駆動開発を適用する場合、対象を選別する必要があります。
テストのことを考えずに書かれたコードはテストしにくいことが多いため、テストをするために修正 する必要があります。しかし、テストがない状態で修正すると、失敗したときに気づけないので修正できないといったデッドロックが発生してしまいます。
そのため、まずは対象を選別し、ペアで慎重に作業しテスト以外の方法でフィードバックを得ながら進めたり、ひとまずシステムレベルのテスト結果をフィードバックとするなどして進め、 徐々に範囲を広げていく必要があります。
●すべてのソフトウェアに対して適用できるわけではない
セキュリティや並列処理に関する部分に関しては、テスト駆動開発の適用が難しいとされています。
ソフトウェアがセキュアであるかどうかは人の判断が必要であり、並列処理も再現の難しい環境・状況は「機械的にこのテストが通れば問題ない」とすることが難しく、テスト駆動開発は適用しづらいと言われています。
ただし、テスト駆動開発により欠陥の少ないコードを作成することで一定のセキュリティの向上などは見込めるため、目的を限定して適用することには効果があるでしょう。
●テスト駆動開発はテストではない
テスト駆動開発によるコードへ信頼が積み重ねられることで、「テスト駆動開発をしているから問題はない」「テストは不要」といった考えに陥ってしまう時があります。
しかし、テスト駆動開発はあくまで設計を進めるための手段であり、テストを目的とした手段ではありません。そのため、第三者的な観点で実施されるテストや負荷テスト、先述のセキュリティに対するテストなどは、テスト駆動開発を採用したとしても、他の開発同様に必要となります。
3.まとめ
今回は、テスト駆動開発の概要と、メリット・デメリット、知っておくべき注意点について解説しました。
テスト駆動開発はハードルが高そうと思った方もいるかもしれませんが、正しく理解し活用することで高品質なソフトウェアを少ないリードタイムで作成できる可能性を秘めています。
競争力の高いソフトウェア製品づくりに、ぜひテスト駆動開発を取り入れてみてはいかがでしょうか。