ソフトウェアテストシンポジウム 2003
JaSST’04: Japan Symposium on Software Testing 2003

テストパターンの有効性について－テストファーストとテストパターンによるソフトウェアテスト－
小井土亨††株式会社オーエスケイ 〒136-0071 東京都江東区亀戸 7-6-4
E-mail:†koido@kk-osk.co.jp

あらまし 現在、効率的にソフトウェアを開発する手法のひとつである eXtreme Programming のプラクティスの中で、テストファースト（実装を行う前に、テストプログラムを作成する）の有効性が注目されている。テストフ
ァーストで、良いテストを作成するためには、テストに対する知識を必要とすることは当然であるが、ターゲットプログラム（製品となる部分のプログラム）の構造がテストを意識したものになっていることも重要である。しかし、テストを意識した良いプログラム構造を作成するためには知識や経験が必要となる。そこで、テストしやすいプログラム構造とテストの組合せをテストパターンとして紹介し、その有効性について解説する。
キーワード アジャイル，eXtreme Programming，テストファースト，パターン

About the effectiveness of a test pattern－Software Test by Test First and Test Pattern－Toru Koido††OSK Co.,LTD. 7-6-4, Koutou-ku, Tokyo, 136-0071 Japan
E-mail:†koido@kk-osk.co.jp

Abstract In the practice of eXtreme Programming which is one of the techniques which develops software efficiently, thetest first's effectiveness attracts attention. Although the knowledge over a test naturally needs in order to create a good test attest first, it is also important that the structure of a target program is what was conscious of the test. However, knowledge andexperience are needed in order to create the good program structure which was conscious of the test. The combination of theprogram structure which is easy to test, and a test is introduced as a test pattern, and the effectiveness is explained.
Keyword Agile，eXtreme Programming，Test First，Test Pattern

1. は じ め にの中で、テストファーストや自動テストを利用したリ

近年、ソフトウェアはビジネスを成り立たせるためファクタリング、自動テストを利用した常時結合などに必要不可欠と位置づけられるものが数多く見られるは、その有効性に注目が集っている。また、テストをよ う に な っ た 。 例 え ば 、 Web 上 の オ ー ク シ ョ ン サ イ ト

開発の中心に置いたテスト駆動開発という方法論も注などは、この典型的なものである。この様なソフトウ目を集めている。

ェアは、動作停止がビジネスの停止を意味し、高い品このように、迅速でかつ継続的な変更が必要とされ質が求められる。また、この様なビジネスは、顧客のるソフトウェアの開発では、テストファーストとテスニーズをいち早く取り入れ、常に新しい機能を提供すトの重要性が高く認識されている。しかし、経験の浅ることがビジネスで勝ち残る必須条件である。したがい開発者が、良いテストを書くことは、決して簡単なって、常にシステムを変更させることが要求される。

ことではない。そこで、良いテストとターゲットプロ

この安定して稼動させることと、常に変更することグラムの組合せをテストパターンという形式で解説し、は 、相 反 す る 要 件 で あ る 。多 く の Web ア プ リ ケ ー シ ョ

テストファーストとテスト作成に於けるヒントになるンなどは、この二つの側面を満足させるという、難しことを希望し、本論文を記述する。

い課題を常に突きつけられることになる。
このような状況下で、システム開発を迅速に行うた

本 論 文 で は 、 2.で テ ス ト パ タ ー ン に つ い て 明 確 に する 。 3.で テ ス ト パ タ ー ン の 基 本 方 針 に つ い て 説 明 を 行

め に 、 eXtreme Programming （ 以 下 XP） な ど の ア ジう 。 そ し て 、 4.で 各 テ ス ト パ タ ー ン に つ い て 解 説 を 行

ャ イ ル 開 発 手 法 が 注 目 さ れ て い る 。XP の プ ラ ク テ ィ スう 。 最 後 に 、 5.で テ ス ト パ タ ー ン を 応 用 し た 事 例 を 紹介する。

2. テ ス ト パ タ ー ン と は
2.1. 良 いテストの効 果 について
テストファーストで作成するテストの中で、良いテ2.2. テストパターンの範 囲
本論文で扱うテストパターンは、テストだけに関するパターンではなく、テスト対象となるターゲットプ
ログラムと自動テストの組合せについてのパターンをストと呼ばれるものは、以下の条件の多くを満たして対 象 と し て い る 。 こ れ は 、 2.1 で 述 べ た よ う に 、 テ ス

いる必要がある。

トファーストに於ける、テストとターゲットプログラ①テスト目的が明確である

ムには、密接な関係があり、相乗効果があることにな

何 を テ ス ト す る か 明 確 で あ る 。ま た 、そ の 目 的 もる。

明確で、ひとつであること。

2.3. テストパターンの必 要 性②テストの判定が正しい
テストの成功、失敗が正しく判断されている。
③テストを独立して実行することができる

ウォーターフォール型開発では、プログラム実装を行い次にテストを行うという、作業手順であるため、テストパターンは必要とされていなかった。その理由

テ ス ト が 他 の テ ス ト に 依 存 す る こ と な く 、独 立 しは、実装とテストの間に時間などのさまざまなキャッている。

プが存在するからである。

④繰り返し実行することができる

テストファーストを採用した開発プロセスでは、少何 度 で も 繰 り 返 し て 、テ ス ト を 実 行 す る こ と が でしテストを作成し、少し実装するといった繰り返し開きる。

発を行うことになる。このような作業手順では、ター⑤テストを実行しても、状態が変化しない

ゲットプログラムとテストが並列に近い状態で作業がテ ス ト を 実 行 し 、成 功 し た 場 合 で も 失 敗 し た 場 合進められる。したがって、両方の側面を意識したパタで も 、テ ス ト を 実 行 す る 前 と 後 で 何 も 変 わ ら な い 。

ーンが有効に作用する。

これらの条件を満たすテストによって、ターゲットプログラムは、必然的に以下の条件のいくつかを満足することになる。
①メソッドが一つの機能を実現している
メソッドが明確な一つの機能だけを提供する。
②メソッドの結果を提供する

3. テ ス ト パ タ ー ン の 基 本 方 針
各 テ ス ト パ タ ー ン に つ い て 、目 的 、解 説 、利 用 場 面 、
制限事項、構造を記述する。テストパターンは、他のパ タ ー ン と 同 様 に 、必 ず し も 利 点 ば か り と は 限 ら な い 。
パターンを採用することで、システムに対して、副作用的な影響が発生することがある。本論文では、この外 部 に 対 し て 、メ ソ ッ ド の 処 理 結 果 を 判 断 で き る様な用件に対して、制限事項として記述している。

ような何らかの方法を提供する。

4. テ ス ト パ タ ー ン に つ い て③クラスやメソッドの独立度が高い
ク ラ ス や メ ソ ッ ド が 、他 の ク ラ ス や メ ソ ッ ド の 依存が低い。
④特定の環境への依存度が低い
特定のファイルやデータベース構造などに対する依存度が低い。
良いテストが与えるターゲットプログラムへの効果をまとめると、以下の２つとなる。
①シンプル
テス ト 、クラ ス、メ ソ ッド など 、全 てが 明確 で シンプルとなる。
②低い依存度テ ス ト 、 ク ラ ス 、 メ ソ ッ ド な ど 、全 て が 他 の テ ス
ト や ク ラ ス や メ ソ ッ ド に 対 し て 、依 存 し て い る 部
分 が 少 な く な る 。依 存 度 が 低 い こ と で 、高 い 独 立性が実現される。
このように良いテストは、ソフトウェアに求められているシンプルさと低い依存性という、特性を与える具体的なプラクティスとなる。

4.1. インフォメーションセンターパターン
4.1.1. 目 的①環境に依存するプログラムをテストするプログラムの動作がファイルやデータベースなど の 環 境 に 依 存 す る 場 合 が あ る 。こ の よ う な ケ ースで、効率的にテストを行う。

4.1.2. 解 説
環境に依存するプログラムをテストする場合、テストを実行する前にテストのための環境を構築する必要がある。テストを実行する前に、テスト用の環境を動的に構築する方法では、テストの作成工数やテストの実行時間が掛かってしまう。
この様なときに、事前にテスト用に環境を構築し、実行時に環境を切り替えてテストを可能とする。ター
ゲットプログラムの環境に依存する設定部分をインフォ メ ー シ ョ ン・セ ン タ ー ク ラ ス で 一 元 管 理 す る 。ま た 、一元管理した、環境情報を設定変更可能とし、テスト時 に は 、様 々 な テ ス ト 環 境 を 切 り 替 え て テ ス ト を 行 う 。

いからである。

4.1.3. 利 用 場 面
以下のような場合に、利用することができる。

この様なときに、ユーザーインターフェイスの状態①データベースの状態に依存するテストの実行やロジックを別クラスに分離し、自動テストを行う。

データベースの状態に依存するテストを行う場

また、分離したクラスにイベントを追加することで、合 に 、状 態 を 再 現 し た デ ー タ ベ ー ス に 環 境 を 変 更描画の更新タイミングなどのロジックに対してテストしてテストを実行する。

を可能とする。

②特定のファイルなどに依存するテストの実行

4.2.3. 利 用 場 面

ファイルの内容に依存するテストを行う場合に、以下のような場合に、利用することができる。

様 々 な 内 容 の フ ァ イ ル を 用 意 し 、対 象 を 変 更 し て①ユーザーインターフェイスのテスト
ユーザーインターフェイスの状態やロジックをテストを実行する。

自動テストする。

4.1.4. 制 限 事 項
このテストパターンには、以下のような制約事項が②シナリオテスト
複数のユーザーインターフェイスに対応したビある。
①必要とされない設定変更機能が残ってしまうュ ー ス テ ー ト ク ラ ス を 作 成 し 、様 々 な シ ナ リ オ テ

こ の パ タ ー ン で 導 入 し た イ ン フ ォ メ ー シ ョ ン・セ

ストを行う。

ン タ ー の ク ラ ス は 、要 求 に 必 要 な い 機 能 と し て 実

4.2.4. 制 限 事 項
このテストパターンには、以下のような制約事項が装される。

ある。

4.1.5. 構 造①描画情報を二重持ちする場合がある① Targetユ ー ザ ー イ ン タ ー フ ェ イ ス 自 体 で は な く 、分 離 し

テスト対象となるクラス

た ク ラ ス が 状 態 を 管 理 す る た め に 、情 報 の 二 重 持② InformationCenter

ちが発生する場合がある。

設定管理クラス②描画状態はテストできない③ Test

ユーザーインターフェイスで高度なコントロー

テストクラスル を 使 用 し て グ ラ フ を 表 示 す る 場 合 な ど で は 、デInformationCenterー タ な ど は テ ス ト す る こ と が で き る が 、グ ラ フ 描
画自体のテストを行うことはできない。

SetUp()

4.2.5. 構 造 と 構 成 要 素① View
ユーザーインターフェイスのクラス

TargetTest② ViewState
ユーザーインターフェイスの状態管理クラス

4.2. ビューステートパターン
4.2.1. 目 的③ Test
テストクラス①ユーザーインターフェイスのロジックテスト
View

ユ ー ザ ー イ ン タ ー フ ェ イ ス の テ ス ト は 、自 動 化 す
る こ と が 難 し い 。ユ ー ザ ー イ ン タ ー フ ェ イ ス の 状
態 や ロ ジ ッ ク を 別 ク ラ ス に 分 離 し て 、テ ス ト す る 。

ViewState②ユーザーインターフェイスの状態変化テスト

Test

ユ ー ザ ー イ ン タ ー フ ェ イ ス は 、状 態 変 化 に 応 じ て描 画 を 変 更 す る 場 合 が あ る 。こ の 様 な 動 作 を テ ス

4.3. オーダーシートパターン

ト す る こ と は 難 し い 。ユ ー ザ ー イ ン タ ー フ ェ イ ス

4.3.1. 目 的の状態やロジック分離したクラスにイベントを追加することで、テストを行う。

4.2.2. 解 説
ユーザーインターフェイスのテストは、一般に手作業で行うことが多い。これは、ユーザーインターフェイスの動作や変化を自動テストで確認することが難し①クラス間の依存関係をなくしてテストを実行
ク ラ ス 間 に 直 接 的 な 依 存 関 係 を 無 く し 、ク ラ ス の独立性を高くして、単体テストを実行する。
②ユーザーインターフェイスと処理クラスの分離
ユーザーインターフェイス関連クラスと処理ク

ラ ス を 分 離 し 、個 別 に 単 体 テ ス ト の 実 行 を 可 能 にする。

5. テ ス ト パ タ ー ン の 適 応 事 例
テストパターンを適応した、システム開発事例を紹4.3.2. 解 説介する。

クラス間の依存関係が強い場合、単体テストを作成することが難しい。

5.1. 事 例 の内 容 と開 発 リスク
UNIX 系 の OS で 動 作 す る FAX 機 能 を 持 つ 複 合 機 対

この様なときに、処理実行に必要な情報をオーダー応の組み込み業務システムの開発を行った。組み込み

シートクラスに分離し、クラス間の関連を無くすことシステムであることによるリスクも含めて、以下のよで、テストの作成を容易にする。また、複数のビューうなリスクを含んだ開発であった。

ステートクラスに対して、オーダーシートクラスを渡①ベータ版の開発環境して、処理実行情報を集めることで、処理を実行せず

新 規 開 発 さ れ た 開 発 環 境 で あ っ た た め 、開 発 当 初にシナリオテストを可能とする。また、ユーザーイン

は 開 発 環 境 が ベ ー タ 版 で あ っ た 。し が た っ て 、仕ターフェイスを通さずに、オーダーシートに様々な設様変更や品質の安定に関して高いリスクが存在定を行ったテストを可能にする。

した。

4.3.3. 利 用 場 面②テスト工数

以下のような場合に、利用することができる。

開 発 対 象 が 組 み 込 み シ ス テ ム で あ っ た た め 、実 機

①処理のバリエーション実行テスト

で の テ ス ト は 手 動 テ ス ト の み で あ っ た 。し た が っオ ー ダ ー シ ー ト ク ラ ス に 様 々 な 設 定 を 行 い 、カ バ
レッジの高いテストの実行を行う。
②シナリオテストて 、テ ス ト に 必 要 な 工 数 が 増 大 す る リ ス ク が 存 在した。
③仕様変更

複数のビューステートクラスにオーダーシート

開発関係者が全てにおいて初めて経験するタイク ラ ス を 渡 す 方 法 で 、シ ナ リ オ 型 の ユ ー ザ ー イ ン

プ の シ ス テ ム で あ っ た 。し た が っ て 、何 時 ど の よ

ターフェイステストを行う。

う な 仕 様 変 更 が 発 生 す る か 、予 測 す る こ と が で きないシステムであった。

4.3.4. 制 限 事 項
このテストパターンには、以下のような制約事項が以上のようなリスクを回避するために、システムのサブシステム間の依存度を低くすることと実機以外である。

テストできる部分の比率を高くすることを目的に、テ①ステートレス処理が対照となるユーザーインターフェイスと処理クラス間がス

ストパターンを導入してシステムの開発を行った。まテ ー ト レ ス で あ る こ と が 条 件 で あ る 。し た が っ て 、た、仕様を明確にするために、順次動作するシステム

ユーザーインターフェイスと処理クラス間に密を提供する形式の、繰り返し型の開発を行った。

接な関係がある場合は適応できないことがある。

5.2. テストパターン導 入 結 果
事例のシステムは、品質の高いものとなった。具体4.3.5. 構 造 と 構 成 要 素

的には、品質検査チームで２週間の最終製品検査を行① OrderSheetったところ、３点の問題しか発生しなかった。その内オーダーシートのクラスの２点は、操作方法についての改善要望であった。ま② IViewState
ユーザーインターフェイスのクラス

た、他の１点は、他の組み込みシステムとの相性に関する問題であった。このように、開発途中でも最終的③ ViewStateA , ViewStateB
ユーザーインターフェイスの状態管理クラス

な検査作業においても、簡単なミスによる不具合は非常に少なかった。しかも、問題点の発見コストと修正④ Test

コストについても、低く抑えることができた。

テストクラス

結果としてこの事例において、テストパターンを導入し、テストファーストで良いテストを数多く作成すIViewState
Test
FillSheet(sheet)ることで、品質の高いシステムを開発することができた。今後、新たなテストパターンの発見と、テストパターン導入事例を増やしたいと考えている。

文
ViewStateA

ViewStateB

OrderSheet

献[1] ケ ン ト ・ ベ ッ グ 著 ， テ ス ト 駆 動 開 発 入 門 ， ピ ュ ア
ソ ン ・ エ デ ュ ケ ー シ ョ ン ， 東 京 ， 2003．