Selenium の継続的インテグレーションの実装

以前は、ユニットテストを実行し、Sauce Labs で統合テストを実行する Jenkins CI ツールを使用していました。すべてのテストを Travis に移行し、現在は Github Actions で全てを実行しています。

このドキュメントは以前 wiki にありました

全体的なアーキテクチャ

Ubuntu を実行している Google Compute Engine 仮想マシンが多数あり、現在 {0..29}.ci.seleniumhq.org でホストされています。cookie テストがサブドメインのルックアップを実行できるように、それらを指す ab.{0..29}.ci.seleniumhq.org を指す公開アドレス可能な DNS が設定されています。

これらのマシンの 1 つである ci.seleniumhq.org は、Jenkins を実行しています。Jenkins へのログインが必要な場合は、juangj に連絡してください。「Build All Java」ジョブは SCM の変更をポーリングし、次の処理を行います。

  • 「release」ターゲット、実行される予定のテスト、およびそれらのテストを実行するために必要なアーティファクト (IEDriverServer 実行可能ファイルなど) のクリーンビルドを実行します。
  • ビルドされた作業ディレクトリ全体を tar でアーカイブし、http://ci.seleniumhq.org/selenium-trunk-r${REVISION}.tgz に公開します。これは後でテスト実行で使用されます。
  • selenium-server-standalone jar を http://ci.seleniumhq.org/selenium-server-standalone-r${REVISION}.tgz に公開します。これは、テスト実行時に SauceLabs によって直接コピーされます。
  • IEDriverServer を zip 圧縮し、http://ci.seleniumhq.org/IEDriverServer-Win32-r${REVISION}.zip に公開します。これは、IE テストを実行するために SauceLabs によって直接コピーされます。このマシンは 1TB の永続ディスクによってバックアップされており、多くのビルドアーティファクトを保持できますが、(特にゾーン間でディスクを移動する場合は) 定期的にクリアする必要があります。

このビルドが成功すると、対象とする OS/ブラウザ/テストの組み合わせごとにダウンストリームビルドがトリガーされます。また、maven pom がまだ整っていることを確認するために、ダウンストリームのクリーンビルド ("Maven build") もトリガーします。

コンパイルと同じビルドノード (強力な 8-CPU マシン、32GB RAM) で実行される "Maven build" を除き、すべてのダウンストリームビルドは個別のビルドノードで実行されます。

ダウンストリームビルドは、SauceDriver クラスに従って、環境変数を使用して構成されます。ダウンストリームビルドは、ビルドマスターから selenium-trunk tar をダウンロードし、(「Build All Java」ルールによって既にコンパイルされているはずの) テストを実行します。これらのダウンストリームビルドのうち 2 つは特別です。「HtmlUnit Java Tests」と「Small Tests」はローカルでヘッドレスで実行されるだけです。その他は SauceLabs を使用します。

ネットワークに関する注意: ビルドノードは内部ネットワーク 10.1.0/24 上にセットアップされているため、ノード間のネットワーク通信は非常に高速かつ無料です。

非ヘッドレスブラウザテストが実行されている場合、test-file サーブレットは、環境変数によって決定されるポート (231${EXECUTOR_NUMBER} および 241${EXECUTOR_NUMBER} - EXECUTOR_NUMBER は現在常に 0 に等しい) でテストファイルをホストします。テストで使用されるホスト名は、環境変数 (ab.${NODE_NAME}.ci.seleniumhq.org、NODE_NAME は {0..29} の範囲) によって設定されます。ブラウザは、(システム構成ページで設定された Jenkins 全体の環境変数に保存されている) 認証情報を使用して SauceLabs から要求されます。Jenkins は現在、システム構成ページで、テスト実行ごとに 3 つのテストクラスを同時に並行して実行するように設定されています。

テストが実行され、結果が IRC に通知されます。

これらのすべてのテストを実行するためのインフラストラクチャを寄贈してくれた SauceLabsGoogle に感謝します。

FAQ

Jenkins のように Sauce 上でテストを実行したい (CI でテストが失敗するが、自分のマシンでは正常に動作する!)

SauceDriver ページを参照してください

新しいブラウザを追加したい (Firefox の新しいバージョンがリリースされた!)

Jenkins にはテンプレートの優れた概念がありません。私 (dawagner) は、Jenkins の UI を自動化し、既成の設定を使用して新しいジョブを作成する Selenium スクリプトをいくつか持っています。手動で行う場合は、おおよその手順は次のとおりです。

  • コピーしたい最も類似した構成を見つけます。新しい Firefox リリースの場合は、最新の Firefox (Javascript + Java {Windows,Linux} **{Native,Synthesized} の約 6 つのビルドが関連付けられているはず) を見つけます。
  • これらのビルドごとに、(ログイン時にホームページの左側のメニューにある) [新規ジョブ] を作成します。
  • 他のジョブのスタイルでジョブに名前を付けます。[既存のジョブをコピー] を選択し、コピーするジョブを入力します。
  • 事前に設定されたジョブをスクロールします。バージョン番号、ブラウザ名、および置き換える必要のあるその他の詳細を置き換えます。Firefox の更新の場合、現在、番号を置き換える必要のある場所が 3 つあります ([browser_version] フィールドと、[ビルドの実行シェル] の 2 つ)。
  • 保存
  • [Build All Java] タスクに移動し、構成し、他の多くのジョブがリストされている [ビルドするプロジェクト] フィールドに新しいビルドを追加します。**

Firefox の更新の場合は、既存のビルドを削除することもできます。