ループの制御

この例では、ループを制御するカスタム・コードを使用したテスト実行の拡張について説明します。 この例のサンプル・コードは、テスト結果をより優れた方法で分析、検査できるように、テスト内のループの振る舞いを操作する方法を示します。

この例では、IBM の取引アプリケーションを使用した株購入トランザクションの記録を使用します。 ここで示す概念は、その他のアプリケーションのテストでも使用できます。

テストでは初めに、ログイン ID のデータプール置換を使用して、株購入トランザクションを記録します。

以下の図に示すように、ページは 5 回反復するループで折り返されます。

テストのページの中に、3 つのカスタム・コード項目があることに注意してください。カスタム・コード項目は「C」の文字がある緑色の円で示されています。 この例では、 これらのカスタム・コード項目を探索します。

1 番目のカスタム・コード InitializeBuyTest を次に示します。

package customcode;

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);

 				// Use the test's data area to record the fact that an error has 			
				// occurred.
 				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 に関連付けられたユーザー定義値を判別します。 failedYettrue の場合、StopLoopCheck によってテスト・ループが中断されます。


フィードバック