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

Delphi Application への WinRunner の適用手法の検討
古江 智和††株式会社フォーラムエイト宮崎支社 TestGroup 〒889-2155 宮崎市学園木花台西 2-1-1
E-mail: †furue@forum8.co.jp
あらまし MERCURY INTERACTIVE 社の自動テストツール WinRunner を用いて Borland Delphi で作成したApplication をテストする際のポイントについて解説する．WinRunner は Delphi Application 認識の手段として 2 種類の Add-in を提供している．本論文では，各 Add-in のもたらす効果を明らかにした上で，テストに費やされるコス
トパフォーマンス及び開発プロセスにおけるテストの位置付けを考慮した際，どの Add-in を適用するのが適切か弊社の事例に基づいて考察を行う．
キーワード Delphi，WinRunner，Add-in，自動テスト

Approach for Delphi Application Automated Testing with WinRunnerTomokazu FURUE††FORUM8 INC. Miyazaki Branch TestGroup 2-1-1 Gakuenkibanadai-nishi, Miyazaki, 889-2155 Japan
E-mail: †furue@forum8.co.jp
Abstract The main point in the case of testing Delphi Application using WinRunner is explained. The WinRunner offers
two kinds of Add-in, in order to recognize Delphi Application. In this paper, the effect of Add-in is clarified first. Next, the cost
performance of testing and positioning of it in a development process are taken into consideration. And Add-in which should
be applied is examined.
Keyword Delphi，WinRunner，Add-in，Automated Testing

1. ま え が き

分類したオブジェクトとの関係を示しつつ解説する．

弊社では社内で開発・販売を行っている製品群に対4. で は Add-in 適 用 パ タ ー ン を 3 つ の 種 類 に 分 類 し ，各

し ，製 品 の 一 層 の 品 質 向 上 を 目 的 と し て ，2002 年 5 月

パターン毎のオブジェクト認識率を測定した結果を比に TestGroup が 発 足 し た ．当 TestGroup で は 数 社 か ら 販

較 す る ． 5. で は 各 適 用 パ タ ー ン の メ リ ッ ト あ る い は デ売されている自動テストツールに対して試用・評価を

メリットをコスト及び業務フローの面から考察する．

行 っ た 結 果 ， 当 時 既 に Delphi6 へ の 対 応 済 み で あ っ た
MERCURY INTERACTIVE 社 の WinRunner を 採 用 す るに至った．
WinRunner は Delphi オ ブ ジ ェ ク ト を 認 識 す る た め の
Add-in を 複 数 用 意 し て い る が 、実 際 に こ れ ら の Add-in

2. WinRunner の 概 要
WinRunner が オ ブ ジ ェ ク ト を 認 識 す る 仕 組 み に 絞 って説明する．
WinRunner の テ ス ト ス ク リ プ ト (TSL) 内 で は 一 般 的を適用するに当たっては開発プロセスにおけるテストに 各 オ ブ ジ ェ ク ト は "論 理 名 "で 表 現 さ れ る ． "論 理 名 "の位置付けを考慮した上で決定する必要があった．ことはスクリプトの可読性を高めるために用いられる一れ は Add-in 適 用 の 方 法 に よ っ て 、テ ス ト に 費 や さ れ る

種 の エ イ リ ア ス (別 名 )で あ る ． こ の "論 理 名 "は GUI マ

べきコストが大きく変わって来るからである．

ッ プ と 呼 ば れ る フ ァ イ ル の 中 で "物 理 的 記 述 "と 結 び つ

本 論 文 で は WinRunner の Delphi Add-in の 内 容 と 適 用

い て い る 。 "物 理 的 記 述 "に は WinRunner が テ ス ト 対 象

例を幾つか示した上で、各適用パターンにおけるメリ

アプリケーションにアクセスするためにオブジェクト

ットについて考察する。これにより本テストツールをを一意に識別するためのプロパティ情報が記述されて使用するテスト担当者が、どのような手法を用いてテ

い る ． GUI マ ッ プ フ ァ イ ル は "論 理 名 "と "物 理 的 記 述 "ストを実施するか判断する参考となれば幸いである。

を 結 び つ け る 役 割 を 果 た し て お り 、 WinRunner に お け

2. で は ま ず ， WinRunner が オ ブ ジ ェ ク ト を 認 識 す る
仕 組 み に つ い て 簡 単 に 説 明 す る ． 3. で は Delphi

る オ ブ ジ ェ ク ト の 認 識 率 は GUI マ ッ プ の 記 述 内 容 (特に 物 理 的 記 述 )に 左 右 さ れ る と 言 っ て も よ い ．

Application を 構 成 す る 各 オ ブ ジ ェ ク ト を 幾 つ か の 種 類に分類し、その対応方法について各々説明する。またGUI マ ッ プ の 作 成 方 法 に は 以 下 の パ タ ー ン が あ る ．

WinRunner が 提 供 す る 2 種 類 の Add-in に つ い て ，先 に・ テ ス ト レ コ ー デ ィ ン グ (自 動 記 録 )時 に 自 動 作 成

・対 象 と な る オ ブ ジ ェ ク ト の GUI マ ッ プ 作 成 を 明 示(TypeA)WinRunner 本 体 に Load す る Add-in(TypeB)テ ス ト 対 象 Application に 組 み 込 む Add-in

的に指示（学習機能）
ユ ー ザ は GUI マ ッ プ フ ァ イ ル 内 の "論 理 名 ","物 理 的

図 ２ に 両 Type の 概 要 を 示 す ．

記 述 "を 自 由 に 編 集 す る こ と が 可 能 で あ る 。オ ブ ジ ェ ク
ト認識の仕組みを図１に示す．

WinRunner本体へのロード

Applicationへの組込
Application

Script

Test Script

GUI MAP

Application

テスト対象Application

Dlphiniｔ#### TSL(Test Script Language) ####

Script# New Name
set_window ("New Name");edit_set ("Name", "New Name");button_press ("OK");

Dlphlib

WinRunner
本体

構 築

Delphi
コンパイラ

記録関数(Dlph_ext.dll)

オブジェクト名称を論理名で表す"New Name":{ class: window,
label: "!.*",
MSW_class: TFormCreateNew }物理的記述を元にオブジェクトを認識する"New Name".Name:{ class: edit,
MSW_class: TEdit,
dlph_name: EBoxProxyName }"New Name".OK:{ class: push_button,
dlph_name: ButtonOK }図１ オブジェクト認識の仕組み

TestSrvr

Application

Delphi Unit File
For WR Add in

Application
Source file

図２ WinRunnerの提供するDelphi Add-in

こ れ ら の Add-in で サ ポ ー ト さ れ て い る オ ブ ジ ェ ク トを "標 準 Delphi オ ブ ジ ェ ク ト "と 称 す る ． 各 Support の内容を以下に説明する．

3. Delphi 対 応 の 概 要

3.2.1 TypeA

3.1 概 要Delphi Add-in を Load す る と "dlphinit"及 び "dlphlib"ス

WinRuuner に お け る Delphi Application へ の 対 応 と は ，

ク リ プ ト が WinRunner に 読 み 込 ま れ ，数 十 個 の Delphi

基 本 的 に Delphi の VCL ラ イ ブ ラ リ が 提 供 す る オ ブ ジ

オ ブ ジ ェ ク ト が WinRunner 本 体 に 登 録 さ れ る ．

ェ ク ト 群 を WinRunner に 登 録 す る こ と で あ る ．そ し て(起 動 時 も し く は テ ス ト に 先 立 っ て 読 み 込 む ス ク リ プ

テ ス ト 対 象 Application を 構 成 す る 各 オ ブ ジ ェ ク ト にトのことを初期化スクリプトまたは初期化テストと呼対 し て WinRunner が 最 適 な 学 習 を 行 い ， Appliccation

ぶことがある．)の 操 作 に 対 し て は テ ス ト・ス ク リ プ ト 言 語 (TSR)が 最 適"dlphinit"の 一 部 を 図 ３ に 示 す ．

な関数を使用して記録・再生出来るようにすることが目的である．
実 際 に 弊 社 の Application を 使 用 し て WinRunner の 自動記録・再生を行ったところ，オブジェクトを以下の３種類に分類することが出来た．
(1)標 準 Delphi オ ブ ジ ェ ク ト
Delphi Add-in を 実 装 す る こ と に よ り 、ほ ぼ 問 題 な
く自動記録・再生が可能なオブジェクト(2)カ ス タ ム (コ ン ポ ー ネ ン ト )オ ブ ジ ェ ク ト######################################################################### Map all standard Delphi classes########################################################################
add_dlph_obj(“Tform”,”window”,”classMSW_classdlph_name","label","Count_objects", DLPH_OBJ);
add_dlph_obj("TRadioGroup","object","classMSW_class dlph_name","dlph_parent","Enabled", DLPH_OBJ);
add_dlph_obj("TEdit","edit","class MSW_class dlph_name","dlph_parent","Compare", DLPH_OBJ);

図３

Dlphinit フ ァ イ ル

スクリプトに手を入れることにより、記録再生が可 能 と な る も の (類 似 ク ラ ス へ の マ ッ ピ ン グ )(3)認 識 不 能 オ ブ ジ ェ ク ト
全く認識することの出来ないオブジェクト
以下の節で各オブジェクトへの対応方法を説明する．

add_dlph_obj の 機 能 に つ い て は 割 愛 す る が ， 本 関 数 の実行により各々のオブジェクトが最適なクラスにマッピングされ，各クラスに用意された関数が使用可能にな る ． WinRunner7.5 に 付 属 の Delphi Add-in で は 66 個の 標 準 的 な オ ブ ジ ェ ク ト が 登 録 さ れ る 他 ，

3.2 標 準 Delphi オ ブ ジ ェ ク ト

Grid(TStringGrid ， TDBGrid) 等 も 登 録 さ れ る ． 例 え ば

WinRunner が 提 供 す る "Delphi Add-in Support"を 組 み"TEdit"は "edit"ク ラ ス に マ ッ ピ ン グ さ れ る こ と に よ り

込 む こ と に よ り 、 Delphi に 付 属 し て い る 多 く の オ ブ ジ

edit_set，edit_replace 等 の エ デ ィ ッ ト ボ ッ ク ス 系 の 関 数

ェ ク ト (コ ン ポ ー ネ ン ト )が WinRunner の 認 識 対 象 と なが使用可能となる。

る ．"Delphi Add-in Support"は 次 の 2 つ の Type が あ る ．
(そ れ ぞ れ 仮 に TypeA， TypeB と 呼 ぶ こ と に す る ． )Add-in の Load の 有 無 に よ る ス ク リ プ ト の 相 違 を 図
４に示す．

よ り 多 く の TSR 関 数 が 使 用 可 能 と な る ．あ る い は 学 習されないオブジェクトを，学習するようにカスタマイズすることも可能である．

Operation

マッピング用スクリプトの例を図６に示す。

WinRunner#### TSL(Test Script Language) ####

Delete all character on Edit 1.
Input “Hardware Test” to Edit 1

自動記録# No Add-in
set_window ("Form2", 2);
obj_mouse_click ("Edit1", 1, 5, LEFT);
obj_type ("Edit1","<kDel_E><kDel_E><kDel_E><kDel_E><kDel_E><kDel_E><kDel_E>");
obj_type ("Edit1","<kDel_E><kDel_E><kDel_E><kDel_E><kDel_E><kDel_E>Ha");
obj_type ("Edit1","rdware Test");set_window ("Form2", 0);
obj_mouse_click ("Button1", 34, 11, LEFT);# Add-in Loaded
set_window ("Form2", 6);
edit_set ("TEdit", "Hardware Test");button_press ("Button1");######################################################################### Customized Object########################################################################
add_dlph_obj ("F8ToolBarClass", "toolbarwindow32", "class
MSW_class dlph_name","dlph_parent","Enabled", DLPH_OBJ);
set_class_map("TToolBar", "toolbarwindow32");
set_record_attr("TToolBar", "class MSW_class", "label","location");
set_record_method("TToolBar", RM_RECORD);

図４ Delphi Add-in(Add-in Loaded)TypeAの有無による自動記録スクリプトの相違

図 6

類似クラスにマッピングしたスクリプト例

図 中 の3.2.2 TypeB
テ ス ト 対 象 ア プ リ ケ ー シ ョ ン に WinRunner か ら 提 供 され て い る Unit フ ァ イ ル 群 (TestSrvr)を 追 加 し て 再 構 築することにより，以下に示す効果が得られる．
・ オブジェクトの Name プロパティが取得可能になり(dlph_parent)，認識率及びスクリプトの可読性向上が更に期待出来る．
・一部のオブジェクトに関しては特別な関数が使用可能となる．(Grid に対する tbl_get_cell_data や TPanel に対する
dlph_panel_button_press 等)

1 行 目 は カ ス タ ム コ ン ポ ー ネ ン ト"F8ToolBarClass"に 対 し て ツ ー ル バ ー 専 用 の TSR 関 数が使用できるように記述したものであり，2 行目以降
は TToolBar オ ブ ジ ェ ク ト に 対 す る 同 様 の 処 理 で あ る 。
3.4 認 識 不 能 オ ブ ジ ェ ク ト
WinRunner で は HWND(ウ ィ ン ド ウ ハ ン ド ル )を 消 費しないオブジェクトは認識出来ない．例えば
TSpeedButton に 対 す る 操 作 は 一 切 記 録 さ れ な い 。
こ の よ う な オ ブ ジ ェ ク ト に は "仮 想 オ ブ ジ ェ ク ト "を定義して対応することになる．
"仮 想 オ ブ ジ ェ ク ト "は ウ ィ ン ド ウ 内 の 任 意 の 矩 形 領

尚 ，TypeB の Add-in は TypeA と 連 携 し て 初 め て 効 力
を 発 揮 す る も の で あ り ， TypeB の み を 適 用 し て も 意 味はない．

域 を GUI オ ブ ジ ェ ク ト と し て WinRunner に 認 識 さ せ る
機能である．
仮想オブジェクトの使用例を図７に示す．

Add-in 適 用 パ タ ー ン の 種 類 に よ る ス ク リ プ ト の 相 違あらかじめ仮想オブジェクトとして登録しておく
GUI MAPを図５に示す．
Operation

Form4.SpeedButton:{class: push_button,
virtual: TRUE,
x: 55,
y: 44,
width: 103,height: 30,
rows: 1,columns: 1}

WinRunner

Input “Software Test” to Edit 1
Input “Hardware Test” to Edit 2

GUI MAP(TypeA)

GUI MAP(Type A&B)

Form2.TEdit_0:{
class: edit,
MSW_class: TEdit,
location: 0}
Form2.TEdit_1:{
class: edit,
MSW_class: TEdit,
location: 1

Form2.Edit1:{
class: edit,
MSW_class: TEdit,
dlph_name: Edit1}
Form2.Edit2:{
class: edit,
MSW_class: TEdit,
dlph_name: Edit2}

自動記録#### TSL(Test Script Language) ####
自動記録#### TSL(Test Script Language) ####
# Add-in Loaded(Type A)
set_window ("Form2", 2);
edit_set ("TEdit_0", "Software Test");edit_set ("TEdit_1", "Hardware Test");Click “SpeedButton1”# Add-in Loaded and TestSrvr(Type A&B)
set_window ("Form2", 3);
edit_set ("Edit1", "Software Test");edit_set ("Edit2", "Hardware Test");

図5 Delphi Add-inの種類による自動記録スクリプトの相違

3.3 カ ス タ ム オ ブ ジ ェ ク ト
カ ス タ ム オ ブ ジ ェ ク ト に 対 し て は 類 似 ク ラ ス に "マッ ピ ン グ "す る こ と に よ り ，当 該 オ ブ ジ ェ ク ト に 対 し て

button_press ("SpeedButton");

図７ 仮想オブジェクト

4. 適 用 パ タ ー ン と 結 果 分 析
4.1 認 識 率 の 比 較
弊社製品の一つUC-win/Frame(3D) を 使 用 し てDelphi Add-in の 適 用 形 態 別 に オ ブ ジ ェ ク ト の 認 識 率 を測定した．

尚 ， こ こ で 述 べ る "認 識 率 "と は 下 記 の 条 件 を 満 た す・類似クラスへのマッピングが行われていないため，ものとする．

正確に記録出来ない操作がある．

・ シ ナ リ オ に 沿 っ て Application の 操 作 を 行 い ，

図 ９ は ComboBox か ら あ る エ ン ト リ を 選 択 し た 時

WinRunner で 自 動 記 録 す る ．

の両適用パターンの記録例である．
#Pattern_A
obj_mouse_click ("TComboBox", 174, 12, LEFT);・ス ク リ プ ト 及 び GUI マ ッ プ に 対 す る カ ス タ マ イ ズ
は一切行わない．

#Pattern_B
list_select_item ("TComboBox_1", "Members");

・自動記録終了後，作成されたスクリプトを再生実行し、正しく再生された比率．

図 ９ TcomboBox の 記 録 例

今回は 3 種類の環境でそれぞれ認識率の測定を行った。
・ Pattern_A

Add-in 適 用 無 しPattern_B と C の 相 違 点

・ Pattern_B

Add-in を 適 用 (Type A)

・ TPanel オ ブ ジ ェ ク ト の 認 識・ Pattern_C

Add-in を 適 用 (Type A + Type B)

Pattern_C で は 関 数 "dlph_panel_button_press" が 使
用 さ れ ， Panel オ ブ ジ ェ ク ト に 対 す る 操 作 を 記 録

測定結果を表１に示す．
表 １ Add-in パ タ ー ン 別 認 識 率
総 Step 数 再 生 動 作
認識率
OK
NG
Pattern A 104
74
30
71%
Pattern B 104
81
23
78%
Pattern C 104
85
19
82%
各パターンによる認識率の相違は主に以下のよう

出 来 て い た が Patten_B で は 全 く 記 録 出 来 て い な かった．
今 回 の 測 定 で は 自 動 記 録 完 了 後 ，ス ク リ プ ト を Step
走行させて認識率を正確に集計しているが，簡易的な方法としては一連の操作を記録した後，標準・カスタ
ム各オブジェクトの出現率を集計するだけでおおよそな原因に起因するものであった．

の認識率は求められることになる．

Pattern_A と B の 相 違 点
・ 同 一 画 面 に 同 種 類 (同 じ ク ラ ス )の オ ブ ジ ェ ク ト が4.2 認 識 率 の 比 較

複 数 存 在 す る 場 合 ，Add-in が 適 用 さ れ て い な い と

表 １ に 示 し た 通 り ，Add-in 適 用 に よ る 認 識 率 の 向 上

オブジェクトによっては一意に識別することがはそれほど大きなものではない。但し，記録されたス

出来ないことがある．

クリプトの再利用性の高さ，あるいはメンテナンスの

図 ８ は label プ ロ パ テ ィ が 取 得 出 来 な い 為 、 コ ン

容易さ等はこの認識率と一致するものでないことに留ト ロ ー ル ID が 物 理 的 記 述 に 加 え ら れ た 例 で あ る ．

意する必要がある．

{

各 Add-in 適 用 パ タ ー ン 別 の GUI マ ッ プ 及 び 自 動 記

class: object,label: 1,
MSW_id: 2164510,
MSW_class: TSpinEdit

録スクリプトの特徴を表２に示す。
テストの実運用においてはオブジェクト認識率
100%で な い と 意 味 を 成 さ な い ． 各 Add-in 適 用 パ タ ー}
図 ８ Pattern_A に お け る TSpinEdit の 物 理 的 記 述

ン 別 に 認 識 率 が 100%と な る よ う 修 正 を 加 え た ． 修 正の特徴を表３に，修正用スクリプトを図１０に示す．

表２ Add-in適用パターン別 GUIマップ及び自動記録スクリプトの特徴
Add-in
適用パターン

Pattern_A

GUIマップ
物理的記述
・メニュー項目を除く全てのオブジェクトがobjectクラスにマッピングされる(*1)。
・HWNDやコントロールIDが物理的記述に採用された場合、再生時認識不能。

Pattern_B・dlph_init内で定義済みのオブジェクトは各々最適なクラスにマッピングされる。
・カスタムオブジェクトは全てobjectクラスにマッピングされる。
このようなオブジェクトはPattern_Aと同様認識不能となる場合有り。

Pattern_C

同上

論理名

スクリプト

"クラス名" orほとんど全ての操作を"labelプロパティ"(*2) "obj_mouse_click" or "obj_type" で記録。
マッピングされたクラス固有の関数で記録。
button_press();
eidt_set();tab_select_item(); 等Pattern_Bの内容に加え、Delphオブジェクトの PanelやGridの操作関数が記録される。
Nameプロパティ
dlph_panel_button_press();tbl_get_cell_data(); 等
同上(*1)#32770等のOSに用意されたダイアログを除く(*2)labelプロパティは多くのDelphiオブジェクトには存在しないが、caption等がlabelとして採用されている

表３ Add-in適用パターン別 テスト修正方法の特徴
Add-in
適用パターン
Pattern_A

修正方法
オブジェクト毎に類似クラスにマッピングする関数を初期化スクリプトに追加する。

Pattern_B

同上Pattern_C

同上

修正対象オブジェクト
ほぼ全てのオブジェクト
カスタムオブジェクト及び
dlph_initに含まれていないDelphiオブジェクト
同上#### TSL(Test Script Language) ####
#Pattern_A修正用初期化スクリプト---------------------------------------------------##Customized object
set_class_map("F8ToolBarClass", "toolbarwindow32");
set_record_attr("F8ToolBarClass", "class MSW_class", "label", "location");
set_record_method("F8ToolBarClass", RM_RECORD);
set_class_map("TF8CheckListBoxClass", "listbox");
set_record_attr("TF8CheckListBoxClass", "class MSW_class", "label", "location");
set_record_method("TF8CheckListBoxClass", RM_RECORD);
set_class_map("TF8Panel", "object");
set_record_attr("TF8Panel", "class MSW_class", "label", "location");
set_record_method("TF8Panel", RM_RECORD);
set_class_map("TF8Edit", "edit");
set_record_attr("TF8Edit", "class MSW_class", "label", "location");
set_record_method("TF8Edit", RM_RECORD);
set_class_map("TF8ComboBox", "combobox");
set_record_attr("TF8ComboBox", "class MSW_class", "label", "location");
set_record_method("TF8ComboBox", RM_RECORD);
set_class_map("TF8ListView", "syslistview32");
set_record_attr("TF8ListView", "class MSW_class", "label", "location");
set_record_method("TListView", RM_RECORD);##Delphi standard object
set_class_map("TToolBar", "toolbarwindow32");
set_record_attr("TToolBar", "class MSW_class", "label", "location");
set_record_method("TToolBar", RM_RECORD);
set_class_map("TSpinEdit", "object");
set_record_attr("TSpinEdit", "class MSW_class", "label", "location");
set_record_method("TSpinEdit", RM_RECORD);
set_class_map("TPanel", "object");
set_record_attr("TPanel", "class MSW_class", "label", "location");
set_record_method("TPanel", RM_RECORD);
set_class_map("TPageControl", "SysTabControl32");
set_record_attr("TPageControl", "class MSW_class", "label", "location");
set_record_method("TPageControl", RM_RECORD);
set_class_map("TComboBox", "combobox");
set_record_attr("TComboBox", "class MSW_class", "label", "location");
set_record_method("TComboBox", RM_RECORD);
set_class_map("TListBox", "listbox");
set_record_attr("TListBox", "class MSW_class", "label", "location");
set_record_method("TListBox", RM_RECORD);
set_class_map("TListView", "syslistview32");
set_record_attr("TListView", "class MSW_class", "label", "location");
set_record_method("TListView", RM_RECORD);
set_class_map("TTreeView", "systreeview32");
set_record_attr("TTreeView", "class MSW_class", "label", "location");
set_record_method("TTreeView", RM_RECORD);#Pattern_B修正用初期化スクリプト---------------------------------------------------add_dlph_obj ("TF8CheckListBoxClass", "listbox", "class MSW_class dlph_name", "dlph_parent","Selection", DLPH_OBJ);
add_dlph_obj ("F8ToolBarClass", "toolbarwindow32", "class MSW_class dlph_name", "dlph_parent","Enabled", DLPH_OBJ);
add_dlph_obj ("TF8Panel", "object", "class MSW_class dlph_name", "dlph_parent","Enabled", DLPH_OBJ);
add_dlph_obj ("TF8Edit", "edit", "class MSW_class dlph_name", "dlph_parent","Compare", DLPH_OBJ);
add_dlph_obj ("TF8ComboBox", "combobox", "class MSW_class dlph_name", "dlph_parent","Selection", DLPH_OBJ);
add_dlph_obj ("TListView","syslistview32", "class MSW_class dlph_name", "dlph_parent","Selection", DLPH_OBJ);
add_dlph_obj ("TToolBar", "toolbarwindow32", "class MSW_class dlph_name", "dlph_parent","Enabled", DLPH_OBJ);#dlpj_Panel_Button_Pressが記録をHookしてしまうのでここで再定義してやる必要有
add_dlph_obj ("TPanel", "object", "class MSW_class dlph_name", "dlph_parent", "Enabled", DLPH_OBJ);#Pattern_C修正用初期化スクリプト---------------------------------------------------add_dlph_obj ("TF8CheckListBoxClass", "listbox", "class MSW_class dlph_name", "dlph_parent","Selection", DLPH_OBJ);
add_dlph_obj ("F8ToolBarClass", "toolbarwindow32", "class MSW_class dlph_name", "dlph_parent","Enabled", DLPH_OBJ);
add_dlph_obj ("TF8Panel", "object", "class MSW_class dlph_name", "dlph_parent","Enabled", DLPH_OBJ);
add_dlph_obj ("TF8Edit", "edit", "class MSW_class dlph_name", "dlph_parent","Compare", DLPH_OBJ);
add_dlph_obj ("TF8ComboBox", "combobox", "class MSW_class dlph_name", "dlph_parent","Selection", DLPH_OBJ);
add_dlph_obj ("TListView","syslistview32", "class MSW_class dlph_name", "dlph_parent","Selection", DLPH_OBJ);
add_dlph_obj ("TToolBar", "toolbarwindow32", "class MSW_class dlph_name", "dlph_parent","Enabled", DLPH_OBJ);

図１０ Add-in適用パターンテスト別

修正用初期化スクリプト

・ 開発 Group 側のテスト用 Build 作成の都度，Test

5. 考 察
5.1 コ ス ト の 考 察Group 側でも TestSrvr Unit を組み込んだ Build を作成

テ ス ト ス ク リ プ ト 及 び GUI マ ッ プ の 作 成・維 持 コ ス

する必要が発生する．

ト面に着目して考えると，当然のことではあるが全てテスト Phase 中に短いスパンで Build が作成されるの Add-in を 適 用 す る 方 法 (Pattern_C)が 最 も パ フ ォ ー マ

ような場合，TestGroup 側の作業負担が大きくなる．

ンスが良い．特にスクリプト内で記述されるオブジェ(3) 下 記 に 示 す よ う な 問 題 は ， 社 内 で 充 分 な コ ン セクトの論理名に判読が容易な名称が用いられることはンサスを取らない限り実施困難．

スクリプトメンテナンスの見地からは無視出来ない重・ 開 発 側 で 作 成 す る Build に TestUnit(TestSrver)

要 な 要 素 で あ り ， そ の 意 味 で オ ブ ジ ェ ク ト の Name プを組み込んでもらう必要がある．物理的負担

ロパティをデフォルトで論理名に採用してくれる適用は少ないが，心理的抵抗が大きい．

方法には魅力がある．

・ TestUnit を 出 荷 製 品 に ま で 組 込 む か 否 か ．

次 に Pattern_A と B を 比 較 す る と ， 作 成 ・ 維 持 コ ス

組込まなければ実際はテストしていないモジ

トの差はカスタムオブジェクトの使用個数及び使用割

ュールが製品として出荷されることになる．

合に左右されるところが大きい．カスタムオブジェク
トの割合が大きくなるにつれコスト差は小さくなる．

5.3 社 内 に お け る 適 用 手 法 の 検 討

仮 に Application 内 の 全 て の オ ブ ジ ェ ク ト が カ ス タ ム

平 成 14 年 秋 よ り 弊 社 TestGroup は 自 社 開 発 製 品 へ のオ ブ ジ ェ ク ト で あ れ ば Pattern_A と B の コ ス ト 差 は ゼ

自 動 テ ス ト 導 入 を 開 始 し た ．2 つ の 製 品 (UC-win/Road，

ロ に 近 い も の に な り ，逆 に 全 て が 標 準 Delphi オ ブ ジ ェUC-win/Frame(3D) 図 １ ４ ， １ ５ 参 照 )へ の 導 入 が 決 まクトであればかなり大きな差が発生する．

っ て い た が 当 時 ま だ ど の Add-in 適 用 パ タ ー ン が 最 も次 に テ ス ト に 要 す る コ ス ト で あ る が ，Pattern_C で は

有 効 か 模 索 し て い た 段 階 で あ っ た た め ，Road に つ い て

テスト対象アプリケーションに毎回テスト用ユニット

は Pattern_B で，Frame(3D)については Pattern_C(Application

を組み込む必要が生ずる．これはテストの実業務へのへの Unit 組込は TestGroup が担当)を適用して各々の有効性を導入においてデリケートな問題と成り得る要素である．

検証することにした．

こ の 作 業 は テ ス ト 版 Application 更 新 の 都 度 発 生 す る
単なるランニングコストの問題に止まらず，組込作業

実製品に対する自動テスト作成作業を通して得た所感は以下の通りである．

の担当や組込範囲の問題等，社内の業務フローや社と・製品におけるカスタムオブジェクトの使用割合がしての製品に対するコンセンサスまで考慮すべき側面高い．特に製品のオペレーションを通して数多くを含んでいるからである．本件については次節で詳し使用されるオブジェクトや細かい設定・操作等をく考察する．ツール自体の導入・維持コストに関して行うオブジェクト程社内で開発したカスタムオ

は表４を参照されたい．

ブジェクトが使用される傾向にある．このため，
Delphi Add-in を２種類とも適用している Pattern_C の

5.2 業 務 フ ロ ー の 考 察

テ ス ト で さ え も 記 録 し た テ ス ト に 再 生 不 良 Step

自 動 テ ス ト の 作 成・維 持 及 び 実 施・報 告 は Test 専 門が数多く含まれることになり，スクリプト及び部 署 で 行 う 前 提 に 立 つ と ，Add-in の 適 用 パ タ ー ン 毎 にGUI マ ッ プ 修 正 に か な り の コ ス ト を 要 す る こ と に想定される業務フローは以下の３種類である．

なった．

(1) Add-in Pattern_A or B の 場 合 （ 図 １ １ 参 照 ）(2) Add-in Pattern_C [TestGroup で Add-in Unit 組 込 ]（図１２参照）(3) Add-in Pattern_C [開 発 Group で Add-in Unit 組 込 ]（図１３参照）

・TestGroup 側 で の Build 作 成 工 数 を 無 視 出 来 な い 場
合がある．製品のリリース期日近くになると 1 日
2,3 回 の Build が 作 成 さ れ る よ う な ケ ー ス も あ り ，
そ の 都 度 TestGroup 側 で 最 新 ソ ー ス フ ァ イ ル を 取
り 込 ん だ 上 で TestUnit を 組 み 込 ん だ Build を 作 成

各々想定される問題点を以下に示す．

する作業は，工期が差し迫っている時期には大き(1) テ ス ト の 作 成・維 持 コ ス ト が (2)(3)よ り 比 較 的 大

な負担となった．

きい．
(2) ・TestGroup 側に開発 Group と同様の Application 構築
環境が必要になる．
担当する製品の増加に比例して，環境の維持が困難になって行くと予想される．

また自動テストの導入は現在の作業を通して社内での実績を作っている段階であり，現状では極力開発
Group 側 に 負 担 を か け な い 考 慮 も 必 要 で あ る ．
上 記 の 様 な 理 由 を 検 討 し た 結 果 ，TestGroup 現 時 点 の方 針 と し て は ， Add-in 適 用 パ タ ー ン の Pattern_B が 最も適しているとの結論に至っている．

表４ Add-in適用パターン別 コスト比較
Add-in
適用パターン
Pattern_A
Pattern_B
Pattern_C

テスト作成・維持コスト

テスト実行時コスト

ツール自体のコスト

×(*1)
○(*2)
◎(*3)

－
－
×(*4)

○(*5)
×(*6)
×(*6)

(*1) ほぼ全てのオブジェクトが自動ではobjectクラスとしてしか認識されない。
(*2) 標準Delphiオブジェクトに関しては最適なクラスにマッピングされる。
(*3) ・GridやPanelオブジェクトに対して、個別の便利な関数が使用可能となる。
・Nameプロパティを取得出来る。
(*4) ApplicationにTestUnitを組込んで、再構築する必要有り。詳細は”５．２ 業務フロー”参照。
(*5) WinRunner本体以外のコストは発生しない。
(*6) 組込み用TestUnit(TestSrvr)は別売り。購入及び維持費用が別途発生。

開発・Test Phase

Application
修正

出荷 Phase

ベータ版
作成

製品版
作成

出荷作業

開発
Group
テスト結果報告

テスト実施

ベータ版
Application

Test
Group

テストスクリプト作成

自動テスト実施

図１１ 業務フロー①（Add-in 適用Pattern_A or Bの場合）
図１４ テスト対象Application UC-win/Frame(3D)

開発・Test Phase
Application
修正

開発
Group

出荷 Phase

ベータ版
作成

テスト依頼

製品版
作成

出荷作業

テスト結果報告

テスト実施

ベータ版
作成
（Add-in Unit込）

Test
Group

ベータ版
Application

テストスクリプト作成

自動テスト実施

図１２ 業務フロー②（Add-in 適用Pattern_C [TestGroupでAdd-in Unit組込]）

開発・Test Phase

Application
修正

開発
Group

出荷 Phase

ベータ版
作成（Test Unit 込）

製品版
作成

出荷作業

テスト結果報告

テスト実施

図１５ テスト対象Application UC-win/Road

6. む す び
本 論 文 で は 弊 社 TestGroup の 業 務 経 験 に 基 づ き ，WinRunner の Delphi Add-in パ タ ー ン を 調 査 し ， 各
Add-in の 有 効 性 を コ ス ト 及 び 業 務 フ ロ ー に 鑑 み て 分 析した．
現 在 弊 社 TestGroup で は 初 期 の 2 製 品 に 更 に 2 製 品

ベータ版
Application

Test
Group

テストスクリプト
作成を加え，4 製品に対して自動テストを実施しているが自動テスト実施

今後の課題として自動テスト作成自体のコストパフォーマンス改善があげられる．自動テストの作成工数は

図１３ 業務フロー③（Add-in 適用Pattern_C [開発GroupでAdd-in Unit組込]）

1 回のマニュアルテストとは比較できないほど大きい
ため，必然的に再利用性の高さやメンテナンスの容易さ が 要 求 さ れ る ．現 在 で も Free ラ イ ブ ラ リ (注1) の 利 用

や，関数の共通化等でパフォーマンスの向上を図っているが，今後特に取り組むべきものとしてカスタムオ
ブ ジ ェ ク ト に 対 す る "ユ ー ザ 定 義 記 録 関 数 "の 開 発 を あげ た い ．こ れ は 別 途 作 成 し た DLL と 連 係 す る こ と に より ， ユ ー ザ が 意 図 (DLL に て 設 計 )し た 通 り の ス テ ー ト
メントがスクリプトに記録される仕組みである．複数の製品間で使用頻度の高いカスタムオブジェクトに適用することにより，テストの作成・維持コストに大きく寄与するものと考えられる．
(注 1)： csolib(http://wilsonmar.com/1winrun.htm),
func_ra(http://www.itechnologist.com/tech/) 等 ．

文

献[1] 唐 島 め ぐ み ， 烏 山 幸 嗣 ， “ ソ フ ト ウ エ ア の テ ス ト
自 動 化 手 法 ，” OMRON TECHNICS, Vol.39, No.4,
pp.330(90)-333(93), Jan.2000.
[2] “WinRunner カスタマイズ・ガイド Version7.01，”マー
キュリー・インタラクティブ・ジャパン株式会社, 2001.
[3] “ WinRunnerTSL リファレンス・ガイド Version7.01，”
マーキュリー・インタラクティブ・ジャパン株式会社,
2001.
[4] “ TestSuite7.0 製 品 概 要 説 明 書 ，”株式会社アシスト