このセクションでは、 SOAtest/Virtualize の拡張 (スクリプト) 機能とそのさまざまな使い方について説明します。セクションの内容:
Table of Contents | ||
---|---|---|
|
拡張機能とは
SOAtest/Virtualize の拡張機能を使用すると、カスタム スクリプト (Java、JavaScript、Oracle Nashorn、Groovy、Jython を利用できます) によって任意の機能を実行し、SOAtest での作業に役立てることができます。また、拡張機能はJSR 223 「Scripting for the Java Platform」仕様をサポートする他のスクリプト エンジンもサポートします。そのため、アプリケーション固有の言語を習得することなく、ユーザー固有のニーズに合わせて SOAtest/Virtualize をカスタマイズできます。
SOAtest を使用している場合、スクリプトを使用して、RuleWizard で作成するルールをカスタマイズすることもできます。詳細については、『RuleWizard ユーザーズガイド』を参照してください。
スクリプトを使用するための環境設定
Jython スクリプトを使用している場合は、[設定] パネルの [スクリプト] タブで Jython パス変数を指定できます。この変数を設定しなくても、Jython スクリプト サポートを使用できます。Jython パスは、Jython にまだ含まれていない Python モジュールを検索するためのディレクトリのリストを指定します。複数のディレクトリ パスは、OS の既定のパス セパレーター (Windows の場合は「;」、Linux および macOS の場合は「:」) を使用して区切ります。Jython パスを設定した場合、変更を有効にするために SOAtest または Virtualize を再起動する必要があります。
スクリプト機能で Java を使用し、変更された Java ファイルを SOAtest で再コンパイルするには、「SOAtest での Eclipse Java プロジェクトの使用」を参照して環境設定方法の詳細を確認してください。
スクリプト機能で Java を使用し、変更された Java ファイルを Virtualize で再コンパイルするには、「Virtualize での Eclipse Java プロジェクトの使用」を参照して環境設定方法の詳細を確認してください。
Anchor | ||||
---|---|---|---|---|
|
SOAtest GUI のスクリプトのオプション画面でスクリプトを定義するには、次の操作を行います。
- Eclipse ワークスペース内の Java プロジェクトに Java クラスがある場合は、Java プロジェクトをクラスパスに追加します。
- [言語] ドロップダウンリストでスクリプトの言語を指定します。
- 大きなテキストフィールドに実装するスクリプトを定義します。
- Java メソッドの場合、[クラス] フィールドに適切なクラスを指定します。選択したクラスはクラスパスに追加されている必要があります。[クラスパスの変更] リンクをクリックし、表示される設定画面で追加できます。Java ファイルの修正やコンパイルの後にクラスをリロードする場合は、 [クラスのリロード] をクリックします。
- その他のスクリプトの場合は、既存のファイルをメソッドのソース コードとして使用するか、SOAtest または Virtualize 内でメソッドを作成できます。
- 既存のファイルを使用するには、[ファイル] を選択し、[参照] をクリックします。ファイル選択ダイアログでファイルを選択して [OK] をクリックし、選択を確定します。
- SOAtest/Virtualize 内で新しくメソッドを作成するには、[テキスト] を選択し、入力やカット&ペーストを行ってテキスト ウィンドウにコードを入力します。
- スクリプトが正しく実行可能であるかどうかを確認するには、スクリプトの指定方法に応じて [ファイル] または [テキスト] フィールドを右クリックし、[評価] をクリックします。問題が見つかればレポートされます。
スクリプト テンプレートの使用
Jython または JavaScript でスクリプトを作成する場合、SOAtest または Virtualize 設定パネルのスクリプトのテンプレート フィールド (スクリプト ページ内) にスクリプトのテンプレートを指定できます。このフィールドに入力されたコードは、フィールドに対応する言語のインライン スクリプトのデフォルト コードとして使用されます。スクリプトのテンプレートは、デフォルト入力や共通グローバル変数の設定などに特に便利です。
スクリプト テンプレートは、Extension ツール、SOAP サービス、スクリプト SOAP 入力で使用されるスクリプトに適用されます。
SOAtest および Virtualize との連携
スクリプトと SOAtest または Virtualize を連携させる必要がある場合、SOAtest または Virtualize の拡張 API を使用します。たとえば SOAtest/Virtualize 拡張 API を使用すると、スクリプトの結果を SOAtest/Virtualize のメッセージ ウィンドウに送信したり、特定の SOAtest/Virtualize に特定の値を渡したりできます。
拡張 フレームワーク API のドキュメントについては、[ヘルプ] > [ヘルプ目次] または [Parasoft] > [ヘルプ] をクリックし、『Parasoft SOAtest Extensibility API』または『Parasoft Virtualize Extensibility API』ブックを参照してください。
必要な JAR ファイルに接続
拡張 API を使用する Java コードを作成していて、SOAtest/Virtualize の環境内でコードをコンパイルしたい場合、Java Project ウィザードを使用します。ウィザードは、 拡張 API にアクセス可能な新規 Java プロジェクトを作成します。詳細については、 「SOAtest での Eclipse Java プロジェクトの使用」または「Virtualize での Eclipse Java プロジェクトの使用」を参照してください。SOAtest/Virtualize の環境外でコードをコンパイルしたい場合、次の jar ファイルが必要です。
- com.parasoft.api.jar
- webking.jar (soaptest.api または webking.api パッケージのクラスにアクセスする場合にだけ必要です)
これらの jar ファイルは <INSTALL-DIR>\eclipse\plugins\com.parasoft.ptest.libs.web_<VERSION>\root
ディレクトリにあります。
- XPath を処理する場合、
org.apache.xpath.XPathAPI
も必要です。このクラスは xalan.jar にあります。 - ISO 8583 関連のスクリプト処理の場合、ISOMsg、BaseChannel、ISOChannel、ISOPackager などの org.jpos.iso.* クラスが必要になります。 これらのクラスは jpos.jar にあります。
コンテキスト クラスローダーの設定
Extension ツールは、クラスローダーで実行されます。JNDI などの特定のAPI は、コンテキスト クラスローダーに依存します。コード内で特定の API を呼び出す前にコンテキスト クラスローダーの設定が必要な場合があります。詳細については http://wiki.eclipse.org/Context_Class_Loader_Enhancements#Technical_Solution を参照してください。
スクリプトの変数
SOAtest および Virtualize のスクリプトで変数を宣言して使用できます。
変数の宣言は、var
キーワードで開始し、後ろに等号 =
を続け、その後ろに変数の値を記述します。変数は 1 行に 1 つずつ宣言する必要があります。スクリプトの任意の場所で変数を宣言し、宣言の直後に変数を使用できます。既存の変数に新しい値を代入するには、変数を「再宣言
」します。
変数の参照は次のように行います。${varName}
Jython 構文の色分け
PyDev プラグイン (http://www.pydev.org/) を使用すると、Extension ツールで Jython の構文を色分け表示できます。PyDev プラグインを使用するには、コードの自動補完などの高度な機能のために構成された Jython インタープリターが必要です。詳細はhttp://www.pydev.org/manual_101_interpreter.html を参照してください。
スクリプトからデータソースへのアクセス
スクリプトからデータ ソースを使用するには、ツールの構成パネルの上部でデータ ソースを選択し、[データ ソースの使用] をオンにします。
次の行のように、スクリプトの他のメソッド内でデータ ソースの値を変数 x に格納します。
x = context.getValue("Data Source Name", "Column Name")
スクリプトの詳細については、Extension framework API のマニュアルを参照してください。[ヘルプ] > [ヘルプ目次] または [Parasoft] > [ヘルプ] をクリックし、『Parasoft SOAtest Extensibility API』または『Parasoft Virtualize Extensibility API』ブックを参照してください。
Info | ||
---|---|---|
| ||
たとえば、次の画像のようなテストがあるとします。 テーブル データ ソースの名前は Data Source Name です。図には表されていませんが、次のように構成されています。
スクリプトからこれらのいずれかのデータ ソースを使用するには、Extension ツールの構成パネルの上部でデータ ソースを選択し、[データ ソースの使用] をオンにします。 注意SOAtest 6.1 より前の古いバージョンで作成されたファイルを開くと、Browser Data Bank Tool の列名が自動的に Extracted: xyz (xyz は指定された列名) という形式に変換されることに注意してください。これは、Extracted: xyz を参照する従来のスクリプトをサポートするためです。Browser Data Bank で列名を xyz または abc などに変更できます。 スクリプトの詳細については、Extension framework API のマニュアルを参照してください。[Parasoft] > [ヘルプ] または [ヘルプ] > [ヘルプ目次] をクリックし [Parasoft SOAtest Extensibility API] ブックを開いてください。 |
SOAtest の拡張スクリプトの例
データへの接続、データの処理、データの格納
Extension ツールの典型的な使用方法の 1 つは、データ ソースのデータにアクセスし、データを操作してから直接 XML Data Bank または Writable Data Source に格納するというものです。このサンプル スクリプトでは、getKeywords というメソッドを定義し、その中でデータ ソース「Books」の「keywords」というデータ ソース列にアクセスしています。その後、スクリプトの出力を XML Data Bank に送信できるよう、文字列の XML 表現を返しています。
Extension ツールからデータ ソースにアクセスするには、このほかに構成の設定が必要であることに注意してください。詳細については前のセクションを参照してください。
このサンプルでは、メソッドは入力として 2 つの引数を受け取ります。
- Object input: 前のテスト ケースから渡された入力を表します。たとえば、Extension ツールを SOAP Client ツールの SOAP レスポンスに連結している場合、input Object は SOAP レスポンスの文字列表現になります。
- ExtensionToolContext context: getValue メソッドは、Extension ツールからデータ ソースへのアクセスを提供します。このメソッドや Context インターフェイスが公開する他のメソッドを使用すると、複数のスクリプトや他のツールとの間でデータ ソースの値を共有できます。
Jython 例 1
Code Block |
---|
from soaptest.api import * def getKeywords(input, context): title = context.getValue("Books", "keywords") return SOAPUtil.getXMLFromString([title]) |
Jython 例 2
Code Block def methodName(): # code
Code Block def methodName(input): # code
Code Block def methodName(input, context): # code
上のサンプルでは、input は次のどちらかを参照します。
- Extension ツールが連結されたツールの出力から渡されたデータ。たとえば、SOAP Client ツールのレスポンス SOAP エンベロープなどです。
- Extension ツールの [入力] エリアのデータ。 Extension ツール インターフェイスの下部に表示されています。
ほとんどの場合、input 変数に渡される値はプリミティブな Jython 文字列であると予想できます。
一般的に、context 変数は SOAtest によって動的に決定され、拡張 API の Context クラスのインスタンスです。Extension ツールの場合、context はこの特定のツール(テスト スイート内の他の Extension ツールではなく) の ExtensionToolContext のインスタンスです。
JavaScript の例
Code Block |
---|
var SOAPUtil = Packages.soaptest.api.SOAPUtil function getKeywords(input, context) { title = context.getValue("Books", "keywords") return SOAPUtil.getXMLFromString([title]) } |
Java の例
Code Block |
---|
package examples; import soaptest.api.*; import com.parasoft.api.*; public class Keyword { public Object getKeywords(Object input, ExtensionToolContext context) throws com.parasoft.data.DataSourceException { String[] titles = new String[1]; titles[0] = context.getValue("Books", "keywords"); return SOAPUtil.getXMLFromString(titles); } } |
Note | ||
---|---|---|
| ||
このサンプルのような Java コードは、SOAtest の外部でコンパイルされる必要があります。コンパイラが SOAtest 拡張 API のパッケージにアクセスできるよう、SOAtest の jar ファイル ( |
この Keyword サンプルでは、ソース コードおよびコンパイル済みのクラス ファイルは <INSTALL-DIR>/build/examples
にあります。<INSTALL-DIR>/build
フォルダーは、すでに SOAtest のクラスパスに含まれているため、テスト スイートで Keyword サンプルを使用できます。このフォルダーにユーザー独自の Java クラス ファイルを置いてSOAtest で使用することもできます。<INSTALL-DIR>/build
フォルダーを使用する代わりに、設定の [System Properties] タブでもクラスを追加できます。
ファイルのコンテンツを文字列に読み込む
Jython スクリプトを使用してファイルのコンテンツを文字列に読み込むには、次のメソッドを使用します。
Code Block |
---|
from java.lang import * from java.io import * from soaptest.api import * def getContents(input, context): contents = StringBuffer() reader = BufferedReader(FileReader(File("c:\Documents and Settings\jhendrick\Desktop\test.txt"))) line = String() while line != None: line = reader.readLine() if line != None: contents.append(line) contents.append(System.getProperty("line.separator")) reader.close() return contents.toString() |
カスタム アサーションの定義
次のサンプル Java スクリプトは、Assertor ツールのカスタム アサーションとして使用できます。このスクリプトは、データ ソースから値を取得し、レスポンス値とともに値を出力し、レスポンス値にデータ ソースの値が含まれているかを表すブール値を返します。
Code Block |
---|
package examples; import com.parasoft.api.*; public class Comparison { //Compares a value from a database data source to a value returned in a SOAP response public boolean compareToDatabase(Object input, ScriptingContext context) throws com.parasoft.data.DataSourceException { //Gets values from database data source named "Books" String value = context.getValue("Books", "Book"); //Prints database data source values along with SOAP response values in a message to the console Application.showMessage("Value from database is " + value + ".\nValue from SOAP response is " + input.toString() + "."); //Verifies that the SOAP response value contains the database data source value return input.toString().contains(value); } } |
抽出した値を使用して文字列を操作
次の Jython スクリプトのサンプルは、さまざまなソース (データバンク、テスト スイート変数、環境変数) から値を抽出し、+ 演算子を使用した連結などの文字列操作を行います。
Code Block |
---|
from soaptest.api import * from com.parasoft.api import * # Gets a value from a data bank (line 10) or test suite variable (line 11), # appends an environment variable value to the front of that value, # and returns the modified value. Be sure to comment out line 11 # when using line 10 and vice versa. def getModifiedString(context): #value = context.getValue("Generated Data Source", "columnName") value = context.getValue("testSuiteVariableName") environmentVariableValue = context.getEnvironmentVariableValue("environmentVariableName") modifiedString = environmentVariableValue + value return modifiedString |
このサンプルは比較的特殊なユース ケース向けですが、SOAtest 拡張 API のよく使われるメソッドを使用しています。
ウィンドウまたはフレームのドキュメントに接続
次のサンプルは、Web シナリオで Extension ツールを Browser Playback ツールに連結している場合に使用されることを想定しています。
次のように getDocument がオーバーロードされています。
Code Block |
---|
getDocument(); // gets the document for the main window getDocument(String windowName); // gets the document for the window with the specified window name getDocument(String windowName, String frameName); // gets the document for a frame within a window |
たとえば、次のコードはメイン ウィンドウの「mainPane」というタイトルのフレームのコンテンツを取得します。その後、document を使用して選択されたフレームのタイトル テキストを取得します。
Code Block |
---|
var Application = Packages.com.parasoft.api.Application; var WebBrowserUtil = Packages.webking.api.browser2.WebBrowserUtil; function getFrameDocument(input, context) { var document = input.getDocument("", "mainPane"); var titles = document.getElementsByTagName("title"); var title = titles.item(0); var value = WebBrowserUtil.getTrimmedText(title); Application.showMessage("title: " + value); return value; } |
言語別ヒント
Anchor | ||||
---|---|---|---|---|
|
- スクリプトの [クラス] フィールドに Java クラスを指定する場合、クラスパス上に存在するコンパイル済みクラスを指定する必要があります。[クラスパスの変更] リンクをクリックすると表示される設定ページでクラスパスを指定できます。
- 使用するクラスがパッケージの一部である場合、クラス名のほかに完全なパッケージ名を指定する必要があります (例:
java.lang.String
)。 - SOAtest または Virtualize 内で変更されリコンパイルされたクラスを使用するスクリプトがある場合、メソッドが呼び出されると、SOAtest または Virtualize はクラスをリロードし、最新のクラスを使用してオブジェクトを作成します。次の接頭辞で始まるパッケージのクラスに対しては、この機能は適用され ません。
- sun.
- com.sun.
- org.omg.
- javax.
- sunw.
- java.
- com.parasoft.
- webtool.
- wizard.
- 修正およびリコンパイルされたクラスを手動でリロードするには、[クラスのリロード] をクリックします。
Anchor | ||||
---|---|---|---|---|
|
- レガシーの SOAtest JavaScript エミュレーションは FESI をベースにしています。Oracle Nashorn など他のスクリプトエンジンを使用することを推奨します。詳細については以下を参照してください。
- JavaScript メソッドまたは JavaScript ツールからクラスパス上に存在する Java クラスおよびメソッドを呼び出せます。
たとえば、Nashorn を使用していて、JavaScript から SOAtest 拡張 API の Application.report() を呼び出すには、次のように参照します。
Java.type("com.parasoft.api.Application"): var Application = Java.type("com.parasoft.api.Application") Application.report("Message", "Result Window")
推奨しないレガシーエンジンを使用して、JavaScript から SOAtest 拡張 API の Application.report() を呼び出すには、次のように参照する必要があります。
Packages.com.parasoft.api.Application.report()
また、名前の前にPackages
を付けることで、次のように Application.report と Java クラスがあるパッケージ名を参照することもできます。var Application = Packages.com.parasoft.api.Application Application.report("Message", "Result Window")
- 指定されたスクリプトが有効で実行可能かをチェックするには (またはメソッド エントリを [メソッド] ボックスに追加するには)、スクリプトの指定に使用したオプションに応じて [ファイル] または [テキスト] テキスト フィールドを右クリックし、[評価] をクリックします。
Anchor | ||||
---|---|---|---|---|
|
Jython の書き方や Jython から Java クラスを呼び出す方法などの Jython (Java と統合された Jython の実装) の詳細については、http://www.jython.org を参照してください。
- Jython スクリプトを使用している場合は、[設定] パネルの [スクリプト] タブで Jython パス変数を指定できます。この変数を設定しなくても、Jython スクリプト サポートを使用できます。Jython パスは、Jython にまだ含まれていない Python モジュールを検索するためのディレクトリのリストを指定します。複数のディレクトリ パスは、OS の既定のパス セパレーター (Windows の場合は「;」、Linux および macOS の場合は「:」) を使用して区切ります。Jython パスを設定した場合、変更を有効にするために SOAtest または Virtualize を再起動する必要があります。
- 指定されたスクリプトが有効で実行可能かをチェックするには (またはメソッド エントリを [メソッド] ボックスに追加するには)、スクリプトの指定に使用したオプションに応じて [ファイル] または [テキスト] テキスト フィールドを右クリックし、[評価] をクリックします。
Anchor | ||||
---|---|---|---|---|
|
次のコードは Groovy スクリプトのサンプルです。
Code Block |
---|
import com.parasoft.api.*; boolean customAssertion(Object input, ScriptingContext context) { String value = context.getValue("Books", "title"); Application.showMessage("Value from data source is " + value) Application.showMessage("Value from SOAP response is " + input.toString()) return input.toString().contains(value); } |
Anchor | ||||
---|---|---|---|---|
|
JSR 223 「Scripting for the Java Platform」仕様を実装する任意のスクリプト エンジンを認識するよう SOAtest を構成できます。Oracle Nashorn はデフォルトで利用可能です。その他のエンジンを追加できます。
Anchor | ||||
---|---|---|---|---|
|
Oracle Nashorn ECMAScript エンジンは Java に含まれているため、デフォルトで利用可能です。次のコードは Oracle Nashorn スクリプトのサンプルです。
Code Block |
---|
var Application = Java.type("com.parasoft.api.Application") function customAssertion(input, context) { value = context.getValue("Books", "title"); Application.showMessage("Value from data source is " + value) Application.showMessage("Value from SOAP response is " + input.toString()) return input.toString().contains(value); } |
Mozilla Rhino JavaScript
Mozilla Rhino は、Java ランタイムに含まれるオリジナルの ECMAScript エンジンです。Mozilla Rhino は Oracle Nashorn の前身であり、 Java 8 で Oracle Nashorn に切り替わりました。バージョン 9.10 より前の SOAtest/Virtualize には Java 7 が付属しており、Mozilla Rhino が含まれていました。Mozilla Rhino エンジンを使用する以前のバージョンの SOAtest/Virtualize で保存されたスクリプトは、現在のバージョンでは、Mozilla 互換拡張をロードした新しい Oracle Nashorn で実行されます。この互換拡張は、このような目的のために Nashorn の一部として Oracle が提供しています。互換拡張をロードすることで、以前と同様にスクリプトは機能し続けますが、実行時パフォーマンスは大幅に向上しました。
現在、Mozilla Rhino を使って保存したスクリプトは、[言語] ボックスで JavaScript (Mozilla Rhino compatible) と表示されます。これは、Mozilla 互換拡張がある Nashorn でスクリプトが実行することを表します。新規にスクリプトを作成した場合、JavaScript (Mozilla Rhino compatible) オプションは表示されません。JavaScript (Oracle Nashorn) だけが表示されますが、これは Mozilla 言語拡張をロードしません。互換拡張をロードする必要がある場合は、スクリプトの先頭に
load("nashorn:mozilla_compat.js");
を追加してください。詳細は https://wiki.openjdk.java.net/display/Nashorn/Rhino+Migration+Guide#RhinoMigrationGuide-Compatibility-script を参照してください。
Mozilla Rhino は Oracle Nashorn に切り替わったため、Mozilla Rhino の使用は推奨しません。ただし、Mozilla Rhino は他の JSR 223 互換スクリプトエンジンと同様に SOAtest で使用できます (「その他の JSR 223 スクリプト言語」を参照)。Mozilla Rhino に含まれる次の 2 つの jar ファイルを [システムプロパティ] の下の [設定] パネルでクラスパスに追加する必要があります。Rhino js.jar および js-engine.jar詳細については https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8 を参照してください。
ビルド済み jar ファイルは maven central からも取得できます。
http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.mozilla%22%20a%3A%22rhino%22
- http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22rhino-js-engine%22
Anchor | ||||
---|---|---|---|---|
|
その他の JSR 223 スクリプト言語を利用可能にするには、スクリプト エンジンをクラスパスに追加します([Parasoft] 設定パネルに移動し、[システム プロパティ] エリアに追加します )。
たとえば、JSR 223 を実装する JRuby スクリプト エンジンを追加できます。それには、http://jruby.org/ から JRuby をダウンロードしてクラスパスに配置します。
次のコードは JRuby スクリプトのサンプルです。
Code Block |
---|
require 'java' Application = com.parasoft.api.Application def doSomething(input, context) Application.showMessage("hello world") end |
その他の拡張に関するリソース
ユーザー定義のカスタム スクリプトを実行する Extension ツールを作成し、適用する方法の詳細については「Extension Tool for Custom Scripting」を参照してください。