Program Level Execution and Load Testing
プログラム・レベル
プログラムレベルの実行とは、カスタムJavaプログラムまたはサードパーティのJavaアプリケーションから自動化されたプロセスを実行することを意味する。このシナリオではT-Plan Robotの役割はJavaライブラリに絞られるため、このモードはJava APIのレベルのみでサポートされ、関連するJavaコードの開発をサポートするGUIやCLIの機能はありません。この目的のためには、NetBeansやEclipseのようなサードパーティツール(IDE)を使用してください。
T-Plan Robot Enterpriseは、AutomatedRunnableおよびApplicationSupport Javaインターフェースを通じてプログラムレベルの実行をサポートします。このAPIは、単一のプロセス(GUIまたはCLIモードでの単一の自動実行を効果的にシミュレート)、またはCLIモードで(システムリソースが枯渇するまで)実行される無制限の数のプロセス(Javaスレッドとして実行)を作成し、開始することができます。このような各プロセスは、CLI と同じオプション・セットをシームレスに受け入れ、一度に 1 つのテスト環境(デスクトップ)に対して 1 つのテスト・スクリプトを実行します。
プログラム・レベルの実行は、以下の 3 つのステップで構成されます:
ApplicationSupport クラスをインスタンス化します。これにより、必要なフレームワークと共有サービスが初期化されます。
このインスタンスを使用して、AutomatedRunnable を作成します。テスト・スクリプト名(ファイル)と、CLI 仕様と互換性のあるその他のオプションは、
createAutomatedRunnable()
メソッドの引数の 1 つを介して受け付ける。runnable の
run()
メソッドを呼び出すか(シングル・プロセス・シナリオ)、java.lang.Thread
でカプセル化して
スレッドとして起動します(マルチスレッド・シナリオ)。
以下の例では、2つの自動化されたスレッドを起動しています。最初の 1 つは、testmachine1 というマシンの 5900 番ポートで動作している VNC サーバに接続し、C:∕TestScripts∕test1.tpr テスト・スクリプトを実行します。もう1つは、testmachine2 というマシンの 5901 番ポートで動作している VNC サーバーに接続し、C:㊟TestScripts㊟test2.tpr テストスクリプトを実行します。両方のスレッドが同時に実行され、最後のスレッドが終了するとプログラムが終了することに注意してください。
TwoTasks.java
import com.tplan.robot.ApplicationSupport;
import com.tplan.robot.AutomatedRunnable;
/**
*ExampleoftwosimultaneoustestprocessesstartedattheJavacodelevel.
* (C)T-PlanLimited,http://www.t-plan.com
*/
publicclass TwoTasks {
publicstaticvoid main(String[] argv) {
// Step 1: Instantiate the ApplicationSupport class.
ApplicationSupport robot = new ApplicationSupport();
// Step 2: Create AutomatedRunnable instances and initialize them with CLI-compatible options.
String args1[] = {"-c", "rfb://testmachine1:5900", "-p", "welcome", "-n", "-r", "C:\\TestScripts\\test1.tpr"};
AutomatedRunnable runnable1 = robot.createAutomatedRunnable("cli-1", args1, System.out, false);
String args2[] = {"-c", "rfb://testmachine2:5901", "-p", "welcome", "-n", "-r", "C:\\TestScripts\\test2.tpr"};
AutomatedRunnable runnable2 = robot.createAutomatedRunnable("cli-2", args2, System.out, false);
// Step 3: Encapsulate the runnables with Thread and start them.
Thread t1 = new Thread(runnable1);
t1.start();
Thread t2 = new Thread(runnable2);
t2.start();
}
}
このマルチスレッドアプローチは、負荷テストシナリオでも採用できる。T-Plan Robotはアプリケーションのレスポンスタイムを測定することができ、負荷発生のためにテスト対象のアプリケーションやサービスにアクセスする多数のユーザーをシミュレーションするための優れたエンジンです。このモデルをパフォーマンス測定用の別のツールと組み合わせると、非常に費用対効果の高いソリューションになります。
ローカルデスクトップの自動化をサポートするだけでなく、T-Plan RobotはRFB(VNC)技術を利用し、このモードでは各スレッドが独自のVNCデスクトップサーバーインスタンスを自動化する必要があります。このようなアプローチは、1つのプラットフォーム(OS)がシステムリソース(RAMやCPUなど)が許す限り多くのVNCサーバーを実行できるUnixやLinuxで非常に効率的です。このシナリオは、Unix/Linux上で動作するアプリケーションのテストや、Unix/LinuxマシンがWebブラウザのインスタンスをホストするWebアプリケーションのテストに利用できます。MS Windows システムでは、1つの OS につき1つの VNC サーバしか動作しないため、このような環境での負荷テストはあまり効率的ではありません。このような場合、ローカルデスクトップを自動化するT-Plan Robotの機能を使用する方が良いでしょう。
T-Plan Robotはアプリケーションの応答時間を測定し、パフォーマンス結果を出すツールを提供している。自動化はデスクトップレベルで実行されるため、このようなテストはユーザーリクエストから結果までの真の経過時間を反映するため、さらなる付加価値を持つことになる。これは、一般的にリクエスト-レスポンス・サイクルの1つの重要なフェーズ(例えば、データベースやウェブ/アプリケーション・サーバーのレスポンス・タイム)の測定に焦点を当てる他の多くの負荷パフォーマンス・テスト・ツールとは対照的です。しかし、このような結果は、通常、時間が環境によってさらに影響されるエンドユーザーエクスペリエンスと一致しません。
負荷テスト
ロボットは、ストレステストのための負荷を生成するためにうまく使用することができます。多くのユーザがサービスにアクセスしたり、アプリケーションを使用したりするのをシミュレートするために、多くのテストプロセスを並行して開始することです。
Robot は JavaAPI をサポートしており、1つの Java 仮想マシン内に複数のテストスレッドを作成することができます。各スレッドは独立して、一つのVNC サーバインスタンス上で一つのテストスクリプトを実行することができます。詳しくはRobot API の RobotThread インタフェースを参照してください。Unix/Linux システムは、Windows とは異なり、1 台のマシン上で多くの VNC サーバインスタンスを実行できるため、負荷テストのホストとして好まれ ることに注意してください。
テストされたアプリケーションの負荷を生成するサンプルプログラムを作ってみましょう。つのコンポーネントを作成する必要があります:
テストアプリケーションの典型的なユーザセッションを表す、スクリプト言語 Robot によるテストスクリプト。
Java ラッパー:Robot Open API を利用して並列テストスレッドを作成し、起動します。
VNCサーバを起動し、最終的にシャットダウンするシェルラッパー(Linux/Unixのみ)。
1.テストスクリプト
このサンプルにはテストスクリプトは含まれていません。事前に作成し、後述の Java やシェルラッパーと統合する必要があります。スクリプト言語Robotでテストスクリプトを作成する方法については、このドキュメントの前の例を参照してください。テストスクリプトの作成には、Record & Replay 機能を使うと簡単です。リモートデスクトップのサイズは小さめ(800x600ピクセルなど)にし、画像比較やスクリーンショットの撮影は避けることを強く推奨します。これらの要素はすべて、必要なメモリとCPU時間を大幅に増加させます。また、リモートデスクトップの背景(壁紙)を無地に設定することをお勧めします。次のステップでは、テストスクリプトがすでに存在し、client.txtという
ファイルに保存されていると仮定します。
2.Javaラッパー
Javaラッパーは、Robot APIを使って自動テストスレッドを作成・起動するプログラムです。汎用的なラッパーのコードを以下に示します:
LoadExample.java
import com.Robot.Robot;
import com.Robot.api.RobotThread;
/**
* LoadExample.java
*
* This is an example of load testing based on Robot.
*
* (C) 2007, Robert Pes
*/
public class LoadExample {
// Default number of threads.
final static int DEFAULT_THREAD_COUNT = 50;
// Main method.
public static void main(String[] argv) {
// Number of threads
int threadCount = DEFAULT_THREAD_COUNT;
// Password
String password = null;
// Script path
String script = null;
// Parse the program arguments. We expect an integer
// indicating how many threads we will start followed by script name.
// The last argument, VNC password, is not mandatory because some
// VNC servers can be configured not to require authentication.
if (argv.length > 1 && argv.length < 4) {
try {
threadCount = Integer.parseInt(argv[0]);
script = argv[1];
if (argv.length > 2) {
password = argv[2];
}
} catch (NumberFormatException ex) {
System.out.println("Invalid number of threads - default of "
+ DEFAULT_THREAD_COUNT+" will be used.");
}
} else {
System.out.println(
"Usage: LoadExample <number_of_threads> <script_path> [<VNC_password>]");
return;
}
// Thread arguments. They are identical with Robot CLI options.
String[] threadArguments;
if (password == null) {
threadArguments = new String[] {
"--connect", // Connect option
"", // VNC host name and port - will be generated dynamically
"--run", // Run option
script, // Name and path of the script to run
"--nodisplay"// CLI execution mode option
};
} else {
threadArguments = new String[] {
"--connect", // Connect option
"", // VNC host name and port - will be generated dynamically
"--run", // Run option
script, // Name and path of the script to run
"--nodisplay", // CLI execution mode option
"--password", // Password option
password // Password
};
}
// Create an instance of Robot
Robot robot = new Robot();
RobotThread runnable;
Thread thread;
// Loop for index from 1 to specified number of threads
for (int i=1; i<=threadCount; i++) {
// Populate the VNC host name and port in the thread arguments
threadArguments[1] = "localhost:" + i;
// Create a new automated thread and start it
runnable = robot.createRobotThread(
threadArguments[1], threadArguments, System.out, false);
thread = newThread(runnable);
thread.start();
}
}
}
ラッパーを実行するには、Javaコードを.classにコンパイルします。このプログラムでは最大 3 つのパラメータを受け取ります - 希望するスレッド数(必須)、テストスクリプトへのパス(必須)、VNC パスワード(任意)です。コマンドは以下のようになる:
java -classpath .:./Robot.jar LoadExample <thread_number> <script_path> [<password>]
3.シェルラッパー
ロボットの負荷テストを始める前に、必要なVNCサーバーを全て起動しておく必要があります。また、テスト対象のアプリケーションが、1ユーザーにつき1インスタンスしか許可していないかどうかも確認してください。典型的な例はFirefoxで、一人のユーザーが複数のブラウザを起動することはできません。これを解決するには、テストスレッドごとに異なるユーザーを作成し、そのアカウントでVNCサーバーを起動する必要があります。
これらの必要なオーバーヘッド・タスクはすべて、Linux/Unix上では単純なシェル・スクリプトによって効率的に自動化できる。この例のアプリケーションにインスタンス制限がないと仮定しよう。そのとき必要なことは、VNCサーバーを起動し、Java負荷アプリケーションを実行し、テストが終わったらVNCサーバーを終了することだけです。これらのタスクを処理するBashスクリプトを以下に示す:
runLoad.sh
#!/bin/bash
# Number of threads to be executed
THREADCOUNT=10
# Path to the automated script
SCRIPT=client.txt
# VNC password. If your VNC server doesn't require password,
# leave the variable empty.
PASSWORD=welcome
# This 'for' statement will start VNC servers on local machine
# on ports 1 to THREADCOUNT
for ((i=1; i<=$THREADCOUNT; i++))
do
vncserver :$i
done
# The following command will execute the Java wrapper with Robot
# automated threads
java -Xmx512m -classpath .:./Robot.jar LoadExample $THREADCOUNT $SCRIPT $PASSWORD
# This 'for' statement will kill all the VNC servers started
# at the beginning of this script
for ((i=1; i<=$THREADCOUNT; i++))
do
vncserver -kill :$i
done
実行する前に、変数THREADCOUNT、SCRIPT、PASSWORDに正しい値を設定してください。スレッド数を多く定義しすぎると、そのうちのいくつかがjava.lang.OutOfMemoryErrorで失敗し始めるかもしれない。
この問題を解決するには、runLoad.shの-Xmx Javaオプションで指定するJVMメモリー・ヒープ・サイズを大きくしてください(デフォルト値は512MBに設定されています)。