テスト駆動開発とは
テスト駆動開発とは、はじめにテストコードを書いてからプログラムを実装する開発方法です。綺麗で、かつ正しく動くプログラムを実装するのが、テスト駆動開発の目的です。
テスト駆動開発におけるテストとは、テスターが行うテストのことではありません。バグを洗い出すものではなく、開発が計画通りに進んでいるか確認するためのものです。そのため、誤解を避けるために「振る舞い駆動開発(BDD)」と呼ばれることもあります。
テストというより、動作チェックと考えたほうがよいでしょう。
テスト駆動開発を行うメリット・デメリット
では、テスト駆動開発には具体的にどのようなメリット・デメリットがあるのでしょうか。
メリット:バグを早期に発見できる
テスト駆動開発では、モジュールやユニットごとにテストを行います。バグがある場合はその段階で発見できるため、後の負担が減少するのがメリットです。発見が早いほど手戻りに割く労力が少なく済むうえ、デバッグに要する時間も減るため、結果的にスムーズに開発が進みます。
メリット:要件や仕様を理解しやすくなる
テストコードを書くには、要件を細分化し、理解しなければなりません。はじめにテストコードを書くことで、仕様への理解も早まります。また、逐次テストを行うことで、その都度対象への理解を深めていくことができます。
メリット:開発の心理的負担が軽減される
開発における大きな懸念の1つが、追加のコーディングやリファクタリングでプログラムが壊れることです。開発者はそれらの作業をする際、心理的負担がかかります。
テスト駆動開発であれば、追加のコーディングやリファクタリングを行うたびにリグレッションテストを行えます。リグレッションテストとは、機能追加やバグ修正に伴い、ほかの部分に異常が生じていないか確認するテストのことです。
異常がないことを確認しながら作業できるため、開発者の心理的負担が軽減するでしょう。
デメリット:慣れるのに時間がかかる
それまで親しんできた開発手法から、テスト駆動開発へシフトするには時間や労力がかかります。特に、初期段階でテストコードを書くのは大変です。意図したとおりのテストコードを作るには、ある程度の経験が求められるでしょう。
テスト駆動開発の導入目的を開発チーム内でよく共有しておかなければ、メリットより負担のほうが大きくなる恐れがあります。
デメリット:テストコードの実装・保守に時間がかかる
テストコードを書くのに時間がかかるため、開発初期段階の負担が大きくなります。また、一度書いたテストコードの保守も必要です。特に慣れないうちは高品質なテストコードを作成できず、それを修正するのにも時間がかかります。
しかし、適切にテストコードを実装できれば、バグの修正など後の手間を大きく削減できます。結果的に、より早く開発が完了するでしょう。
テスト駆動開発のサイクル
つづいて、テスト駆動開発の流れを見ていきましょう。
レッド:テストに失敗するコードを書く
テスト駆動開発は、必ず失敗するテストコードを書くところから始めます。なぜなら、異常があるコードがテストにパスしてしまったら大きな問題となるためです。コードが白紙の状態でテストを書き始め、それが正しく失敗になることを確認します。
グリーン:テストに成功するコードを書く
次に、テストにパスするコードを書きます。この段階で大切なことは、テストにパスできる最小限のコードにすることです。あくまで、要件を満たしたコードが正しくテストにパスできるかを確認する作業だからです。
リファクタリング:読みやすいコードへ改善する
レッドとグリーンを経ても、まだコードは役に立つ状態ではありません。テストにパスすることが確認できただけです。テストにパスできる状態を維持し、拡張性や保守性を改善する工程がリファクタリングです。
テストにパスできるのだから、リファクタリングは必要ないと考える人もいるかもしれません。しかし、汚いコードをそのままにしておくと、後で収拾がつかなくなります。テストのパスとリファクタリングを繰り返すことで後の負担を軽くするのが、テスト駆動開発の肝です。
テスト駆動開発を行う際のポイント
テスト駆動開発を行う際には、以下の2点に注意しましょう。
- テストに時間を掛け過ぎない
- テスト駆動開発の難点はテストに時間がかかることです。テストコードの作成からメンテナンス、そして実際のテストまで時間を要します。
- そのため、テスト駆動開発の導入箇所をよく検討することが大切です。納期が短い場合や仕様変更が頻発する開発には適しません。また、テストを行う際はアクセスに時間がかからないリソースを活用するなどの工夫をしましょう。
- テスト項目の漏れに注意する
- テストの項目に抜けがある場合、テストにパスしても安心はできません。テスト駆動開発が単に安心感を得るための方法に形骸化するのを防ぐには、過不足のないテストを作成する必要があります。
- 開発者同士でテストコードのレビューをするなど、継続的な改善に務めましょう。
テスト駆動開発を採用し、無駄のないコーディングを!
テスト駆動開発とは、はじめにテストコードを用意したうえで開発に取り組む方法です。レッド・グリーン・リファクタリングのサイクルで進めます。慣れるまでは大変ですが、バグの早期発見や開発者の負担軽減が実現します。
実際にテスト駆動開発を行う際には、開発ツールの活用がおすすめです。プログラミングや工程管理、テストを効率化できます。うまく活用して、無駄のないソフトウェア開発を実現しましょう。