Seleniumを使ってテスト自動化。[第5回 発展編. Selenium Gridを使用してマルチノード/マルチスレッドでテスト実施]



Seleniumを使ってテスト自動化。[第5回 発展編. Selenium Gridを使用してマルチノード、マルチスレッドでテストを実施]

 

Seleniumを使用してのテスト自動化。第5回目の今回は最終回です。発展編として、あなたのテスト自動化ツールにさらに磨きをかけていくために必要なことを紹介します。現場で本当に通用するテストツール作りに役立ててください。

 

 

Seleniumでパフォーマンステストツールを作成する

さて今回はSeleniumを利用してWebアプリケーションのパフォーマンステストツールを作成することを目標とします。ご存知の通り、実際のコールセンターでは多くのエージェントがブラウザ経由でWebシステムにアクセスして業務を行います。

Seleniumを使用するとこのような複数のユーザーがブラウザでオペレーションを行っている状況をシミュレートすることができます。そのためこのSeleniumを利用したテストによって、本番環境で実際に複数のエージェントが同時に使用した状況下でのアプリケーションの動きやサーバサイドの負荷などを高精度で予測することができます。

 

さて、このようなツールを作成する場合何が必要でしょうか。以下、紹介していきます。

 

 

テストツールをデザインする

こちらの概念図を見てください。簡単なテストツールを模式的に表しています。

  1. 設定ファイルを読込んでテストツール「Scenario Manager」が起動します。
  2. 実行するテストシナリオがJSON形式などで記述されたファイルをこのツールにインポートします。
  3. インポートされたテストシナリオの実行/停止をツール上で行います。
  4. 各テストシナリオはマルチスレッドで処理されます。
  5. 各処理はSelenium Gridにより複数ノードに振り分けられ実施されます。

 

 

今回は上記のステップのうち4およびについてさらに詳しく解説します。

 

 


Java マルチスレッド処理の導入

 

Javaにおけるマルチスレッド化について、2つ方法をご紹介します。

 

1. start(), run()メソッドを利用する。

以下の例のように簡単にマルチスレッド処理が可能です。

//呼び出し元の記述
//実行するシナリオ番号を取得しながらfor Loop内でスレッドを起動
for (int i = 0; i < scenario.size(); i++) {
    //Webdriverのパスと実行シナリオ番号を渡してMultiTestExecutorsをnewする。
    MultiTestExecutors mte = new MultiTestExecutors(webdriverspath,scenario.get(i));
    mte.start();
    Thread.sleep(2000);
}
//作成したMultiTestExecutorsクラス
class MultiTestExecutors extends Thread {

    private String[] strlogin;
    private String strwebdriverpath;
    public MultiTestExecutors(String str, String[] arg) {
        this.strlogin = arg;
        this.strwebdriverpath = str;
    } 
    public void run() { 
        try {
            //ここで実際に実行される処理が記載されています
            TestExecutor te = new TestExecutor();
            te.executeTest(strwebdriverpath,strlogin);
        } catch (Exception e) {
            //実際はしっかりとした例外処理をしてください。
            e.printStackTrace();
        }
    }

 

 

2. ExecutorServiceを利用する。

現在はコチラのやり方が主流です。以下の例ではデーモン化も行っています。この例では引数を渡すだけではなく、各処理の戻り値も取得しています。以下例です。

//呼び出し元の記述
//Executor factory を使用してスレッドをデーモン化。
ExecutorService service = Executors.newCachedThreadPool(new ThreadFactory(){
    public Thread newThread(Runnable r){
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
});

//戻り値を格納するためのListを準備
List<Future<Integer>> retList = new ArrayList<>();
//for Loopの中でTestCallableをnewしてスレッドを量産。
for (int i = 0; i < scenario.size(); i++) {
    TestCallable test = new TestCallable(strresponse, webdriverspath, i, scenario.get(i));
    retList.add(service.submit(test));
    Thread.sleep(2000);
}

//呼び出されるTestCallableクラス
class TestCallable implements Callable<Integer> {

//コンストラクタを使用して各スレッドを立ち上げるときに必要な引数を渡せるようにします。
    private int i = 0;
    private String[] strarg;
    private String strwebdriverpath;
    private String runmode;
    private int intplace = 0;

    public TestCallable(String str1, String str2, int intplace, String[] arg) {
        this.strarg = arg;
        this.runmode = str1;
        this.strwebdriverpath = str2;
        this.intplace = intplace;
    }

    @Override
    public Integer call() {

        int intreturn = 0;
        try {
    //ここに実際に各スレッドで実行される処理が記載されています。
            TestExecutor te = new TestExecutor();
            intreturn = te.executeTest(runmode, strwebdriverpath, intplace, strarg);

            return intreturn;
        } catch (Exception e) {
       //実際はしっかりとした例外処理をしてください。
            e.printStackTrace();
            return 1;
        }
    }
}

 

さて、次はいよいよSelenium Gridの導入です。