[システム開発] テスト駆動開発
Cloud システム開発
Published : 2020-12-24   Lastmod : 2020-12-24

テスト駆動開発の特徴とメリット・デメリット

テスト駆動開発の特徴

テスト駆動開発(Test-Driven Development略TDD)は、テストファーストなプログラム開発における手法の1つです。テスト駆動開発は、始めにテストコードを書いて、テストコードにマッチするようにプログラムの実装、リファクタリングを行っていくものになります。 テストファーストということもあって、実装しようとしている機能のプログラムでなくテストコードを先に書くことで、最初はテストに失敗するのですが、プログラムの実装と修正を短い工程の中で繰り返しバグをなくしていくのがテスト駆動開発になります。正しく動作するコードを書けるようになれば、続けてリファクタリングを行っていく手法なので、そこが特徴的と言えるでしょう。

テスト駆動開発は、次の3つのサイクルがあります。

レッド

まず、テスト駆動開発は「レッド」から開始されるのですが、レッドとは失敗するテストコードを書くことを指します。書いたコードがエラーになることをまずは確認するところから始める必要があるため、 このレッドでは必ず失敗するテストコードを書かなければいけないのです。もし、これがエラーにならない場合には、異常事態となり、 テストツール自体に問題がある可能性があると疑わなければいけなくなります。レッドでの重要なポイントは、実装コードにまったく何も書かれていない場合でも、まずはテストコードを書く、そして、テストが失敗するのを確かめるということです。テストツールを使うと、テストが失敗すれば赤色のエラー表示がされるので、レッドと呼ばれます。

グリーン

レッドでテストコードが書き終われば、次は「グリーン」の機能の実装に移ることになります。グリーンでは完璧なコードを書くことが目的ではなく、先に設定したテストに通るための必要最小限のコードを書くということを目的としています。グリーンは、テストが成功に終わる状態のことを言います。テストが成功に終わる状態ならば基本的に何でも大丈夫なので、 かなりテキトーなコードであっても、とにかくテストに成功すればそれで良いのです。とりあえずテストに通ることを目的としているのが、グリーン環境なのです。

リファクタリング

グリーンの次は「リファクタリング」です。グリーンでテストに成功しても、まだ意味のあるコードとは言えず、それでは役には立たないものです。そのこともあり、リファクタリングを行ってコードの可能性を高めて意味のあるコードにする必要性があります。グリーンの段階でテストに通っているから大丈夫だろうと放置しておくと、プログラムの規模が大きくなるごとに修正する負担が増えてしまい、もはや手がつけられなくなるのです。そのために、グリーンでテストに成功すれば、すぐにリファクタリングを繰り返し行うことがベストになります。このように、テスト駆動開発は、レッド→グリーン→リファクタリングという順番で進めていきます。

テスト駆動開発を利用するメリット

テスト駆動開発を利用するメリットとして、主に下記の点が挙げられます。

  • 早い段階でバグを発見することができる
  • システムの仕様や要件を詳しく理解できる
  • 開発者の心理的負担を軽減できる

1つずつ見ていくと、早い段階でバグを発見することができる点が、テスト駆動開発の1つ目のメリットです。テスト駆動開発ならばコードを確認しながらコーディングを進めることができるので、素早くバグを見つけられます。モジュール、ユニットレベルごとにテスト、実装、リファクタリングを繰り返し行うので、開発初期段階で不具合を見つけられて修正することができるようになるのがテスト駆動開発の魅力です。コードがテストに通れば、手戻りの発生がないことが確認できます。発見が早ければデバッグにかかる時間を大きく減らすことができ、開発をスムーズに進めることができるのです。後工程にバグを持ち越さずに済むので、非常に助かると言えるでしょう。

そして、テスト駆動開発の2つ目のメリットですが、それはシステムの仕様や要件を詳しく理解できるという点です。始めにテストコードを書くときに、必要なシステム要件を細分化しリストアップしていくので、仕様を理解しやすいのがメリットとなります。そして、テストと実装を繰り返す過程の中で、テストコードと実装内容の乖離に気づけるため、仕様、要件をしっかりと理解していくことができるのです。

テスト駆動開発の3つ目のメリットですが、開発者の心理的負担を軽減できるという点になります。開発における懸念点の1つが、追加のコーディングやリファクタリングを行う場合にプログラムが壊れてしまうことです。このことで、開発者はこれらの作業を行う場合に大きな心理的負担がかかるのです。しかし、テスト駆動開発を採用することで、テストコードを何回も試せてプログラムを壊してしまっていないか確認しやすいのです。簡単にテストが行えれば開発者も安心して作業に集中でき、心理的負担をかなり減らすことができます。常に異常がないことを確認しながら開発を進めていけるので、開発者が安心して作業を行えるのがメリットとなります。

テスト駆動開発を利用するデメリット

テスト駆動開発はメリットだけでなく、デメリットもあります。そこで、下記でその主なデメリットについてご紹介していきます。

  • テストコードの実装・保守に時間がかかってしまう
  • メンテナンスをするのが大変なことがある
  • 慣れるまで時間がかかる

テスト駆動開発の1つ目のデメリットとして、テストコードの実装・保守に時間がかかってしまうという点です。テストコードを書くために相当な時間がかかります。そして、書いたテストコードを保守しなければならないので、そのことが負担となってしまうことも考えられるのです。それでも、正しく適切にテストコードを実装することで、バグの修正など、レッド後の手間を減らすことができるので、トータルではスムーズな開発が可能となります。

テスト駆動開発の2つ目のデメリットとして、メンテナンスをするのが大変なことがあるという点です。仕様変更に伴いメンテナンスをしようとした場合、規模が小さいものだとそうでもありませんが、大規模なプログラムで複数機能の仕様変更があれば、これはかなりの手間となり、メンテナンスをするのが大変と言えます。そのため、そこがデメリットとなるでしょう。

そして、テスト駆動開発の3つ目のデメリットとして、慣れるまで時間がかかるという点になります。従来の開発手法に慣れている開発者の場合、新たにテスト駆動開発にシフトチェンジするには時間と労力がかかります。手法が異なることもあり、慣れるのに時間がどうしてもかかってしまうのです。中でも、テストコードを書く作業は非常に大変なため、自身の意図するテストコードを作り上げるには、スキルや経験が必要になるでしょう。さらに、テスト駆動開発を導入した目的を開発チーム内でしっかりと共有しておかないと、負担がとても大きくなる可能性もあるのです。ですので、その点もテスト駆動開発のデメリットの1つとなります。テスト駆動開発にはメリットとデメリットの両面が存在するために、これらのことをよく熟知しておくことが大切です。適切にテスト駆動開発を進めていけば、時間短縮、負担の軽減が期待できるため、とても注目されているのがテスト駆動開発になります。

関連する記事