...
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.home および jython.path 変数を指定しなければならない場合があります。この 2 つの変数は、Jython モジュールを探すために使用されるので、Jython モジュールをインポートしていない Jython コードは、これらの変数を設定せずに使用できます。jython.home には Jython のインストールディレクトリを指定します。jython.path は、jython.home/Lib ディレクトリ以外の場所にあるモジュールのパスを追加するために使用されます。jython.path には複数のパスを指定できますが、jython.home には 1 つのディレクトリだけを指定します。jython.home および jython.path 変数を設定した場合、変更を反映するには、SOAtest または Virtualize を再起動する必要があります。
スクリプト機能で Java を使用し、変更された Java ファイルを SOAtest で再コンパイルするには、「SOAtest での Eclipse Java プロジェクトの使用」を参照して環境設定方法の詳細を確認してください。
スクリプトの指定
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 に特定の値を渡したりできます。
詳細については Virtualize 拡張 API ドキュメントを参照してください。拡張 API のドキュメントには、[Parasoft] > [ヘルプ] メニューからアクセスすることができます (『Parasoft Virtualize 拡張 API』というブックを探してください)。
必要な JAR ファイルに接続
拡張 API を使用する Java コードを作成していて、
...
- 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 のスクリプトで変数を宣言して使用できます。
...
Code Block |
---|
----------------------------- var TestHome=C:\functional-tests\src\test\soatest\tests\LoadTests var ReportHome=C:\LoadTestReports var minutes = 1 var scenario = "Linear Increase" var test=echo open ${TestHome}\${test}.tst loadtest -minutes ${minutes} -report ${ReportHome}/%d/${test}/${test}.rpt -xml${ReportHome}/%d/${test}/${test}.xml -html ${ReportHome}/%d/${test} ${scenario} ----------------------------- |
Jython 設定の構成
Jython のバージョン
SOAtest および Virtualize に付属している Jython 2.5.2 には、os モジュールなどの一部の標準 Jython ライブラリが含まれていません。そのようなモジュールを使用し、SOAtest または Virtualize でアクセスしたい場合、次のように外部の Jython を指すよう設定できます。
- 任意の場所に Jython をインストールします。この場所を
<Jython Install Directory>
で表します。 - SOAtest または Virtualize を開きます。
- [Parasoft] メニュー > [設定] を選択します。
- [スクリプト] を選択します。
- [Jython Home] フィールドに
<Jython Install Directory>
を入力します。 - SOAtest または Virtualize を再起動します。
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 のマニュアルを参照してください。Extension framework API のドキュメントを参照するには、[Parasoft] メニューの [ヘルプ] をクリックし、『Parasoft SOAtest 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 サンプルでは、ソース コードおよびコンパイル済みのクラス ファイルはSOAtestInstallRoot/build/examples にあります。SOAtestInstallRoot/build フォルダーは、すでに SOAtest のクラスパスに含まれているため、テスト スイートで Keyword サンプルを使用できます。このフォルダーにユーザー独自の Java クラス ファイルを置いてSOAtest で使用することもできます。SOAtestInstallRoot/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 を参照してください。SOAtest および Virtualize には Jython 2.5.2 が付属しています。
- Jython スクリプトを使用する場合、[設定] パネルの [スクリプト] タブで jython.home および jython.path 変数を指定しなければならない場合があります。この 2 つの変数は、Jython モジュールを探すために使用されるので、Jython モジュールをインポートしていない Jython コードは、これらの変数を設定せずに使用できます。jython.home には Jython のインストールディレクトリを指定します。jython.path は、jython.home/Lib ディレクトリ以外の場所にあるモジュールのパスを追加するために使用されます。jython.path には複数のパスを指定できますが、jython.home には 1 つのディレクトリだけを指定します。jython.home および jython.path 変数を設定した場合、変更を反映するには、SOAtest または Virtualize を再起動する必要があります。
- 他のモジュールをインポートする場合、まだ Jython 2.5.2 をインストールしていなければ、jython.org から Jython 2.5.2 をダウンロードしてインストールする必要があります。Linux の場合、java -jar jython_installer-2.5.2.jar を実行します。Windows の場合、jython_installer-2.5.2.jar をダブルクリックします。
- 指定されたスクリプトが有効で実行可能かをチェックするには (またはメソッド エントリを [メソッド] ボックスに追加するには)、スクリプトの指定に使用したオプションに応じて [ファイル] または [テキスト] テキスト フィールドを右クリックし、ショートカット メニューの [評価] をクリックします。
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」を参照してください。 スクリプトを使用して SOAtest を拡張する詳細な手順については、「スクリプトによる SOAtest の拡張」を参照してください。