アジャイル トランスペアレンシー ~アジャイル開発における透明性の確保について~

第4回  設計作業としてのテスト駆動開発

この記事を読むのに必要な時間:およそ 3 分

はじめに

本連載では,⁠透明性」というキーワードで,アジャイル開発について説明しています。第四回目は,開発者の視点からの透明性について,テスト駆動開発(TDD)をキーワードに考えます。

ソフトウェア開発においては,コミュニケーションギャップにより,最終的な成果物と顧客のニーズとの食い違いを生み出す原因となっています。

以下のような箇所でギャップが発生します。

  • 顧客と開発者の間
  • 開発者と開発者の間

前回までに,顧客と開発者の間のギャップを如何に埋めるかについてご説明してきました。適切なイテレーション設計でフィードバックの連鎖をつなげることと,タスク管理をより透明度の高い方法で実施することの重要性について紹介しています。今回は,開発者内部でのコミュニケーションギャップにスコープを当ててみたいと思います。

設計の共有の重要性

事前に詳細を全て決定し,ドキュメントを起こしてから開発に入るウォーターフォール的なやり方で,結果的に顧客のニーズにそぐわないソフトウェアを作ってしまうといった失敗が,数多くありました。この失敗の原因のひとつに,ドキュメント中心の開発手法では,開発中の仕様変更に対応し難いということがあげられます。

大量のドキュメントは,更新コストが相対的に大きくなりますので,アップデートが遅れ,結果,最新状態の文書がどこにあるのか分からなくなります。このような,ドキュメントに依存した情報伝達の弊害は特に変化の激しい状態において顕著となります。それに対して,ドキュメントの記載は最小限にとどめ,その代わりに対話を増やす等,情報伝達の実効性を上げる方向で,ソフトウェア開発の透明性を高めようとするのがアジャイル開発の考え方です。

この場合,特に注意が必要となるのが設計情報です。誤解を恐れずに敢えて言いきってしまうと,アジャイル開発では,ドキュメントは必要最小限しか用意しません。その為,設計の細部はドキュメントには載っておらず,実装担当者に任されています。それらの情報をどうやって共有するのでしょうか? コードには全て記載してありますが,本当に分かりやすいコードを記載するにはコストがかかります。それを読み解くには,ある程度開発言語の知識も必要となるでしょう。

さらに致命的なのは,コンテキストの説明ができないことです。何をしているかはコードから読み取れたとしても,なぜその処理が必要になるのかの背景については,コメントで残すしかありません。

設計に関する情報を,一元的に整理することが必要です。アジャイル開発ではテスト駆動開発を採用することで,その問題に対応しています。今回はテスト駆動開発について,少し詳しく見てみることとします。

テスト駆動開発(Test Driven Development) とは

テスト駆動開発(TDD)とは,開発者自らがテストを先に書き,その書いたテストがパスするように後から動作するソフトウェアを作っていくというやり方です。

事前にテストを作成するというと,仰々しいテスト仕様書を先行して作成するようなイメージがありますが,テスト駆動開発で意味するテストは,そうではありません。開発者自らがテストの作成とソフトウェアの実装とを行います。テストと実装のサイクルは,頻繁に回転させるもので,ひとつテストを書いては,対応する実装を書き,テストをもう一つ書いたら,次の実装を行うというものです。そして,実装に対してリファクタリングを繰り返し,よりよい設計へと進化させてゆきます。ここで書かれるテストは,全て自動化され,何度でも繰り返し実行可能になっている必要があります。クリック一つで全てのテストが走るようでないと,実装作業の中にストレス無くテストを挟み込むことが難しいからです。このように,テスト,実装,リファクタリングのステップを,リズミカルに回していくことで開発を促進することが テスト駆動開発のやり方です。

画像

テスト駆動開発の2つの側面

テスト駆動開発には,テストとしての品質保証の側面と,設計作業の表出化という二つの側面があります。品質保証の側面とは,テスト駆動開発を実施することで単体テストを事前に用意しますので,単体テストの網羅率が高くなり,ソフトウェアの品質が上がるというものです。具体的には,結合テストや統合テストといった最終的な品質保証に必要なテストを実施した際のバグの発生率が減少し,それらのテスト工程に必要な工数は激減します。これは非常に意味のある効果ですが,あくまでもテスト駆動開発の一側面に過ぎません。アジャイル開発で重要となるのが,後者の設計作業としてのテスト駆動開発です。

例えば,オブジェクト指向開発において,あるクラスを作成するとします。テスト駆動開発においては,実際のクラスを作成する前に,そのクラスに対するテストを書きます。これは,そのクラスが他のクラスとどのように相互作用するのかを決定する作業となります。つまり,クラスの振る舞いを定義していることと同義です。

そしてアジャイル開発においては,あるクラスの振る舞いの詳細を確認したい場合には,詳細に記述されたドキュメントではなく,このテストを参照することとなります。つまりテストはコミュニケーションツールとして,設計情報の伝達に貢献するのです。 その為,テスト駆動開発におけるテストは,品質を確認できれば良いというものではなく,よりテスト対象のクラスの振る舞いを明確にするように書く必要があります。

著者プロフィール

設楽秀輔(したらしゅうすけ)

1994年,慶応義塾大学経済学部卒業。エンターテインメント系企業にて経営管理を経験後,システムインテグレータとして金融アプリケーションなどのソフトウェア開発に従事。2007年,株式会社テクノロジックアートに入社し,現在に至る。

テクノロジックアートアジャイル開発グループグループリーダー。認定スクラムマスター。会計士補。

コメント

コメントの記入