通信処理のテストをテストケースで!
SOAPのサーバ/クライアントとして動作するSoapUIというツールがあるのですが、これをJUnitのテストケースから使って、SOAPサーバをモックしたテストを書くことができます。
SOAPのテストツールだと、JMeterが有名のようですが、JMeterはSOAP1.1に対応していないため、 そちらを利用する際は気を付けてください。
SoapUIインストール時の注意
SoapUIのAPIを叩く場合、資料が不十分なのでソースを見るのが手っ取り早かったです。
インストール時、以下のダイアログで、「Source」のチェックを入れておくと、SoupUIのソースファイルも一緒にインストールされるので、チェックしておきましょう。
JUnit with SoapUI
JUnitでSoapUIを使うためには、SoapUIのインストールディレクトリ中に含まれるライブラリが必要です。
以下にあるjarを、プロジェクトのパスに通しておいてください。
- <SoapUIインストール先ルート>\bin
- soapui-5.1.3.jar
- <インストール先ルート>\lib
- lib配下のjar全て
インストール後は以下を参考に、疑似SOAPサーバを作りましょう。
作ったら、作ったサーバのプロジェクトを保存し(XMLファイル)、GUIでの作業は終了です。
テストケース上で、疑似SOAPサーバの起動と停止
関連するところだけざっくり書きますが、以下のように書くと、先ほど作った疑似サーバを プログラム上から起動・停止することができます。
正直手順がよくわからなかったので、以下はSoapUIのコード読んだ末に「やったら動いた」系のコードです。
// 必要なSoapUI関連のimport文 import com.eviware.soapui.impl.wsdl.WsdlProject; import com.eviware.soapui.impl.wsdl.mock.WsdlMockService; public class SoapSendServiceTest { @Test public void SOAP送信のテスト() { // ------------ Mockサーバ設定 ------------ // 1.まず作成したサーバプロジェクトのパスを取得します String wsdlPath = SoapSendService.class.getResource("send/some-soapui-project.xml").toString(); // 2.次にサーバプロジェクトのインスタンスを作成し、 // 作成していたプロジェクト中の疑似サーバ名(ここではMockService 1)を指定します WsdlProject project = new WsdlProject(wsdlPath); WsdlMockService mockService = project.getMockServiceByName("MockService 1"); mockService.start(); // Mockサーバ起動 try { // TODO:SOAP電文を投げる処理などをここで実行 } finally { mockService.release(); // Mockサーバ停止 } } }
コードを書くとこれっぽっちです。 それもこれも読み込むWsdlProjectのファイルを、あらかじめGUIのSoapUIで作成しておけるからです。
WSDL、XSDとの紐付け、ダミーのエンドポイント設定、応答電文の定義、必要であればタイムアウトの設定も行ってから、作成したプロジェクトをExportして、テストで読み込むXMLを作成します。
注意として、GUI側を起動したままにしておくと、テスト実行時にエンドポイントが既に存在している旨のBindExceptionが発生します。GUIを終了させるか、Mockサーバのポート番号を別にするなどして対処してください。
SOAPじゃなくても使えます
また、SoapUIという名前ですが、RESTサーバとしても振る舞えます。SOAPの場合と同様に、GUI画面でMockServiceのプロジェクトを作り、プロジェクトを保存して、Testケースから読み取りましょう。
CI環境で実行する際の注意
まだ自分でも解決していないのですが、SoapUIのプロジェクトを保存したXMLには、 参照先のWSDLが、GUI操作端末の絶対パスで記載されます。
そのため、Jenkins上などでそのままテストケースを実行すると、WSDLなどのファイル参照でエラーになります。
とりあえず対処するのであれば、CI環境用の疑似サーバプロジェクトのXMLも用意するとかですかね。 うまいやり方をご存じの方がいらっしゃれば、是非教えてください。
あとがき
SoapUIはちょっと名前のせいで損してる感がありますが、SOAP以外の通信にも使える便利なツールだと思います。 RESTの場合はあまりクライアントの用意で困ることはないと思いますが(叩けばいいので)、手軽にJSONをPUTしたり、RESTサーバをサクっと上げれたりするのは、結構便利です。
RESTサーバであれば、フルスクラッチで疑似作っても大した手間ではないですけど。
その割にSoapUIの情報があまりなかったので、もっと情報が増えるといいなぁと思い、今回の記事を書いてみました。
まあ、JVM上で動作するツールなので、UIが「いかにも」だったり、たまにメモリ食いまくったりしてますけど、そこはご愛嬌ですかね!