実体験!テスト駆動開発(TDD)を始めてみたら開発が変わった話

アイキャッチ画像

はじめに

本記事はIT会社勤務の元Java研修講師が、ウォーターフォールモデルで開発していたところから、テスト駆動開発へと手法が変わった話とそれに伴う戸惑いや私自身の成長をお話しできればと思います。

開発手法

  • ウォーターフォールモデルの特徴
    • 線形なプロセス

ウォーターフォールモデルとは、開発工程(要件定義⇨設計⇨実装⇨テスト)を上流工程(要件定義⇨設計)から下流工程(実装⇨テスト)と順番に進めていく、開発手法です。上から順番に下に向かって作業が流れるので、滝のようと例えて「ウォーターフォールモデル」と言われています。

特徴として以下の3つが挙げられます。

  • 各工程の完了

前の工程が完了していないと次の工程へ進めません。

  • 進捗の把握

各工程の完了状況が明確になるため進捗状況が把握しやすい。

  • 手戻りの最小化

各工程を確実に完了させることで、ミスを減らし前の工程に戻ることが発生しにくくなります。

上記のような特徴から、「進捗状況が把握しやすい、各工程でチェックをしているので品質が保たれやすい、各工程でやることが明確なので計画を立てやすい、計画を立てやすいことからコストも見積もりやすい、大規模プロジェクトに適している」などが挙げられます。

次にテスト駆動開発の特徴についてです。

  • テスト駆動開発
    • 不具合を早い段階で検出できる

開発者はまずテストコードを書き、そのテストを正常に通ることができるような最低限のコードを実装します。これにより、実装とテストが同時に行われるため不具合が発生した場合、すぐに気付くことができます。

こうして、早期に不具合を発見し修正することで、後の工程で大規模なトラブルを防ぐことができます。大規模な修正や再テストを減らすことで、プロジェクト全体の効率が向上します。

  • システムの仕様を深く理解できる

テスト駆動開発では、テストコードを書くためにシステムの仕様を詳細に理解する必要があります。システムの各機能が銅のように動作するべきかを自然と深く理解することができます。

  • 実装がシンプルになる

テストを正常に通るための最低限のコードを書いていくため実装がシンプルになります。シンプルなコードであれば、他の開発者にとっても理解しやすく、後から修正や機能追加を行う際にかかる時間を短縮できます。

それぞれの違いと戸惑い

私自身、プログラミングを始めてからずっとウォーターフォールモデルで行っていたので、最後の工程だったテストから開発を始めるのにすごく違和感と難しさを感じました。何が違和感だったかというとテストする実装もないのにどうやって1番最初にテストコードを書くかでした。

テスト駆動開発には「レッド・グリーン・ブルー」と3つに分けられます。レッドの段階では、失敗するテストコードを書く。もうこの時点で失敗するテストコードとは!!何のテスト!!状態でした。

レッドの段階では、テストするための実装のコードがないため必ず失敗します。機能の仕様をきちんと理解できていないと何のテストをするか分からないので、そこの仕様を理解してどんなテストが必要かを理解することが1番大変でした。料理に例えると、レッドの段階がレシピを書くところです。だいたい料理を作ってからレシピを書くと思うのですが、それをレシピから考えるとなると難しさが伝わってくると思います。

次の段階としてグリーンです。この段階では失敗の状態にしないことが目的になります。テストを実行してエラーにはならない状態にします。その状態にするには、実装のコードも用意する必要があります。料理に例えると、まず材料を用意するところです。プログラムもまず必要なクラスやメソッドなどを用意する段階がこのグリーンになります。

そして最後の段階としてブルーです。この段階では、用意したクラスやメソッドに詳細な実装を書いていきます。実装を書くたびに事前に作ったテストコードも実行していきます。これにより失敗したところをすぐに発見できて、修正ポイントを少なくできて効率よく実装を進めていくことができます。

上記のように、実装したコードをテストするのではなく、テストを用意してそのテストが成功するように実装を書く。そこの考え方を変えるのに大変苦労しました。実装がないのにどんなテストをすれば良いかのイメージや、失敗前提のテストコードを書くのに戸惑ったのを覚えています。

私自身の成長

ウォータフォールモデルでの開発時は実装をしてからのテストコードを書いていたので、設計書や要件定義での段階でどんなテストを書くかは想像もできなかった。しかしテスト駆動開発を経験したことによって、要件定義や設計書を作った段階である程度どんなテストケースが必要かや、仕様に対する理解が深まるスピードも上がりました。さらにテストコードを作成しているので実装段階でのコードを書くスピードも格段に上がりました。

まとめ

ウォーターフォールモデルやテスト駆動開発だけでなく、色々な開発工程を経験することで新しい考え方や新しい知識がどんどん増えて自分自身のスキルアップに繋がっていくと思います。新しいことを学ぶときは戸惑いや違和感は付き物だと思います。しかし、それを拒絶することなく柔軟に考え方を変化させながら身につけていくことで色んな場面に対応できるエンジニアになれると思います。