この例では、IBM の取引アプリケーションを使用した株購入トランザクションの記録を使用します。ここで示す概念は、その他のアプリケーションのテストでも使用できます。
テストでは初めに、ログイン ID のデータプール置換を使用して、株購入トランザクションを記録します。
以下の図に示すように、ページは 5 回反復するループで折り返されます。
テストのページの中に、3 つのカスタム・コード項目があることに注意してください。カスタム・コード項目は「C」の文字がある緑色の円で示されています。この例では、 これらのカスタム・コード項目を探索します。
1 番目のカスタム・コード項目 InitializeBuyTest には、以下のコードが含まれています。
package test; import java.util.Random; import com.ibm.rational.test.lt.kernel.IDataArea; import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices; import com.ibm.rational.test.lt.kernel.services.IVirtualUserInfo; /** * @author unknown */ public class InitializeBuyTest implements com.ibm.rational.test.lt.kernel.custom.ICustomCode2 { /** * no-arg コンストラクターを使用してこのインスタンスを作成する。 */ public InitializeBuyTest() { } /** * ICustomCode2 および ITestExecutionServices インターフェースの説明については、 * Javadoc 情報を参照してください。*/ public String exec(ITestExecutionServices tes, String[] args) { // テストのデータ域を取得し、まだエラーが発生していないことを示すフラグを // 設定する。このフラグは、エラー検出時にただちにスケジュール・ループを // 中断するために後で使用される。 IDataArea dataArea = tes.findDataArea(IDataArea.TEST); dataArea.put("failedYet", "false"); // 仮想ユーザーのデータ域を取得する。 IDataArea vda = tes.findDataArea(IDataArea.VIRTUALUSER); // s:0 から s:499 までのセットから、購入する株をランダムに選択する。 IVirtualUserInfo vuInfo = (IVirtualUserInfo) vda.get(IVirtualUserInfo.KEY); Random rand = vuInfo.getRandom(); String stock = "s:" + Integer.toString(rand.nextInt(499)); // 株の名前を仮想ユーザーのデータ域に保管する。 vda.put("myStock", stock); return stock; }
このカスタム・コードは、メソッド exec() 内に配置されています。
まず、フラグ値 (この例ではテキスト・ストリング) を保管するためにテストのデータ域が獲得されます。このフラグ値は、後でエラーが検出された場合にテスト・ループを停止する目的で使用されます。この方法で保管されるデータは、複数のテストにわたって保持できます。
次に、ランダムに生成された株のストリングが作成されます。この値は変数 stock として保管され、メソッドの 戻り値として戻されます。この戻り値は、以下の図に示すように、要求での置換として後で使用されます。
強調表示されている項目は、置換 (s%3A716) を使用します。これは、InitializeBuyTest カスタム・コード項目から戻された値です。カスタム・コードを使用してテストの方向を駆動します。
InitializeBuyTest の次のコード行は、Virtual User データ域を使用して、今後の参照用に株名を保管します。今回も、この方法で保管されたデータは複数のテストにわたって保持されます。
2 番目のカスタム・コードは CheckStock といいます。 この内容を次に示します (ここでは exec() メソッドのみをリストします)。
public String exec(ITestExecutionServices tes, String[] args) { // 実際に購入した株と要求された株を取得する。 String actualStock = args[0].replaceAll("<B>", ""); actualStock = actualStock.substring(0, actualStock.indexOf("<")); String requestedStock = args[1]; // ログ・レベルを ALL に設定する。 IDataArea dataArea = tes.findDataArea(IDataArea.TEST); ITestInfo testInfo = (ITestInfo)dataArea.get(ITestInfo.KEY); testInfo.setTestLogLevel(ITestLogManager.ALL); // ログ・レベルが ALL に設定されている場合は、実際の購入株と要求株を // レポートする。 ITestLogManager testLogManager = tes.getTestLogManager(); if (testLogManager.wouldReport(ITestLogManager.ALL)) { testLogManager.reportMessage("Actual stock purchased: " + actualStock + ". Requested stock: " + requestedStock + "."); } // 実際の購入株と要求された株が一致しない場合は、FAIL 判断を実行する。 if (testLogManager.wouldReport(ITestLogManager.ALL)) { if (!actualStock.equalsIgnoreCase(requestedStock)) { testLogManager.reportVerdict( "実際の購入株と要求された株が一致しません。", VerdictEvent.VERDICT_FAIL); // テストのデータ域を使用して、エラーが発生したことを // 記録する。 dataArea.put("failedYet", "true"); } } return null; }
このコードではまず、コードに渡された 2 つの引数を抽出します。次の図に示すように、元の記録の応答の一部が強調表示され、参照として使用されます。
必要なテキスト (この例では実際に購入した株の名前) を獲得するには、何らかのストリング処理が必要です。 この新規に作成された参照は、以下の図に示すように、その後引数として CheckStock に渡されます。
InitializeBuyTest の戻り値も引数として渡されている点に 注意してください。
CheckStock カスタム・コード項目は、これらの値を使用して、InitializeBuyTest によって生成されたランダムに選択された株が、テスト実行中に実際に購入されたことを検査します。
CheckStock は次にテスト・ログ・レベルを設定し、実際の購入株と要求されていた株を報告し、これらの値が一致しない場合には FAIL 判断を出します。CheckStock はまた、タグ failedYet に関連 付けられている値 true をテストのデータ域に保管します。
3 番目のカスタム・コード (exec() メソッドのみ) には、以下のコードが含まれます。
public String exec(ITestExecutionServices tes, String[] args) { // テスト・ログ・マネージャーを取得する。 ITestLogManager testLogManager = tes.getTestLogManager(); // テストのデータ域を取得し、エラーが発生したかどうかを示す // フラグを取得する。エラーが検出された場合はループを停止する。 IDataArea dataArea = tes.findDataArea(IDataArea.TEST); String failedYet = (String) dataArea.get("failedYet"); // エラーが発生している場合はループを中断する。 if (failedYet.equalsIgnoreCase("true")) { tes.getLoopControl().breakLoop(); if (testLogManager.wouldReport(ITestLogManager.ALL)) { testLogManager.reportMessage("Loop stopped."); } } return null; }
このコードでは、テストのデータ域を使用して、タグ failedYet に関連付けられたユーザー定義値を判別します。failedYet が true の場合、StopLoopCheck によってテスト・ループが中断されます。