このセクションでは、 SOAtest/Virtualize の拡張 (スクリプト) 機能および機能のさまざまな使い方について説明します。セクションの内容:
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 プロジェクトの使用」を参照して環境設定方法の詳細を確認してください。
スクリプト機能で Java を使用し、変更された Java ファイルを Virtualize で再コンパイルするには、「Virtualize での Eclipse Java プロジェクトの使用」を参照して環境設定方法の詳細を確認してください。
SOAtest GUI のスクリプトのオプション画面でスクリプトを定義するには、次の操作を行います。
Jython または JavaScript でスクリプトを作成する場合、SOAtest または Virtualize 設定パネルのスクリプトのテンプレート フィールド (スクリプト ページ内) にスクリプトのテンプレートを指定できます。このフィールドに入力されたコードは、フィールドに対応する言語のインライン スクリプトのデフォルト コードとして使用されます。スクリプトのテンプレートは、デフォルト入力や共通グローバル変数の設定などに特に便利です。
スクリプト テンプレートは、Extension ツール、SOAP サービス、スクリプト SOAP 入力で使用されるスクリプトに適用されます。
スクリプトと SOAtest または Virtualize を連携させる必要がある場合、SOAtest または Virtualize の拡張 API を使用します。たとえば SOAtest/Virtualize 拡張 API を使用すると、スクリプトの結果を SOAtest/Virtualize のメッセージ ウィンドウに送信したり、特定の SOAtest/Virtualize に特定の値を渡したりできます。
詳細については Virtualize 拡張 API ドキュメントを参照してください。拡張 API のドキュメントには、[Parasoft] > [ヘルプ] メニューからアクセスすることができます (『Parasoft Virtualize 拡張 API』というブックを探してください)。
拡張 API を使用する Java コードを作成していて、
SOAtest
または
Virtualize
SOAtest 環境内でコードをコンパイルしたい場合、SOAtest Java Project ウィザードを使用します。ウィザードは、 拡張 API にアクセス可能な新規 Java プロジェクトを作成します。詳細については、
「SOAtest での Eclipse Java プロジェクトの使用」
または
「Virtualize での Eclipse Java プロジェクトの使用」を参照してください。
拡張 API を使用する Java コードを作成していて、
SOAtest
または
Virtualize
環境外でコードをコンパイルしたい場合、次の Jar ファイルが必要です。
Jar ファイルは次の場所にあります。<SOAtest Installation Directory>\plugins\com.parasoft.xtest.libs.web_<SOAtest version>\root
および<Virtualize Installation Directory>\plugins\com.parasoft.xtest.libs.web_<Virtualize version>\root
また、拡張 API クラス以外の機能を使用する場合、他の(サードパーティ製またはオープンソースの) Jar をクラスパスに追加しなければならない可能性があります。例:
Extension ツールは、クラスローダーで実行されます。JNDI などの特定のAPI は、コンテキスト クラスローダーに依存します。コード内で特定の API を呼び出す前にコンテキスト クラスローダーの設定が必要な場合があります。詳細については http://wiki.eclipse.org/Context_Class_Loader_Enhancements#Technical_Solution を参照してください。
SOAtest および Virtualize のスクリプトで変数を宣言して使用できます。
変数の宣言は、var
キーワードで開始し、後ろに等号 =
を続け、その後ろに変数の値を記述します。変数は 1 行に 1 つずつ宣言する必要があります。スクリプトの任意の場所で変数を宣言し、宣言の直後に変数を使用できます。既存の変数に新しい値を代入するには、変数を「再宣言
」します。
変数の参照は次のように行います。${varName}
SOAtest および Virtualize に付属している Jython 2.5.2 には、os モジュールなどの一部の標準 Jython ライブラリが含まれていません。そのようなモジュールを使用し、SOAtest または Virtualize でアクセスしたい場合、次のように外部の Jython を指すよう設定できます。
<Jython Install Directory>
で表します。<Jython Install Directory>
を入力します。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』というタイトルのブックを探します。
たとえば、次の画像のようなテストがあるとします。 テーブル データ ソースの名前は 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』というタイトルのブックを探します。 |
Extension ツールの典型的な使用方法の 1 つは、データ ソースのデータにアクセスし、データを操作してから直接 XML Data Bank または Writable Data Source に格納するというものです。このサンプル スクリプトでは、getKeywords というメソッドを定義し、その中でデータ ソース「Books」の「keywords」というデータ ソース列にアクセスしています。その後、スクリプトの出力を XML Data Bank に送信できるよう、文字列の XML 表現を返しています。
Extension ツールからデータ ソースにアクセスするには、このほかに構成の設定が必要であることに注意してください。詳細については前のセクションを参照してください。
このサンプルでは、メソッドは入力として 2 つの引数を受け取ります。
from soaptest.api import * def getKeywords(input, context): title = context.getValue("Books", "keywords") return SOAPUtil.getXMLFromString([title]) |
def methodName(): # code |
def methodName(input): # code |
def methodName(input, context): # code |
上のサンプルでは、input は次のどちらかを参照します。
ほとんどの場合、input 変数に渡される値はプリミティブな Jython 文字列であると予想できます。
一般的に、context 変数は SOAtest によって動的に決定され、拡張 API の Context クラスのインスタンスです。Extension ツールの場合、context はこの特定のツール(テスト スイート内の他の Extension ツールではなく) の ExtensionToolContext のインスタンスです。
var SOAPUtil = Packages.soaptest.api.SOAPUtil function getKeywords(input, context) { title = context.getValue("Books", "keywords") return SOAPUtil.getXMLFromString([title]) } |
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); } } |
このサンプルのような Java コードは、SOAtest の外部でコンパイルされる必要があります。コンパイラが SOAtest 拡張 API のパッケージにアクセスできるよう、SOAtest の jar ファイル ( |
この Keyword サンプルでは、ソース コードおよびコンパイル済みのクラス ファイルはSOAtestInstallRoot/build/examples にあります。SOAtestInstallRoot/build フォルダーは、すでに SOAtest のクラスパスに含まれているため、テスト スイートで Keyword サンプルを使用できます。このフォルダーにユーザー独自の Java クラス ファイルを置いてSOAtest で使用することもできます。SOAtestInstallRoot/build フォルダーを使用する代わりに、設定ダイアログの [System Properties] タブでもクラスを追加できます。
Jython スクリプトを使用してファイルのコンテンツを文字列に読み込むには、次のメソッドを使用します。
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 ツールのカスタム アサーションとして使用できます。このスクリプトは、データ ソースから値を取得し、レスポンス値とともに値を出力し、レスポンス値にデータ ソースの値が含まれているかを表すブール値を返します。
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 スクリプトのサンプルは、さまざまなソース (データバンク、テスト スイート変数、環境変数) から値を抽出し、+ 演算子を使用した連結などの文字列操作を行います。
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 がオーバーロードされています。
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 を使用して選択されたフレームのタイトル テキストを取得します。
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; } |
java.lang.String
)。たとえば、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")
Jython の書き方や Jython から Java クラスを呼び出す方法などの Jython (Java と統合された Jython の実装) の詳細については、http://www.jython.org を参照してください。SOAtest および Virtualize には Jython 2.5.2 が付属しています。
次のコードは Groovy スクリプトのサンプルです。
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); } |
JSR 223 「Scripting for the Java Platform」仕様を実装する任意のスクリプト エンジンを認識するよう SOAtest を構成できます。 Oracle Nashorn はデフォルトで利用可能です。その他のエンジンを追加できます。
Oracle Nashorn ECMAScript エンジンは Java に含まれているため、デフォルトで利用可能です。次のコードは Oracle Nashorn スクリプトのサンプルです。
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 は、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
その他の JSR 223 スクリプト言語を利用可能にするには、スクリプト エンジンをクラスパスに追加します([Parasoft] 設定パネルに移動し、[システム プロパティ] エリアに追加します )。
たとえば、JSR 223 を実装する JRuby スクリプト エンジンを追加できます。それには、http://jruby.org/ から JRuby をダウンロードしてクラスパスに配置します。
次のコードは JRuby スクリプトのサンプルです。
require 'java' Application = com.parasoft.api.Application def doSomething(input, context) Application.showMessage("hello world") end |
ユーザー定義のカスタム スクリプトを実行する Extension ツールを作成し、適用する方法の詳細については「Extension Tool (カスタム スクリプト)」を参照してください。