Webサービス相互運用性 (2)

Webサービスの互換性を検証するテストツール

Webサービスの相互運用性を向上させる目的で設立された「WS-I」から、2003年8月にBasic Profile 1.0が公開された。さらに相互運用ガイドラインへの適合性を検証するテストツールがWS-Iから提供されている。このテストツールの開発(国際化)に参加した筆者により基本的な使用方法を解説する。(編集局)


株式会社ビーコンIT
岩本 幸男
2003/9/20


 

WS-Iテストツールの背景


WS-IのBasic Profile 1.0、interoperability guidelineに適合した製品に与えられるWS-Iロゴ

 Webサービスのブームは高まる一方だが、ユーザーへの普及速度は当初の思惑に反し、かなり緩やかに見える。要因はさまざまだが、やはりユーザーが安心してWebサービスを採用するためには、各メーカーやベンダの提供する製品およびカスタムメイド・アプリケーション間での、高い相互運用性(インターオペラビリティ)を確保する必要がある。

 このニーズを受け、2002年2月に米国を拠点とし、Webサービスを推進する主要ベンダによりWS-I(Web Services Interoperability Organization)が設立され、本年8月12日には、Webサービスの相互運用性を保証することを目的とした、Webサービスの仕様の実装範囲や解釈などをより厳密に行うための枠組みとしてBasic Profile 1.0がリリースされた(前回記事「WS-I:Webサービス互換性の実現に向けて」参照)。

 本稿で解説するWS-Iテストツールは、WebサービスがWS-I Basic Profile 1.0のinteroperability guidelineに適合しているかどうかを検査するためのツールと位置付けられて提供されるものである。WS-Iテストツールは、Testing Tools and Materialsワーキンググループによって策定され、成果物としてテストツールと関連するドキュメント類が公開されている。執筆時点(2003年9月)ではWS-IのサイトにBeta Release 3 (v0.96)が公開されており、本稿ではそれを基に解説を行う。まもなくリリース版とともにテストツールのソースも公開される予定である。

 

WS-Iテストツールの概要

 このテストツールは、WebサービスがWS-I Basic Profile 1.0のinteroperability guidelineに適合しているかどうかを検査するツールであるが、検査の対象範囲は、HTTPトランスポート層を流れるメッセージと、そのWebサービスに関連するUDDI登録情報およびWSDL記述に限定される。つまり、サービスの実装形態やプラットフォーム関連ツール自体(例えばアプリケーション・サーバなど)の検査を行うわけではないところに注意が必要である。また、現在のところトランスポート層はHTTPに限定され、またSSLなどのセキュリティ仕様に関してはサポートされていない。

 さて、図1のように、テストツールはモニターツール(Monitor)と解析ツール(Analyzer)の2つの機能により構成されている。

図1 WS-IテストツールはMonitorとAnalyzerから構成される

モニターツール(Monitor)

 通常のリクエスタとWebサービス間は直接メッセージの交換を行うが、Monitorは、図1のようにリクエスタとWebサービスの間にプロキシのように割り込む形態をとる。例えば、平常時にリクエスタとWebサービスがport8080を使用して通信しているのであれば、リクエスタの使用するportを4040などに変更し、Monitorを疑似サービスとしてport4040で起動し本物のWebサービスの代理としてリクエスタと通信させ、一方で本物のWebサービスに対しては、port8080でMonitorがリクエスタの代理として通信を行う。Monitorは、このようにリクエスタとWebサービスの間に入り込むことにより、2者間で交換されるメッセージをインターセプトし、外部ログファイルへと書き出す。一言でいえば、Monitorの機能はリクエスタからWebサービス、そしてWebサービスからリクエスタへのメッセージを収集してログファイルを出力することである。

解析ツール(Analyzer)

 Monitorにより収集されたメッセージログは、次のステップとして、Analyzerにより解析される。Analyzerは、WebサービスがWS-I Basic Profile 1.0のinteroperability guidelineに適合しているかどうかを検査するために、Monitorにより収集されたメッセージログと、Webサービスで利用されたregistration (UDDI登録情報)およびdescription (WSDL記述)をTest Assertion Documentにより評価し、分析結果をレポート(図2)として出力する。このレポートは、かなり詳細な分析結果と、Test Assertion DocumentのもとになったWS-I Basic Profile 1.0への対応も示してくれる。つまりAnalyzerから出力されたレポートを見れば、WS-I Basic Profile 1.0のどの項目に違反したかが瞬時に判断可能であり、開発者にとっては効率よくWS-I Basic Profile 1.0準拠のサービスを構築する手助けになる。

図2 Analyzerによる分析結果のレポート

 なお、これらテストツール(MonitorおよびAnalyzer)はC#版とJava版の両方が提供されている。本稿ではJava版を例に解説を進めるが、C#版でも最終的なレポートは基本的にJava版と同様と考えていただいてよい。

 

WS-Iテストツールのインストール(Java版)

 Java版WS-Iテストツールの稼働に最低限必要な環境は Java2 Runtime Environment release 1.3.1またはそれ以上である。なお本稿は次の環境で実施している。

  • ハードウェア:IBM ThinkPad X31/Pentium M プロセッサ 1.40GHz/512Mbytesメモリ
  • OS:Windows XP Professional
  • Java2 Runtime Environment、Standard Edition 1.4.1_02
  • Apache Tomcat 4.1.24
  • Axis Release 1.0

テストツールのダウンロード

 WS-IのWebサイトのImplementation ToolsページからJava版テストツールをダウンロードする。

  • WSI-Test-Java-0.96-bin.zip (3,490Kbytes)

 Zipファイルを解凍すると以下のようなディレクトリが展開される。

解凍されたテストツールのディレクトリ構成
wsi-test-tools
 README.txt
 LICENSE.txt  (WS-Iライセンス)

wsi-test-tools\common
 docs (User's Guide、MonitorSpecification、AnalyzerSpecification)
 profiles (BasicProfileTestAssertions.xml)
 schemas (すべてのXML schema documents)
 xsl (すべてのXSL files)

wsi-test-tools\java
 releaseNotes.txt (Java release notes)
 bin (batch files and shell scripts)
 lib (wsi-test-tools.jar、prereq Jar files)
 licenses (licenses for prereq Jar files(Apache、etc.))
 samples (Java specific samples(log.xml、report.xml))

実行環境の設定

 \wsi-test-tools\java\binにある、setenv.batを実行環境に合わせて修正する。

 

Monitorの実行

Monitor 起動バッチファイル設定

 \wsi-test-tools\java\binにある、Monitor.batを実行環境に合わせて修正する。

Monitor Configurationファイルの設定

  \wsi-test-tools\java\samplesにある、monitorConfig.xmlを実行環境に合わせて修正する。

 下記の設定は、リクエスタからのport4040のリクエストをMonitorがインターセプトし、ローカルマシン上のport8080で起動しているWebサービスへリダイレクトすることを示している。

[monitorConfig.xmlの設定例]

<wsi-monConfig:redirect>
    <wsi-monConfig:comment>redirect local App on port8080.</wsi-monConfig:comment>
 <wsi-monConfig:listenPort>4040</wsi-monConfig:listenPort>
 <wsi-monConfig:schemeAndHostPort>http://localhost:8080</wsi-monConfig:schemeAndHostPort>
 <wsi-monConfig:maxConnections>1000</wsi-monConfig:maxConnections>
 <wsi-monConfig:readTimeoutSeconds>15</wsi-monConfig:readTimeoutSeconds>
</wsi-monConfig:redirect>

 さて、環境設定がひととおり完了したら、早速試してみる。すでにWebサービスとリクエスタがあるのであれば、リクエスタに設定されるWebサービスのport番号をmonitorConfig.xmlで設定したport番号へ変更するだけでよい。

 適当なWebサービスがなければ、下記のような簡単なWebサービスとリクエスタを用意する必要がある。本稿で使用するWebサービスとリクエスタは下記のとおり。

[Webサービスのサンプル]

public class HelloService {
    public String getMessage_ja( String name ) {
        String echo = "名無し";
        if( name != null ) echo = name ;
        return "こんにちは " + echo + "さん ";
    }
}

[リクエスタのサンプル]

import java.util.*;
import java.net.*;
public class TestClient {
  public static void main( String [] args ) throws Exception {
    localhost.HelloWORDLocator locator =
      new localhost.HelloWORDLocator();
    URL url =
      new URL("http://localhost:4040/WS-I/services/HelloWORD");
    if( args.length > 1 ) url = new URL( args[1] );
    localhost.HelloService service = locator.getHelloWORD( url );
    String requestMessage = "岩本";
    if( args.length > 0 ) requestMessage = args[0];
    String resultMessage =  service.getMessage_Ja( requestMessage );
    System.out.println( resultMessage ) ;
  }
}

WSDL記述
 WSDLはAxisで提供されるJava2WSDLコマンドを使用して生成した。

UDDI登録情報
 本稿では、UDDIは使用していない。User's Guideを参考に各自トライしていただきたい。

ログの採取を開始

 準備が完了したら、次の手順でリクエスタとWebサービス間のログを採取する。

Step1
 Webサービスを開始する。

Step2
 Monitorを起動する。Monitorは起動後、バージョン・メッセージに続いてConfiguration情報を表示し、待機状態になる(図3)。

図3 Monitor起動

Step3
 リクエスタを実行する。

Step4
 リクエスタ終了後、Monitorコンソールから“exit”コマンドを入力し、Monitorを停止する。Monitorを停止しない場合、ログファイルが正しくクローズされないので、Analyzerによる分析を行う前には必ず停止しなければならない。

Step5
 Monitorログの確認を行う。ログファイルはlog.xmlの名称で格納される。WS-I Testing Tools Log Fileは図4のとおり「Monitor Tool Information」と「Log Entries」の2つのセクションから構成される。

図4 Monitorによるログファイル(log.xml)

 Monitor Tool Informationセクションには、Monitorツールのバージョン情報のほか、稼働プラットフォーム環境およびMonitor設定情報が出力される。

 Log Entriesセクションには、インターセプトされたメッセージの一覧に続き、それぞれのメッセージについて、HTTPヘッダ情報および実際のSOAPメッセージが順に出力される。なお、本稿で使用したWebサービスはrequest/response型のMessage Typeのため、Entry:1のMessage Typeはrequest、Entry:2のMessage Typeはresponseとなる。

Entry:1(request)

[HTTP Headers:]

POST /WS-I/services/HelloWORD HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.0
Host: localhost:4040
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 479

[Message Content:]


<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:getMessage_ja soapenv:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://localhost:8080/WS-I/services/HelloWORD">
   <in0 xsi:type="xsd:string">岩本</in0>
  </ns1:getMessage_ja>
 </soapenv:Body>
</soapenv:Envelope>

Entry:2(response)

[HTTP Headers:]

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Date: Thu, 04 Sep 2003 12:43:22 GMT
Server: Apache Coyote/1.0
Connection: close

[Message Content:]


<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:getMessage_jaResponse soapenv:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns1="http://localhost:8080/WS-I/services/HelloWORD">
   <getMessage_jaReturn xsi:type="xsd:string">こんにちは 岩本さん </getMessage_jaReturn>
  </ns1:getMessage_jaResponse>
 </soapenv:Body>
</soapenv:Envelope>

 次ページでは、いよいよAnalyzerを実行して、問題個所の発見と原因究明の手順を紹介する。

  1/2

Index
Webサービスの互換性を検証するテストツール(1/2)
 ・WS-Iテストツールの背景
 ・WS-Iテストツールの概要
 ・WS-Iテストツールのインストール(Java版)
 ・Monitorの実行
  Webサービスの互換性を検証するテストツール(2/2)
 ・Analyzerの実行
 ・テストツールの位置付けと意義


「Webサービス相互運用性」 バックナンバー

  1. WS-I:Webサービス互換性の実現に向けて
  2. Webサービスの互換性を検証するWS-Iテストルーツ



XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間