アジャイル開発でおススメのプラクティスの1つ、「テスト駆動開発」とは?

  • テクノロジー

皆さんこんにちは!
富士通ラーニングメディア 人材育成イノベーション事業部の萬(よろず)です。

アジャイル開発のコラム第5弾です!
前回までのコラムでは、アジャイル開発やスクラムの概要、アジャイル開発における要求の整理の方法などについてご紹介しました。

今回は、アジャイル開発の主な手法であるXP(eXtreme Programming)のプラクティスの1つ、テスト駆動開発についてご紹介します。XPは5つの価値、14の原則、19のプラクティスから構成されるアジャイル開発の方法論です。XPのプラクティスはスクラムと組み合わせて使うことができ、多くのアジャイル開発の現場で実践されているテスト駆動開発やペアプログラミング、継続的インテグレーションといった手法はXPのプラクティスです。

システム開発現場でこのようなことはありませんか?

システム開発の現場で理想とされるコードは、やはり「動作するきれいなコード」ではないでしょうか。バグがなく仕様どおりに動き、なおかつ、可読性や拡張性の高いきれいなコードを作成したいところです。特にアジャイル開発では、短い間隔でフィードバックをもらいながら開発を繰り返し行って動くソフトウェアを継続的にリリースしますので、作成済みのコードに対して変更を加える機会が何度も発生します。可読性や拡張性の高いきれいなコードでないと、素早く変更することができません。
でも、実際の現場ではこんなことが起こっていたりしませんか?

  • 設計を十分考えたつもりだが、細部に関してあまり考えられていなかった…。
  • 今回の要件においては、設計をそこまで考える必要はなく、もっとシンプルに実装すれば良かった…。
  • 設計をコードに落とすことには成功したが、動かしてみたら、遅くて使い物にならなかった…。

ウォータフォール開発では、実装の工程に入る前に、要件定義や設計の工程に十分に時間をかけます。こういった「きれいに設計してから動くコードを作成する」アプローチでは、「いくら設計を行っても、動かしてみないとわからない」という問題があります。

それでは、「動くコードを作成してからコードをきれいにする」というアプローチではどうでしょうか?この場合も

  • 動くのだから、きれいにするのはまたの機会にしよう…。
  • まだ作らなければいけないものがたくさんあるので、きれいにする時間はない…。
  • せっかく動くところまで来たのに、きれいにするためにコードに手を入れて動かなくなったら元も子もないので、コードに触れたくない…。

というように「きれいにすることは行われなくなりがち」であり、最終的には、「きれいなコードになっていないために、コードを変更したくても変更できなかったり、変更に時間がかかり、ビジネスの変化に迅速に対応することができなくなる」という問題があります。
テスト駆動開発は、このような問題を解決するために必要です。

テスト駆動開発とは?

テスト駆動開発とは、動く、きれいなコードを書き、動く、きれいなコードであり続けさせるためのソフトウェア開発手法です。
テスト駆動開発では、下図のようにRed(テスト失敗)⇒Green(テスト成功)⇒Refactoring(コードをきれいにする)のサイクルでコードを作成し、常にリファクタリング(プログラムの外部から見た動作を変えずにコードの内部構造を改善すること)をしている状態を保つようにします。

            20220929_02.png
テストを成功させる最小限の実装を行うことで動くコードを作成し、その後に必ずリファクタリングを行ってコードをきれいにします。テストが成功することを確認しながらリファクタリングを行いますので、「きれいにするためにコードを変更したら動かなくなるかもしれない」といった不安を解消することができます。

富士通ラーニングメディアではどのように学べるの?

テストといえば品質保証というイメージがありますが、テスト駆動開発は品質保証だけを目的としてテストから先に作成する手法ではありません。コード作成で直面する様々な複雑さに対し、テストの成功や失敗というフィードバックを得て、自分の進む方向が正しいことを確認しつつ着実に進むための方法です。書籍を読んだり話を聞いたりするだけでなく実際にやってみることで、テスト駆動開発の効果を実感することができ、現場で実践する際の勘所が得られます。

富士通ラーニングメディアでは、実際にテスト駆動開発を体験できる、オンラインで受講可能な研修コースをご用意しています。
【ライブ】テスト駆動開発の基礎』(コースコード:ULC70R)

このコースはオンライン(ライブ配信)でどこからでもご受講いただけます。クラウド上の実習環境にブラウザでアクセスし、ブラウザの画面上で操作を行ってテスト駆動開発を体験できます。

コースの前半では、テキストに沿ってハンズオン形式でテスト駆動開発を体験し、後半では、ペアプログラミング(これもXPのプラクティスの1つ)と組み合わせて、少し難しめのプログラミングの課題に挑戦し、理解を深めていただきます。
コースのハンズオン形式で取り扱うのは、Hit & Blowです。一方が数を思い浮かべ、もう一方がそれを予想して当てます。数字が当たらなかった場合、ヒントとして、正解の数に含まれていて桁も一致している数字の個数であるHit数と、正解の数に含まれているが桁が一致していない数字の個数であるBlow数を得ることができます。
                    20220929_03.png
実際の実習中のペアプログラミングは、以下のように参加者同士で会話をしながら進めていきます。

参加者Aさん:
今回は3桁の数のHit & Blowのプログラムを実装するけど、3桁は難しいから、とりあえず1桁のプログラムから書きましょうか。To Doリストに追加しますね。

20220929_04.png

参加者Bさん:
じゃあ、テストコードを書いちゃいますよ。1桁だから、正解の数と比較して、一致すればHit数1が出ればいいんですよね。

20220929_05.png

参加者Aさん:
コンパイルエラーが出ちゃうから、クラスとかコンストラクタとかメソッドを作らなきゃ。

参加者Bさん:
はい、書きました。中身が空でもいいから、Eclipseの補完で作っちゃいました。

                   20220929_06.png

参加者Aさん:
コンパイルエラーが無くなったら、テスト実行だね。

参加者Bさん:
中身が空っぽだから、とうぜん失敗だね。

20220929_07.png

参加者Aさん:
とりあえず、テストが成功すればいいから、期待されているHit数1だけ返すコードにしておきますか。

参加者Bさん:
それじゃあこんな感じで書けばいいかな。


20220929_08.png

参加者Bさん:
そしてここでもう一回テスト実行ですね。

20220929_09.png

参加者Aさん:
成功した。じゃあ、ここからリファクタリングして、正しい実装に書き換えていきますか。

~・~・~・~・~・~

このように、テストコードを先に作成した上で最低限の実装を行い、テストが成功することを確認しながら正しい実装やより洗練されたコードに書き換えていきます。
実際に研修でテスト駆動開発を体験していただいたお客様からは、以下のようなコメントをいただいています。

  • 講義だけでなく、実践演習もあり、難しい問題に対してタスクを洗い出して、テストコードを作成し、実装するという、具体的な流れを体験することができた。
  • テスト駆動と単体テストを同じように考えていたことが矯正できたことがよかった。また、ペアプログラミングを体験できたのがよかった。
  • テストを最初に書くことで正しいプログラムが書けているか確認しながら開発できるという安心感は想像以上だった。
  • 「テストを書いて実装し、リファクタリングする」を繰り返すことにより、修正による他への影響がないかどうかを随時簡単に確認できるので、安心して開発ができるのは大きなメリットであると感じた。

書籍やインターネットなどからテスト駆動開発についての情報を得ることができますが、安心感が得られるというようなテスト駆動開発の効果を実感するには、やはり実際にやってみるのが一番です。そんな時に実習環境が用意されている研修は非常に有効な選択肢の1つとなります。

さらにテスト駆動開発を深く理解したい場合は、テスト駆動開発の考案者であるKent Beck自身によって書かれた書籍を読むことをお薦めします。
『テスト駆動開発』
(Kent Beck 著/和田 卓人 訳、オーム社、ISBN: 978-4-274-21788-3)

今後もアジャイル開発のコラムを発信していきますので、どうぞよろしくお願いいたします。

関連コース情報

【ライブ】テスト駆動開発の基礎』(コースコード:ULC70R)

※このコースはオンライン(ライブ配信)でどこからでもご受講いただけます。クラウド上の実習環境にブラウザでアクセスし、ブラウザの画面上で操作を行ってテスト駆動開発を体験できます。
※そのほか、アジャイル関連コースの詳細は「アジャイル開発関連研修コースのご紹介」をご覧ください。

執筆者紹介

人材イノベーション事業部 デジタルプロセスプロジェクト所属
萬 尚樹(よろず なおき)

UNIX(Solaris)関連コースの講師からキャリアをスタートし、VMware認定インストラクターとして仮想化関連コースなどを担当したりしましたが、クラウドや自動化の技術の普及によって担当する領域がアプリ開発に近づいていき、アジャイル関連コースも担当するようになりました。その他、Dockerを使ったコンテナのコースやAnsibleを使ったInfrastructure as Codeのコース、継続的インテグレーションのコースなどを担当しています。

最近、テレビ東京のドラマ『量産型リコ -プラモ女子の人生組み立て記-』に影響されて、ガンプラを買いました。

(2022/09/29)

関連記事