akbピンボールマシン

RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

複数サーバーでE2Eテストを並列実行してみた

noriharu3 です。

E2Eテストの実(shi)行(xing)時間短縮(suo)を目(mu)指して、複数サーバーでテストを並列実(shi)行(xing)してみましたのでご紹介します。

複数のサーバーでE2Eテストを実行する方法

元々E2Eテストは以下の構成で実装されていました。

  • Gradle

Gradleを使用(yong)していたので並列実(shi)行するだけなら、パラメーターを設定するのみ。

なのですが、今回はE2Eテストを1つのサーバーで並列実行するのではなく、複数サーバーでE2Eテストを並列実行できないか模索しました。

理(li)由(you)としては、E2Eのテストケース毎(mei)にDBのが必(bi)要となっていたため、 1つのサーバーで並列実行することがそもそもできなかったからです。

E2Eテストを並列実行させる

Gradleを使っている場合は、パラメーターを設定するだけです。 終(zhong)わりですw。

// build.gradle

test {
  useJUnitPlatform()
  ++ maxParallelForks = 2
}

E2Eテストを複数のサーバーで並列実行させる

テスト実行(xing)前(qian)の事前(qian)処理(li)で実行(xing)するサーバーを決定し、テスト毎に実行(xing)するサーバーを切(qie)り替えます。

具体的には、テスト未(wei)実施のサーバーリスト一(yi)覧をテキストファイルに保(bao)持(chi)しておき、そこからテストを実行するサーバーを決定(ding)します。

  • 処理の流れ
    1. サーバーリストから、テストを実行するサーバーを決定する
      • @BeforeAll に処理を追加することで実現
      • サーバーリストからサーバーを取得する際のはコマンドでサクッと実装
    2. テスト実行する
    3. DBをする
    4. サーバーリスト一覧にサーバーを戻す
      • @AfterAll に処理を追加することで実現
// e2e_server_list
e2e_server_1
e2e_server_2
// E2EテストプログラムのAbstract Class

  ... (途中省略)

  @BeforeAll
  protected void リモートホスト割り振り() {
    Map<String, String> result;
    try {
      result = execCommand("sh", "server_pop_push.sh", "pop");
    } catch (IOException e) {
      throw new RuntimeException(e);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
    setServerName(result.get("stdout"));
  }

  ... (途中省略)

  @AfterAll
  public void リモートホスト返却() {
    try {
      execCommand("sh", "server_pop_push.sh", "push", getServerName());
    } catch (IOException e) {
      throw new RuntimeException(e);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  }
}

  ... (途中省略)
// server_pop_push.sh
SERVER_LIST_FILE="e2e_server_list"
LOCK_FILE="/tmp/e2e.lock"

# 0/1/2以外の任(ren)意のファイルディスクリプタ(番号)を指定
exec 200>"${LOCK_FILE}"
flock 200

### メイン処理(li)開始
if [ $1 = "pop" ]; then
  cat $SERVER_LIST_FILE | tail -n 1
  sed -ie '$d' $SERVER_LIST_FILE
elif [ $2 != '' ]; then
  echo $2 >> $SERVER_LIST_FILE
else
  echo '引数が不正です。'
fi

結果

結果として、2台のサーバーで並列(lie)実(shi)行したところ、テスト時間は約(yue)半分(40%)となりました。

Before

1台(tai)のサーバーで順番にテストを実(shi)行(xing)していました。

After

指定したサーバ台数で分散して、E2Eテストを実行できるようになりました。。
各サーバに均等に処理が振り分けるわけではなく、テスト未実施のサーバーに振り分けられます。
2台のサーバーで並列実行したところ、テスト時(shi)間(jian)は約半分(40%)となりました。

最後に

E2Eテストを

  • 分散
  • 並列実行

したブログは多くあるかと思いますが、これらは1つのサーバーに対して複数のブラウザを立てて処理を実行するものがほとんどでした。

DBのが必要など、何らかの理(li)由で単純にE2Eテストを並(bing)列処理(li)できず困っている方(fang)に、何らかのヒントを提(ti)供することができたら幸いです。

Copyright © RAKUS Co., Ltd. All rights reserved.