Presentation is loading. Please wait.

Presentation is loading. Please wait.

Data Dependency based Test Case Generation for BPEL Unit Testing

Similar presentations


Presentation on theme: "Data Dependency based Test Case Generation for BPEL Unit Testing"— Presentation transcript:

1 Data Dependency based Test Case Generation for BPEL Unit Testing
大阪大学 大学院情報科学研究科 Choy Kho Yee おはようございます。 大阪大学のChoyです。 本日は「Data Dependency based Test Case Generation for BPEL Unit Testing」について発表させていただきます。 宜しくお願いします。 2008/03/18

2 概要 背景 提案手法 実験 BPELによるサービスの記述とそのテスト方法 テストケースの作成 テスト対象の実行履歴記録
テスト対象の入出力データの型情報と依存関係を利用して、一貫性をもつテストデータを生成する テストデータを用いてテストケースを構築する テスト対象の実行履歴記録 BPEL標準機能だけを用いてプラットフォーム独立な手法で実現する 実験 提案手法を実装したシステムを実際に運用してもらい、評価実験を行った 本日はまず研究の背景であるBPELによるサービスの記述とそのテスト方法を説明します。 つぎに、テスト支援を目的として提案したテストケース作成手法とテスト対象の実行履歴記録手法について説明します。 テストケースの作成に関しては、テスト対象の入出力データの型情報と依存関係を利用して、一貫性を持つテストデータを生成します。 そして、生成されたテストデータを用いてテストケースを構築します。 また、BPEL標準機能だけを用いてプラットフォーム独立な実行履歴記録を実現します。 最後に、提案したテストケース作成手法を実装したシステムを実際に運用してもらい、評価実験を行いました。 その結果についても報告いたします。 第159回 ソフトウェア工学研究発表会 2008/03/18

3 SOAとBPEL サービス指向アーキテクチャ(SOA)とは、ネットワーク上の「サービス」をメッセージ通信で呼び出すアーキテクチャ
一般的にXMLメッセージを利用 ウェブサービスビジネスプロセス実行言語(BPEL)とは、サービス合成のために設計されたXMLベースの言語 WSDL、XML Schema、XPathを利用 BPELで書かれたプログラムはBPELプロセスという 本研究の背景には、SOAとBPELがあります。 サービス指向アーキテクチャ(SOA)とは、ネットワーク上の「サービス」をメッセージ通信で呼び出すことによって、ソフトウェアシステムを構築する開発手法です。 一般的に、XMLメッセージを通信に利用します。 一方、ウェブサービスビジネスプロセス実行言語(BPEL)は、これらのサービスを合成するために設計されたXMLベースの言語です。 BPELは、WSDLやXML Schema、XPathなどの既存XML技術を利用します。 また、BPELで書かれたプログラムはBPELプロセスといいます。 第159回 ソフトウェア工学研究発表会 2008/03/18

4 BPELプロセスの例 XMLデータ通信 パートナー サービス BPELプロセス クライアント オペレーション GeoInfo
<request> <search>tropical island</search> </request> <query> <keyword>tropical island</keyword> </query> GeoInfo <response> <result>Hawaii</result> <result>Bali</result> </response> クライアント オペレーション <query> <from>Japan</from> <to>Hawaii</to> </query> Currency Exchange <response> <result>…</result> </response> ここでBPELプロセスの例を示します。 BPELプロセスはクライアントからXMLデータを受け取り、必要に応じてパートナーサービスが提供するオペレーションを呼び出します。 この例では、BPELプロセスはクライアントから検索キーワードを受け取り、それをGeoInfoサービスへ転送して、キーワードに関連する地名を検索します。 次に、結果として受け取った地名をCurrencyExchangeサービスへ転送し、為替レートを取得します。 最後に、結果を整理してクライアントに返します。 <query> <from>Japan</from> <to>Bali</to> </query> 第159回 ソフトウェア工学研究発表会 2008/03/18

5 BPELプロセスの単体テスト パートナー サービス BPELプロセス クライアント GeoInfo 第159回 ソフトウェア工学研究発表会
<request> <search>tropical island</search> </request> <query> <keyword>tropical island</keyword> </query> GeoInfo <response> <result>Hawaii</result> <result>Bali</result> </response> クライアント <query> <from>Japan</from> <to>Hawaii</to> </query> Currency Exchange <response> <result>…</result> </response> BPELプロセスの単体テストでは、クライアントおよび各パートナーはBPELプロセスの単体テストフレームワークによって仮に立ち上げられます。 <query> <from>Japan</from> <to>Bali</to> </query> 第159回 ソフトウェア工学研究発表会 2008/03/18

6 BPELプロセスの単体テスト BPELUnit BPELプロセスの単体テストフレームワーク
代理クライアント BPELUnit BPELプロセスの単体テストフレームワーク P. Mayer, D. Lübke, Towards a BPEL unit testing framework. TAV-WEB’06, July 17, 2006. 代理パートナーサービス GeoInfo BPELプロセスは、これらの代理クライアントと代理サービスと通信を行い、代理クライアントと代理サービスはBPELプロセスからの出力を検証します。 この単体テストの仕組みはBPELUnitとして実装されました。 Currency Exchange 第159回 ソフトウェア工学研究発表会 2008/03/18

7 BPELUnitのテストケース作成 依存関係を満たしたテストデータを 一貫性を持つテストデータという 依存 検証 検証 検証 検証
テストパス XML 依存 検証 XML 検証 XML 検証 XML 検証 BPELUnitのテストケースを作成するために、2つのステップが必要です。 まず、そのテストケースの中に、テストしたいBPELプロセスのパスを決定し、そのパス上に呼び出されるサービスをきめます。 次に、クライアントと各サービスがテスト対象に送信するXMLデータと、テスト対象からの出力を検証するための検証式を作成します。 これからは、このXMLデータと検証式のことをまとめてテストデータといいます。 テストデータ間には依存関係が存在します。 たとえば、このXMLデータに入っている情報がここに出てくるという前提があれば、ここの検証式でその値が正しくでてきているかを検証します。 ここで、依存関係を満たしたテストデータのことを、一貫性を持つテストデータといいます。 依存関係を満たしたテストデータを 一貫性を持つテストデータという 第159回 ソフトウェア工学研究発表会 2008/03/18

8 BPELUnit TestSuite Editor
BPELUnitの付属ツールBPELUnit TestSuite Editorでは、開発者は送信データや検証式を手入力で行わなければなりません。 したがって、開発者に大きな負担がかかります。 検証式の指定 送信データ入力 第159回 ソフトウェア工学研究発表会 2008/03/18

9 BPELUnitでのテスト結果表示 得られる情報 詳細な実行履歴の取得はBPELエンジンに依存 各テストケースに指定された検証式の結果
送受信メッセージの内容 詳細な実行履歴の取得はBPELエンジンに依存 テストカバレッジなどの算出が困難 また、BPELUnitのテスト実行結果はこのように表示されます。 JUnitと似たような表示方法を採用しています。 この画面から得られる情報は、各テストケースに指定された検証式の結果と送受信メッセージの内容だけとなりますので、テスト対象の詳細な実行履歴はこれだけではわかりません。 詳細な実行履歴を取得するためには、BPELエンジンが提供するAPIが利用できますが、標準ではないため、プラットフォームに依存してしまいます。 そのため、テストケースが十分なのかを判断するために必要なテストカバレッジなどの算出が困難となります。 第159回 ソフトウェア工学研究発表会 2008/03/18

10 研究動機と目的 一貫性をもつテストデータを作成するのが困難 テスト実行履歴の取得は支援されていない 提案および実装
サービスが送受信するXMLデータの構造が複雑 既存ツールは、テストデータの作成を支援していない テスト実行履歴の取得は支援されていない 提案および実装 一貫性をもつテストデータの生成を中心にしたテストケースの作成手法 プラットフォーム独立なテスト実行履歴記録手法 ここで、本研究の動機と目的を整理します。 まず、サービスが送受信するXMLデータの構造が一般的に複雑であり、既存ツールでは、テストデータの作成を一切支援していませんので、一貫性を持つテストデータを作成するのが困難です。 また、テスト実行履歴の取得についても支援されていませんので、作成したテストケースが十分なのか否かを判断するために必要な材料はありません。 したがって、本研究では、一貫性を持つテストデータの生成を中心にしたテストケースの作成手法およびプラットフォーム独立なテスト実行履歴記録手法の提案および実装を目的としました。 第159回 ソフトウェア工学研究発表会 2008/03/18

11 研究動機と目的 一貫性をもつテストデータを作成するのが困難 テスト実行履歴の取得は支援されていない 提案および実装
サービスが送受信するXMLデータの構造が複雑 既存ツールは、テストデータの作成を支援していない テスト実行履歴の取得は支援されていない 提案および実装 一貫性をもつテストデータの生成を中心にしたテストケースの作成手法 プラットフォーム独立なテスト実行履歴記録手法 まず、一貫性をもつテストデータの生成を中心にしたテストケースの作成手法について説明します。 第159回 ソフトウェア工学研究発表会 2008/03/18

12 着目点 BPELはサービスの合成を目的に設計されたため、高度なデータ処理機能がない[1]
BPELでは、データ処理にXPathを標準に採用している 従って、BPELの入出力データ間での関係は 簡単なXPath式で記述できると考えられる 一貫性をもつテストデータを作成するために、本研究ではBPELのデータ処理機能に着目しました。 設計目的のため、BPELプロセスの主な働きはサービスの合成なので、BPELには高度なデータ処理機能はありません。 また、BPELでは、データ処理のためにXpath式を標準に採用しています。 従って、BPELの入出力データ間での関係は簡単なXpath式で記述できるのではないかと考えました。 [1] F.Leymann, D.Roller, S.Thatte, Goals of the BPEL4WS Specification. 第159回 ソフトウェア工学研究発表会 2008/03/18

13 XPath式 XML文書から情報を抽出するための式 XML文書を木として扱い、経路で要素を特定
関数によって真偽値、ノード、ノードの集合を返す XML文書 XPath式 結果 /response/result[1]/text() "Hawaii" count(/response/result) 2 /response/result 2つのresultノード <response> <result>Hawaii</result> <result>Bali</result> </response> XPath式とは、XML文書から情報を抽出するための式です。 たとえば、このXML文書に対して、これらのXPath式を適用すると、それぞれに対してこのような結果が返されます。 第159回 ソフトウェア工学研究発表会 2008/03/18

14 提案手法 開発者は、テスト対象のプロセスが呼び出すパートナーサービスのオペレーション集合を指定する
開発者は、これらのオペレーションの入出力間での依存関係をXPath式を用いて指定する システムは、データ間での依存関係に基づき必要なデータを生成する 独立入力 – XMLスキーマに従ってランダムに生成 依存入力 – XPath式に従って生成 依存出力 – XPath式に従って検証式を生成 独立出力 – 開発者が明示的に指定した値で検証式を生成 システムは、生成されたテストデータを用いてテストケースを構築する 提案手法では、この4つのステップでテストケースを作成します。 まず、開発者は、テスト対象のプロセスが呼び出すパートナーサービスのoperation集合を指定します。 つぎに、開発者がこれらのoperationの入出力間での依存関係をXPath式を用いて指定します。 開発者が行う作業はこれで終わります。 それから、システムがデータ間での依存関係に基づき必要なデータを生成します。 まず、テスト対象への独立な入力について、XMLデータをXMLスキーマにしたがってランダムに生成します。 ほかのデータに依存する入力と出力について、Xpath式に従ってデータと検証式を生成します。 しかし、独立な出力については、開発者が明示的に指定した値で検証式を生成します。 最後に、システムが生成されたテストデータを用いて、テストケースを構築します。 第159回 ソフトウェア工学研究発表会 2008/03/18

15 データ依存の種類 /request/search = /query/keyword 代入 多重度 /response/resultの数
<search>tropical island</search> </request> <query> <keyword>tropical island</keyword> </query> GeoInfo <response> <result>Hawaii</result> <result>Bali</result> </response> <query> <from>Japan</from> <to>Hawaii</to> </query> Currency Exchange /response/resultの数 = count(/response/result) 本研究で対象とするデータ依存の種類を、例をとおして説明します。 代入とは、依存元の値は、ほかのデータに依存し、指定されたXPath式の演算結果の値、または、固定値であるような依存です。 たとえば、GeoInfoの検索キーワードは最初にプロセスに入力されたキーワードと同じです。 そして、多重度とは、依存元の発生回数は、ほかのデータに依存し、指定されたXPath式の演算結果の値、または、固定値であるような依存です。 ただし、依存元として、XMLデータだけではなく、Operationも指定できます。 <query> <from>Japan</from> <to>Bali</to> </query> オペレーションの呼出回数 = count(/response/result) <response> <result>…</result> </response> 第159回 ソフトウェア工学研究発表会 2008/03/18

16 テストケース生成部のシステム構成 BPEL Data Dependency Editor
XMLデータの型情報 データ依存情報 BPEL Data Dependency Editor Eclipseのプラグインとして実装 開発者にデータ依存を定義するGUIを提供 BPEL Data Dependency Description データ依存を記述したXML文書 Test Case Generator テストデータとテストケースを生成 提案手法を次の3つの部分に分けて実装しました。 BPEL Data Dependency Editor は Eclipse のプラグインとして実装され、開発者にデータ依存を定義するGUIを提供します。 定義したデータ依存は BPEL Data Dependency Description という XML 文書に記録されます。 Test Case Generator は、BPEL Data Dependency Description ファイルに記述されたデータ依存情報と、各サービスの WSDL ファイルから取得できる XML データの型情報に基づき、テストデータとテストケースを生成します。 第159回 ソフトウェア工学研究発表会 2008/03/18

17 BPEL Data Dependency Editor
テストケース関連 オペレーション 集合の一覧 XMLデータ 構造の表示 XPath式挿入 データ依存 記述・追加 これが BPEL Data Dependency Editor のメイン画面です。 開発者が、テストケースに関連するoperation集合を一覧から選択すると、それぞれのoperationが送受信するXMLデータの構造が画面の右側にツリーとして表示されます。 このツリーの上で右クリックやダブルクリックをすれば対象ノードに対応するXPath式が自動的に挿入されます。 開発者はデータ依存の種類やほかのパラメータを設定してから、データ依存を実際に追加します。 追加されたデータ依存の一覧は画面の下に表示されます。 追加された データ依存一覧 第159回 ソフトウェア工学研究発表会 2008/03/18

18 BPEL Data Dependency Description
<bpelDataDependencies> </bpelDataDependencies> <name/> <baseURL/> <deployment/> BPELUnitテストケースに必要な情報 <operationSets> </operationSets> <operationSet> <operations/> <messages/> <dependencies/> </operationSet> テストケースに関連するオペレーションの集合 送受信メッセージとそのID データ依存の記述 そして、BPEL Data Dependency Description文書の構造はこのようになっています。 一番上の部分はBPELUnitのテストケースに必要な情報をまとめているだけで、提案手法とあまり関係していません。 開発者が指定したテストケースに関連するオペレーションの集合は次の部分にまとめています。 また、実装を簡単にするために、各メッセージにIDが自動的に振られるようにしています。 その対応関係はこの部分に記録されています。 そして、データ依存に関する記述は、このdependenciesという項目の中に書かれています。 それについて次の例をとおして説明します。 第159回 ソフトウェア工学研究発表会 2008/03/18

19 データ依存の指定例 代入の例 依存元のメッセージID 依存先のメッセージIDの集合 依存種類 <dependency targetMsgId= "3" dependsOnMsgId="1" type="substitution"> <target>./request/search</target> <dependsOn>./container/query/keyword</dependsOn> </dependency> ←依存元を指定するXPath式 ↑代入値を表すXPath式 多重度の例 依存種類 <dependency targetMsgId="2" dependsOnMsgId="3" type="multiplicity"> <target>./response/result</target> <dependsOn>count(./container/response/result)</dependsOn> </dependency> これがBPEL Data Dependency Descriptionにおけるデータ依存の指定例です。 ここでは、要素の値と多重度が、ほかの要素に依存し、XPath式によって記述された例をそれぞれお見せします。 まず、代入の例について説明します。 このtarget message idに、依存元のメッセージのIDを記述します。 dependsOnMsgIdに、依存先のメッセージIDの集合を記述します。 Typeに、依存の種類を記述します。 また、targetに、依存元のノードをXPath式を用いて指定します。 最後に、代入する値を同じようにXPath式を用いて指定します。 多重度についても同じように指定しますが、typeが代入の例と異なります。 第159回 ソフトウェア工学研究発表会 2008/03/18

20 テストデータの生成 データ依存テーブルを利用して生成できるデータから順に 生成していく (1回目呼出の)データ依存テーブル
データ格納用テーブル ID データ 依存先IDの集合 1 BPEL IN [ ] 2 BPEL OUT [4] 3 GeoInfo IN [1] 4 GeoInfo OUT 5 Currency IN 6 Currency OUT データ 1回目呼出用 2回目呼出用 (1) BPEL IN (2) BPEL OUT (3) GeoInfo IN (4) GeoInfo OUT (5) Currency IN (6) Currency OUT XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ 次に、テストデータの生成について説明します。 テストデータはデータ依存テーブルを利用して生成します。 データ依存テーブルには、データの内部IDと依存先IDの集合が記録されています。 さきほどの例では、3番のGeoInfo の入力は1番のBPELプロセスの入力に依存しています。 テストデータは依存先のデータがそろっているものから生成します。 全てのデータが生成された時点で、テストデータの生成プロセスが終了します。 ただし、この例では、CurrencyExchangeのoperationが2回呼び出されるため、そのためのデータも必要となります。 このデータもさきほどと同じように生成されます。 XMLデータ XMLデータ 第159回 ソフトウェア工学研究発表会 2008/03/18

21 テストケースの生成 生成されたテストデータを用いてテストケースを 作成していく データ格納用テーブル データ 1回目呼出用 2回目呼出用
(1) BPEL IN (2) BPEL OUT (3) GeoInfo IN (4) GeoInfo OUT (5) Currency IN (6) Currency OUT XML XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XMLデータ XML XMLデータ XMLデータ XMLデータ XMLデータ XML 検証 XMLデータ XMLデータ 最後に、生成されたテストデータを用いて、テストケースを作成します。 テストケースのひな形に対して、Operationの呼出回数に配慮しながらデータを埋めていきます。 これで、テストケースの作成手法についての説明が終わります。 生成されたテストデータを用いてテストケースを 作成していく 第159回 ソフトウェア工学研究発表会 2008/03/18

22 研究動機と目的 一貫性をもつテストデータを作成するのが困難 テスト実行履歴の取得は支援されていない 提案および実装
サービスが送受信するXMLデータの構造が複雑 既存ツールは、テストデータの作成を支援していない テスト実行履歴の取得は支援されていない 提案および実装 一貫性をもつテストデータの生成を中心にしたテストケースの作成手法 プラットフォーム独立なテスト対象の実行履歴記録手法 次に、プラットフォーム独立なテスト対象の実行履歴記録手法について述べます。 第159回 ソフトウェア工学研究発表会 2008/03/18

23 実行履歴記録 BPELの標準な機能だけで実現する
テスト対象の各アクティビティの前後に、実行履歴記録ウェブサービスを呼び出す記録用アクティビティを追加する 記録用アクティビティは、これから実行される、または実行されたアクティビティの名前を実行履歴記録ウェブサービスへ報告する 実行履歴記録ウェブサービスはログに記録し、各アクティビティの実行回数、成功回数、失敗回数を算出する 記録 Logger ここでは、BPELの標準な機能だけを用いて実行履歴の記録を実現します。 まず、テスト対象の中にある各アクティビティの前後に、実行履歴記録ウェブサービスを呼び出すアクティビティを追加します。 追加されたアクティビティは、これから実行されるアクティビティの名前と実行されたアクティビティの名前を実行履歴記録ウェブサービスへ知らせます。 実行履歴記録ウェブサービスはこれらの情報をログに残します。 ログから、各アクティビティの実行回数、成功回数および失敗回数を算出できます。 実行履歴記録 ウェブサービス ログ テスト対象 拡張したテスト対象 第159回 ソフトウェア工学研究発表会 2008/03/18

24 アクティビティ実行結果の判定 ログ 実行回数 1 成功回数 失敗回数 A B C 実行された A entered. A left.
B entered. 実行回数 1 成功回数 失敗回数 ただし、アクティビティの実行が成功したか、失敗したかを判定するためにこの方法を利用します。 A, B, C はそれぞれテスト対象にあるアクティビティです。 そして、前後にあるのは記録用に追加されたアクティビティです。 青い丸は該当アクティビティが実行されたことを表します。 アクティビティAの例では、その前後にある記録用アクティビティは実行されたため、Aは1回実行され、実行が成功したと判定します。 一方、アクティビティBの例では、その前にある記録用アクティビティだけが実行されたため、Bは1回実行され、その実行が失敗したと判定します。 また、アクティビティCの前後にある記録用アクティビティは実行されなかったため、Cは実行されなかったと判定します。 第159回 ソフトウェア工学研究発表会 2008/03/18

25 実行履歴記録部のシステム構成 BPEL Process Augmenter Logger Web Service
テスト対象に記録用アクティビティを追加する Logger Web Service 実行履歴を記録し、実行回数などの値を計算する BPELUnit Runner Editor Eclipseプラグイン BPEL Process Augmenterの呼出、テストケースの実行、実行履歴の表示 提案手法を次の3つの部分に分けて実装しました。 BPEL Process Augmenter は、テスト対象のBPELプロセスを入力として受け取り、それに記録用アクティビティの追加を行います。 開発者は、出力されたBPELプロセスをBPELエンジンに配置します。 BPELUnitで単体テストを行うと、記録用アクティビティが実行され、Logger Web Serviceのオペレーションが呼び出されます。 Logger Web Service は、実行履歴を実際に記録し、実行回数などの値を計算します。 開発者は、BPELUnit Runner Editor で操作を行います。 これは Eclipse のプラグインとして実装され、BPEL Process Augmenterの呼出やテストケースの実行、そして実行履歴情報の表示を行います。 現時点では、BPELプロセスのサーバへの配置以外が、このエディタから操作できるようになっています。 第159回 ソフトウェア工学研究発表会 2008/03/18

26 実行履歴情報の表示 実行されたアクティビティの 実行回数、成功回数、失敗回数 このテストケースで 実行されなかったアクティビティ
これが実際の実行履歴情報の表示の例です。 結果の表示はテストケースごとにまとめています。 各アクティビティの実行回数と成功回数、そして失敗回数が表示され、テストケース中に実行されなかったものはハイライトされ表示されます。 現段階の実装では、このような表での表示になっていますが、よりわかりやすくするために、これからはグラフィカルな表示に拡張したいと考えています。 このテストケースで 実行されなかったアクティビティ 第159回 ソフトウェア工学研究発表会 2008/03/18

27 適用実験の概要(1/2) 対象:BPEL初心者の大学院生(M1)4名 利用ツール 手順 評価点
BPELUnit TestSuite Editor(従来ツール) BPEL Data Dependency Editor(提案ツール) 手順 背景知識やツールの使い方について説明を受ける 2つのBPELプロセスの仕様とテスト仕様について理解する 決められた順番で2つのBPELプロセスのためのテストケースを異なるツールで作成する 評価点 テストケースの性質 一般的な間違い テストケースの作成について提案した手法の有効性を評価するために、適用実験を行いました。 実験に協力してくれたのは、BPEL初心者の大学院生4名です。 そして、テストケースの作成に利用したツールは、従来ツールである BPELUnit TestSuite Editor と、提案手法を実装した BPEL Data Dependency Editor です。 実験は次のように行われました。 まず、被験者は必要な背景知識とツールの使い方についての説明を受けます。 つぎに、テスト対象となる2つのBPELプロセスの仕様とテスト仕様について理解します。 最後に、被験者は決められた順番で2つのサンプルBPELプロセスのためのテストケースをそれぞれ異なるツールで作成します。 今回の実験を通して、作成されたテストケースの性質およびよくされる間違いについて考察しました。 第159回 ソフトウェア工学研究発表会 2008/03/18

28 適用実験の概要(2/2) テスト対象プロセス 作業の順番 プロセスA: Loan Approvalプロセス[1]
プロセスB: Meta Searchプロセス[2] 作業の順番 4つのタスクを用意した 被験者にランダムに 割り当てた [1] OASIS WSBPEL Technical Committee, Web Services Business Process Execution Language Version 2.0, April 2007. [2] P. Mayer, Design and Implementation of a Framework for Testing BPEL Compositions, September, 2006. タスク テスト対象 ツール 1 A 従来 B 提案 2 3 4 今回の実験ではつぎの2つのプロセスをテストの対象プロセスとしました。 プロセスAは、BPELの仕様書にサンプルとして記載された規模の小さなプロセスです。 また、プロセスBは、BPELUnitに附属されたサンプルプロセスです。 タスクを4つ用意しました。 これらのタスクは被験者にランダムに割り当てました。 たとえば、タスク1が割り当てられた被験者は、まず従来ツールを利用してテスト対象Aのテストケースを作成してから、提案ツールでテスト対象Bのテストケースを作成します。 第159回 ソフトウェア工学研究発表会 2008/03/18

29 実験結果:性質 検証式の数の比較では、提案手法で作成した方が多い ⇒ XMLデータ構造の表示が有効 ツール別で作成された検証式の数
作成したテストケースに対して、記述した検証式の数を比較してみたところ、全てのテストケースにおいて、同じぐらいの時間で、提案手法で作成した検証式の方が多いことがわかりました。 これは、XMLデータ構造をツリーとして開発者に表示したためだと思います。 第159回 ソフトウェア工学研究発表会 2008/03/18

30 実験結果:間違いの種類 BPELUnit TestSuite Editor BPEL Data Dependency Editor
XML namespace関連 wsdl:p:element 必要なnamespaceの入れ忘れ 不必要なnamespaceの記述 無し XPath関連 途中要素の書き忘れ e.g. /a/b/c → /a/c スペルミス 構文上の間違い データ関連 サービスAがサービスBのデータを送信 必要なデータ依存の欠如 また、作成したテストケースから犯しやすい間違いを整理してみました。 その結果、BPELUnit TestSuite Editor では、XML namespaceやXPath 関連の間違い、そして送信データ関連の間違いが多かったです。 一方、提案手法では、それらの間違いはほぼ存在しません。 その代わりに、手法について十分に理解していないため生じた間違いが目立ちます。 この結果から、提案手法を十分に理解するために少し時間がかかるかもしれませんが、実装をさらに改良すれば従来ツールの問題を解決できることが十分期待できます。 第159回 ソフトウェア工学研究発表会 2008/03/18

31 まとめと今後の課題 まとめ BPELプロセスの単体テストを支援するために、テストケースを作成する手法およびプラットフォーム独立なテスト実行履歴記録手法を提案及び実装した テストケース作成手法に対する評価実験では、送受信データの間違いが従来ツールより減少 今後の課題 手法とユーザインターフェイスの改良 テスト実行履歴表示の改良 BPEL開発者での評価実験 最後に、まとめます。 本研究では、BPELプロセスの単体テストを支援するために、テストケースを作成する手法およびプラットフォーム独立なテスト実行履歴記録手法を提案及び実装しました。 また、テストケース作成手法の有効性を評価するために適用実験を行い、データの作成間違いが防げることを確認しました。 今後の課題として、実験結果に基づき手法とツールのGUIを改良することと、テスト実行履歴表示の改良およびBPEL熟練者での適用実験を行うことが考えられます。 ありがとうございました。 第159回 ソフトウェア工学研究発表会 2008/03/18

32 おわり ありがとうございました

33 いろいろな例

34 ウェブサービスを利用した開発例 サービス提供者 サービス利用者 ウェブサービスを実装する
ウェブサービスのインターフェイスを 記述する形式仕様記述を作成する ウェブサービスをサーバーに配置し、 形式仕様記述も公開する 公開されたインターフェイス 形式仕様記述を取得する 取得した形式仕様記述に したがってウェブサービス を利用するソフトウェアを 開発する サーバーから 形式仕様記述を取得する それでは、実際にウェブサービスを用いた開発例をみてみましょう。 ウェブサービスの提供者とサービスの利用者という二つの観点から考えます。 まず、ウェブサービスの提供者は、提供したい機能を実装します。 次に、ウェブサービスのインターフェイスを記述する形式仕様記述を作成します。 最後に、実装したシステムをサーバー上に配置し、その形式仕様記述を合わせて公開します。 サービスの利用者は、公開されたインターフェイスの形式仕様記述を取得し、 それに合わせてウェブサービスを利用するソフトウェアを開発します。 お分かりと思いますが、ウェブサービスのインターフェイス形式仕様記述は、 サービスの利用方法を記述しているユーザマニュアルのようなものです。 後ほどまた詳しく説明します。 ウェブサービスと形式仕様記述 をサーバーに配置する 作成したソフトウェアが ウェブサービスを利用する ウェブの検索 図書の注文など 第159回 ソフトウェア工学研究発表会 2008/03/18

35 WSDL WSDL文書 <description> <types> …</types>
<message>…</message> <portType>…</portType> <binding>…</binding> <service>…</service> </description> 抽象化定義部 ウェブサービスのオペレーションと 各オペレーションが受け取るメッセージの型を記述 具現化定義部 ウェブサービスはどこで、どのように提供されて いるかを記述 第159回 ソフトウェア工学研究発表会 2008/03/18

36 types、message、portTypeの例
<schema> <complexType name="User"> <sequence> <element name="fullname" type="xsd:string"/> <element name="id" type="xsd:string"/> <element name="username" type="xsd:string"/> </sequence> </complexType>  </schema> </types> <message name="getUserResponse"> <part name="getUserReturn" type="User"/> </message> <message name="getUserRequest"> <part name="userId" type="string"/> <portType name="UserManager"> <operation name="getUser"> <input message="getUserRequest" name="getUserRequest"/> <output message="getUserResponse" name="getUserResponse"/> </operation> </portType> 第159回 ソフトウェア工学研究発表会 2008/03/18

37 XML Schema データ型の種類 データ型の派生 単純データ型 複合データ型 既存のデータ型(基底型)から新しいデータ型(派生型)を定義
子要素や属性のないデータ型 Integer、stringなど一般に用いられる型は定義済み(組込単純データ型) 複合データ型 子要素や属性を持つことのできるデータ型 単純型の組み合わせで定義 データ型の派生 既存のデータ型(基底型)から新しいデータ型(派生型)を定義 <xs:simpleType name=“resultType”> <xs:restriction base=“xs:integer”> <xs:minInclusive value=“0”/> <xs:maxInclusive value=“100”/> </xs:restriction> </xs:simpleType> <xs:simpleType name=“isbnType”> <xs:restriction base=“xs:string”> <xs:length value=“10”/> </xs:restriction> </xs:simpleType> 制限 長さが10文字の文字列型 値が0から100までの整数型 第159回 ソフトウェア工学研究発表会 2008/03/18

38 テストデータの例 省略したAmazonの返信 (フォントサイズ=1) テスト対象の最終出力のための 検証式一覧(フォントサイズ=1)
<ItemSearchResponse xmlns=" <HTTPHeaders> <Header Name="UserAgent" Value="Jakarta Commons-HttpClient/3.0-rc3"/> <OperationRequest> </Arguments> </OperationRequest> <RequestProcessingTime> </RequestProcessingTime> <Argument Name="Service" Value="AWSECommerceService"/> <Arguments> </HTTPHeaders> <RequestId>1T4G2908CWNSQ9HHPRY3</RequestId> <Request> <Items> <ResponseGroup>Images</ResponseGroup> <SearchIndex>Books</SearchIndex> <Title>penang</Title> <ResponseGroup>ItemAttributes</ResponseGroup> <ResponseGroup>OfferSummary</ResponseGroup> <IsValid>True</IsValid> <ItemSearchRequest> <ASIN> </ASIN> <SmallImage> <DetailPageURL> <Item> <TotalPages>17</TotalPages> </ItemSearchRequest> </Request> <TotalResults>167</TotalResults> <Height Units="pixels">75</Height> <URL> <Width Units="pixels">89</Width> </MediumImage> <LargeImage> <Height Units="pixels">160</Height> <URL> </SmallImage> <Width Units="pixels">42</Width> <MediumImage> <URL> <SwatchImage> <ImageSet Category="primary"> <URL> <ImageSets> <Height Units="pixels">500</Height> <Width Units="pixels">277</Width> </LargeImage> </SwatchImage> <Width Units="pixels">17</Width> <Height Units="pixels">30</Height> <ThumbnailImage> <Height Units="pixels">110</Height> <Width Units="pixels">61</Width> <TinyImage> <URL> </ThumbnailImage> </TinyImage> </ImageSet> <Label>APA Publications Pte Ltd,Singapore</Label> <ListPrice> <Amount>1684</Amount> <ISBN> </ISBN> <EAN> </EAN> </ImageSets> <ItemAttributes> <Binding>Paperback</Binding> <FormattedPrice>$16.84</FormattedPrice> <CurrencyCode>USD</CurrencyCode> <Height Units="hundredths-inches">16</Height> <Length Units="hundredths-inches">409</Length> <Weight Units="hundredths-pounds">49</Weight> <PackageDimensions> <NumberOfPages>104</NumberOfPages> </ListPrice> <Manufacturer>APA Publications Pte Ltd,Singapore</Manufacturer> </PackageDimensions> <Width Units="hundredths-inches">157</Width> <Title>Penang and Langkawi Insight Pocket Guide</Title> </ItemAttributes> <Studio>APA Publications Pte Ltd,Singapore</Studio> <Publisher>APA Publications Pte Ltd,Singapore</Publisher> <ProductGroup>Book</ProductGroup> <ProductTypeName>ABIS_BOOK</ProductTypeName> <PublicationDate> </PublicationDate> <Amount>1024</Amount> <OfferSummary> <LowestNewPrice> <FormattedPrice>$12.48</FormattedPrice> <Amount>1248</Amount> <LowestUsedPrice> <FormattedPrice>$10.24</FormattedPrice> </LowestNewPrice> <TotalUsed>1</TotalUsed> <TotalNew>8</TotalNew> </LowestUsedPrice> <DetailPageURL> <ASIN> </ASIN> </Item> <TotalCollectible>0</TotalCollectible> <TotalRefurbished>0</TotalRefurbished> </OfferSummary> <URL> <Width Units="pixels">50</Width> <URL> <Width Units="pixels">333</Width> <URL> <Width Units="pixels">107</Width> <Width Units="pixels">20</Width> <URL> <URL> <Width Units="pixels">74</Width> <Brand>Nordic Institute of Asian Studies</Brand> <Author>Nordin Hussin</Author> <Amount>6700</Amount> <ISBN> </ISBN> <Label>Nordic Institute of Asian Studies</Label> <DeweyDecimalNumber> </DeweyDecimalNumber> <EAN> </EAN> <NumberOfPages>384</NumberOfPages> <NumberOfItems>1</NumberOfItems> <Manufacturer>Nordic Institute of Asian Studies</Manufacturer> <FormattedPrice>$67.00</FormattedPrice> <Weight Units="hundredths-pounds">141</Weight> <PublicationDate> </PublicationDate> <Width Units="hundredths-inches">606</Width> <Length Units="hundredths-inches">898</Length> <Height Units="hundredths-inches">110</Height> <Title>Trade And Society In The Straits Of Melaka: Dutch Melaka And English Penang, (Nordic Institute of Asian Studies Momograph Series)</Title> <Studio>Nordic Institute of Asian Studies</Studio> <Publisher>Nordic Institute of Asian Studies</Publisher> <FormattedPrice>$61.69</FormattedPrice> <Amount>6169</Amount> <TotalUsed>3</TotalUsed> <TotalNew>9</TotalNew> <DetailPageURL> <ASIN> </ASIN> <URL> <Width Units="pixels">49</Width> <URL> <Width Units="pixels">324</Width> <URL> <Width Units="pixels">104</Width> <URL> <tes:condition> <tes:expression>./put:response/put:bookResults/put:bookResult[1]/put:title</tes:expression> <tes:value>'M&apos;rgg-qgNpWqVl(*p\zp^;b=8&N3f]L0J).RX'</tes:value> </tes:condition> <tes:value>'2'</tes:value> <tes:expression>count(./put:response/put:bookResults/put:bookResult)</tes:expression> <tes:expression>./put:response/put:bookResults/put:bookResult[1]/put:author</tes:expression> <tes:value>'~8\#2'</tes:value> <tes:expression>./put:response/put:bookResults/put:bookResult[1]/put:price</tes:expression> <tes:value>'Mr$W%V3JSEvK2Ya&apos;JgN8CW~nT&apos;To!V8ejEMC*A`zNC`:Ev+&apos;'</tes:value> <tes:value>'<z46j+gy$Up;4[;ax8?eR.0}u1?iaPY>~OPLTc8]6#TI|:l9(5b)4>dr+;-t`7Y41'</tes:value> <tes:expression>./put:response/put:bookResults/put:bookResult[1]/put:isbn</tes:expression> <tes:expression>./put:response/put:bookResults/put:bookResult[2]/put:title</tes:expression> <tes:expression>./put:response/put:bookResults/put:bookResult[1]/put:imgUrl</tes:expression> <tes:expression>./put:response/put:bookResults/put:bookResult[2]/put:author</tes:expression> <tes:value>':PzfO<X?=^!Rkem``%i8&x`^f/&Nf&h~"ME>4\+Vlsw tA5v^w}mu&Lfv3zNQPwD[ODZ$vk~AV}s*W\JA+Pk'</tes:value> <tes:expression>./put:response/put:bookResults/put:bookResult[2]/put:isbn</tes:expression> <tes:value>'rM[VBM""A6F*Y2"Znl83}[J&3:wW=&k*"G"(-k8KCil6r'</tes:value> <tes:expression>./put:response/put:bookResults/put:bookResult[2]/put:price</tes:expression> <tes:value>'t!bT.ez^I#Rk(u <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:agentName</tes:expression> <tes:value>'6"1jD2> SH"i^P3{>wbh&\C&apos;BSKZci\4l(E9[m|^8?TK`lqK0yyD_Yk:]y'</tes:value> <tes:expression>./put:response/put:bookResults/put:bookResult[2]/put:imgUrl</tes:expression> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:packageName</tes:expression> <tes:value>'H7rTXfqQ9rV.?;|GN?zhQZd_\sGHQkiop|ltAIAI*=M^G~aJA!qzT(zz i/BJpPg<UIzV9UD]AG4z7J['</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:startDate</tes:expression> <tes:value>'<K?FwyE<e4i1y$u<#e+Ib1/2T'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:destination</tes:expression> <tes:value>'NP|cwAU-+#)b).ccFVF*Z}*({V,mo>_Rzy"?f* %gYztyH,mE.fOwBgsX|-_p9Te9Y|XKXZJ%=y}}aaNs2qzqUUxrA!'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:endDate</tes:expression> <tes:value>' :00'</tes:value> <tes:value>' '</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:details</tes:expression> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:price</tes:expression> <tes:value>' :00'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[1]/put:imgUrl</tes:expression> <tes:value>' <tes:value>'s{[K##[_bXNX|7[x,pu]W-&apos;=21X(,"qS,g3SQ=:b_eJU'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:agentName</tes:expression> <tes:value>' <tes:value>'`?"P{!_ID;T<QAjsm`[IZ)c?[$]&ZoU;'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:packageName</tes:expression> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:startDate</tes:expression> <tes:value>'R\~_w*nIFv>~< Q`O]e^rq{bc6aDF3Li'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:destination</tes:expression> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:endDate</tes:expression> <tes:value>' Z'</tes:value> <tes:value>' '</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:price</tes:expression> <tes:value>' :00'</tes:value> <tes:value>' =;kGex}tJ'</tes:value> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:details</tes:expression> <tes:value>'JN <tes:expression>./put:response/put:infoResults/put:infoResult[1]/put:location</tes:expression> <tes:expression>./put:response/put:tourResults/put:tourResult[2]/put:imgUrl</tes:expression> <tes:expression>./put:response/put:infoResults/put:infoResult[1]/put:lowTemperature</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[1]/put:highTemperature</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[1]/put:currencyExchangeRate</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[2]/put:location</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[2]/put:lowTemperature</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[2]/put:highTemperature</tes:expression> <tes:expression>./put:response/put:infoResults/put:infoResult[2]/put:currencyExchangeRate</tes:expression> <tes:value>'KyF,(Lkp)$8V`6IZ2mKZ3r(HP v< ,J_&apos;\1je!FQrP<x?~n}mx!'</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[3]/put:location</tes:expression> <tes:value>' '</tes:value> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[3]/put:highTemperature</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[3]/put:currencyExchangeRate</tes:expression> <tes:value>' '</tes:value> <tes:expression>./put:response/put:infoResults/put:infoResult[3]/put:lowTemperature</tes:expression> <tes:expression>count(./put:response/put:tourResults/put:tourResult)</tes:expression> <tes:value>'3'</tes:value> <tes:expression>count(./put:response/put:infoResults/put:infoResult)</tes:expression> しかし、一般的に、サービスが送受信するXMLデータの構造が複雑なため、一貫性を持つテストデータを手作業で作成することが困難です。 第159回 ソフトウェア工学研究発表会 2008/03/18

39 仕様記述(BPDD) BPELUnitテストケースにコピー <bpelDataDependencies>
<name>test_dep3</name> <baseURL> <deployment> <put name="BpelTravelService" type="fixed"> <property name="BPRFile">bpr/BpelTravelService.bpr</property> <wsdl>../wsdl/BpelTravelService.wsdl</wsdl> </put> <partner name="AWSECommerceService“ wsdl="../wsdl/AWSECommerceService.wsdl"/> </deployment> <operationSets/> ← ここがオリジナルな部分 </bpelDataDependencies> 第159回 ソフトウェア工学研究発表会 2008/03/18

40 Operationセット(1/2) <operations>
<operation id="1" partner="client" service="put:BpelTravelService“ port="BpelTravelServicePort" operation="request"/> <operation id="2" partner="AWSECommerceService“ service="ns:AWSECommerceService“ port="AWSECommerceServicePort" operation="ItemSearch"/> </operations> <messages> <message id="1" operationId="1" messageType="input"/> <message id="2" operationId="1" messageType="output"/> <message id="3" operationId="2" messageType="input"/> <message id="4" operationId="2" messageType="output"/> </messages> <dependencies/> 第159回 ソフトウェア工学研究発表会 2008/03/18

41 Operationセット(2/2) <complexType name="dependencyType">
<sequence> <element name="target" type="string" minOccurs="0" /> <choice> <element name="dependsOn" type="string" /> <element name="fixedValue" type="string" /> </choice> </sequence> <attribute name="targetMsgId" type="int" /> <attribute name="targetOpId" type="int" /> <attribute name=“type” type=“tns:dependencyTypeType” /> <attribute name="dependsOnMsgId"> <simpleType><list itemType="int" /></simpleType> </attribute> <attribute name="iteration" type="int" /> </complexType>   ・substitution ←・multiplicity   ・verification 第159回 ソフトウェア工学研究発表会 2008/03/18

42 依存指定の例 <dependency targetMsgId="4" type="multiplicity">
要素の多重度を固定値で指定 <dependency targetMsgId="4" type="multiplicity"> <target>./ns:ItemSearchResponse/ns:Items/ns:Item</target> <fixedValue>2</fixedValue> </dependency> <dependency targetMsgId="3" dependsOnMsgId="1" type="substitution"> <target>./ns:ItemSearch/ns:Request/ns:Title</target> <dependsOn>/container/put:query/put:destination</dependsOn> 要素の値をXPath表現で指定 第159回 ソフトウェア工学研究発表会 2008/03/18

43 依存指定の例 Operationの多重度を固定値で指定 <dependency targetOpId="3" dependsOnMsgId="8" type="multiplicity"> <dependsOn> count(/container/wsdl1:response/wsdl1:searchResult) </dependsOn> </dependency> <dependency targetMsgId="5" dependsOnMsgId="8“ type="substitution" iteration="2"> <target>./wsdl:query/wsdl:toCurrency</target> /container/wsdl1:response/wsdl1:searchResult[2]/wsdl1:currency iteration でループ内の特定の呼び出しに対して依存を指定する 第159回 ソフトウェア工学研究発表会 2008/03/18

44 データ依存の記述例 GeoInfoの入力がBPELの入力に依存 CurrencyExchangeの入力がGeoInfoの出力に依存
<dependency targetMsgId=“3” dependsOnMsgId=“1” type=“substitution”> <target>./request/search</target> <dependsOn>./query/keyword</dependsOn> </dependency> CurrencyExchangeの入力がGeoInfoの出力に依存 <dependency targetMsgId=“5” dependsOnMsgId=“4” type=“substitution” iteration=“1”> <target>./query/to</target> <dependsOn>./response/result[2]</dependsOn> </dependency> CurrencyExchangeの呼出回数がGeoInfoの出力に依存 作成されたデータ依存はXML文書として記録されます。 たとえば、先ほど挙げた例で、GeoInfoサービスの入力がBPELの入力への依存を記述する際、依存元の内部ID、依存先の内部ID、依存の種類、依存元へたどるXPath式、依存先にたどるXPath式はこのように記録されます。 また、何回も呼び出されるoperationについて、このiterationパラメータで何回目の呼出に今記述しているデータ依存が有効なのかを指定することもできます。 Operation の呼出回数を指定する際は、operationの内部IDを利用してこのように記録されます。 <dependency targetOpId=“3” dependsOnMsgId=“4” type=“multiplicity”> <dependsOn>count(./response/result)</dependsOn> </dependency> 第159回 ソフトウェア工学研究発表会 2008/03/18

45 実験結果

46 実験結果:時間 個人差はあるものの、どちらのツールを使ってもほぼ同じ時間がかかる   ⇒ 提案手法では作業を一回行えば次から異なるデータ      を生成できるため、提案手法は優れている テストケースの作成にかかる時間ですが、個人差はあるものの、どちらのツールを使ってもほぼ同じ時間がかかることがわかりました。 ただし、提案手法では、作業を一回行えばあとから異なるデータを生成できるため、提案手法が優れていると考えられます。 第159回 ソフトウェア工学研究発表会 2008/03/18

47 第159回 ソフトウェア工学研究発表会 2008/03/18

48 第159回 ソフトウェア工学研究発表会 2008/03/18


Download ppt "Data Dependency based Test Case Generation for BPEL Unit Testing"

Similar presentations


Ads by Google