優れたWebアプリケーションを開発するということは、それが使いやすく、完全に機能し、互換性があるということです。厳格なエンドツーエンドテストを行うことで、安定したWebアプリケーションの展開が保証されます。可能なすべてのブラウザでテストを行うことで、優れたユーザーエクスペリエンスが保証されます。

Nightwatchは、Webアプリケーション向けのエンドツーエンドの自動テストソリューションです。開発者やテストエンジニアは、Nightwatchを使用してテストを記述し、テストの不安定さを気にすることなく、さまざまなブラウザを簡単にターゲットにすることができます。

異なるオペレーティングシステムマシン上に異なるブラウザがセットアップされたインフラストラクチャを考えてみましょう。これで、テストとインフラストラクチャの準備が整いました。しかし、テストをインフラストラクチャ上で実行するように委任するにはどうすればよいでしょうか?Selenium Gridを使用すると、2つをシームレスに結合できます。Selenium Gridは、テストを実行する正確な環境を効率的に見つけるのに役立ちます。

Selenium Gridとは?

Selenium Gridは、分散テスト、複数の環境のスケーリング、および着信するテストの負荷分散を支援する中心点です。Gridは、複数のブラウザとOSの組み合わせにまたがる並列テストをサポートすることで、テスト効率を向上させます。すべてのテストはGridを指し、Gridはそれらをインテリジェントにルーティングして、基盤となるインフラストラクチャで実行します。

ローカルまたはクラウドデバイスファームがある場合、Selenium GridはWebテストのすべての委任ニーズを処理します。

Grid Architecture

Selenium Gridの機能は、次のようにさまざまなコンポーネントに分割されます。

ルーター

名前が示すように、ルーターの主な役割は、リクエストを正しいコンポーネントにルーティングすることです。Selenium Gridへのリクエストは、最初にルーターに送られます。リクエストに基づいて、ルーターはそれを処理できるGridコンポーネントを識別します。

ディストリビューター

ディストリビューターは、登録されているすべてのノードのモデルを保持します。ディストリビューターは、新しいセッションリクエストを適切なノードに一致させ、セッションの作成を開始します。また、ノードのヘルスチェックを定期的にpingし、ノードのハートビートを追跡します。

ノード

ノードは、オペレーティングシステムとブラウザをホストするマシン上に存在します。したがって、ノードはWebドライバーと対話し、ブラウザコマンドをWebドライバーに転送します。各ノードは、機能のセットで構成されています。機能は、ブラウザ名、ブラウザバージョン、およびオペレーティングシステムの組み合わせです。

起動時に、ノードはGridに自身を登録します。ディストリビューターがノードの登録を処理します。

セッションマップ

セッションマップには、セッションIDとセッションが実行されているノードのマッピングが含まれています。既存のセッションに対するすべてのリクエストについて、ルーターはセッションマップを使用してノードを検索し、リクエストをそれぞれのノードに転送します。

新しいセッションキュー

新しいセッションキューは、すべての新しいセッションリクエストをエンキューします。新しいセッションキューは、FIFOキューです。その間、ディストリビューターは、ノードのいずれかに新しいセッションの容量があるかどうかを定期的に確認します。もしあれば、ディストリビューターはノード内の一致するスロットをブロックし、新しいセッションキューからリクエストを削除します。ノードはセッションを作成し、クライアントに応答します。

新しいセッションキューには、リクエストの再試行およびリクエストのタイムアウトのメカニズムもあります。

イベントバス

Gridコンポーネントは、メッセージを使用して相互に対話するためにイベントバスを利用します。Gridコンポーネントは、イベントバスを介して相互に通信します。

Selenium Gridのセットアップ

前提条件

  1. Javaがダウンロードされていることを確認します。そうでない場合は、ダウンロードして、Gridを実行するマシンにJavaをセットアップします。
  2. Seleniumダウンロードページから最新のjarをダウンロードします。
  3. Webドライバーがシステムパス上にあることを確認します。詳細については、ブラウザドライバーのインストールを参照してください。サーバーはパス上のドライバーを自動的に検出します。この動作は構成可能です。

Selenium Gridは、スタンドアロン、ハブとノード、および完全に分散された3つのモードのいずれかでセットアップできます。

3つのモードすべてで、デフォルトのサーバーアドレスはhttp://localhost:4444です。

スタンドアロン

スタンドアロンモードには、すべてのGridコンポーネントが1つにまとまっています。これは、Gridを使い始めるための最も簡単な方法です。

java -jar selenium-server-${grid-version}>.jar standalone

ハブとノード

ハブは、ルーター、ディストリビューター、新しいセッションキュー、セッションマップ、およびイベントバスで構成されています。ノードは、ハブとの通信を可能にするノードとイベントバスで構成されています。

ハブを起動します

java -jar selenium-server-${grid-version}.jar hub

ノードを起動します

java -jar selenium-server-${grid-version}.jar node

完全に分散

完全に分散されたモードでは、各Gridコンポーネントが独立して実行されます。すべてのGridコンポーネントは、相互に通信するためにイベントバスに依存します。

イベントバスを起動します

java -jar selenium-server-${grid-version}.jar event-bus

セッションマップを起動します

java -jar selenium-server-${grid-version}.jar sessions

新しいセッションキューを起動します

java -jar selenium-server-${grid-version}.jar sessionqueue

ディストリビューターを起動します

java -jar selenium-server-${grid-version}.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false

ルーターを起動します

java -jar selenium-server-${grid-version}.jar router --sessions http://localhost:5556 --distributor http://localhost:5553 --sessionqueue http://localhost:5559

ノードを起動します

java -jar selenium-server-${grid-version}.jar node

Gridが起動しているかどうかを確認するには、http://<grid-url>/statusエンドポイントにpingします。

各コンポーネントには、構成可能なCLIオプションがあります。

Docker

Selenium GridはDockerもサポートしています。開始するには、Selenium Dockerを参照してください。

Grid UI

http://<grid-url>/uiに移動します。

Grid UIには、すべてのノードを含むGridモデルが表示されます。セッションの別のタブには、進行中のセッションとキューで待機中のセッションが表示されます。

Selenium GridでNightwatchテストを実行する

Nightwatchには、サンプルテストがいくつか同梱されており、これを使用してGridをすばやく起動して実行できます。

このガイドでは、Nightwatch 2.0+が使用されていると仮定します。インストールするには、次を実行します。

npm i nightwatch

Gridを使用するようにNightwatchを構成する

テストランナーには、構成ファイルが必要です。ファイルには、拡張子「.json」または「.js」を使用できます。構成オプションと機能が多いため、「.js」が推奨されます。

Nightwatchは、存在しない場合、拡張子「.js」の構成ファイルを生成するのに役立ちます。これには、任意の環境でテストするための適切なオプションセットが含まれています。簡単にするために、selenium-server関連のオプションを含む構成ファイルを共有します。selenium-serverホストとポートがGrid URLと一致していることを確認するだけで、準備は完了です。

{
  webdriver: {},

  test_settings: {
    selenium_server: {
      selenium: {
        start_process: false,
        host: 'localhost',
        port: 4444
      }
    },

    'selenium.chrome': {
      extends: 'selenium_server',
      desiredCapabilities: {
        browserName: 'chrome',
        chromeOptions : {
          w3c: true
        }
      }
    },

    'selenium.firefox': {
      extends: 'selenium_server',
      desiredCapabilities: {
        browserName: 'firefox'
      }
    }
  }
};

テストワーカーを使用した並列実行

デフォルトでは、test_workersオプションは無効になっています。複数のテストファイルを並列で実行する場合は有効にします。

並列モードで実行するには、Gridのmax-session CLIオプションが1より大きく設定されていることを確認します。デフォルトでは、マシンの使用可能なプロセッサーの数に基づいています。

Nightwatch構成を更新して、必要な数のテストワーカーを設定します

{
  test_workers : {
    enabled: true,
    workers: 4
  }
}

構成オプションを理解して使用するには、構成セクションを参照してください。

Selenium Gridに対してNightwatchを実行する

Chromeを使用してSelenium Gridに対してNightwatchを実行するには

npx nightwatch examples/tests --env selenium.chrome

カンマ区切りの環境リストを渡すことで、複数のブラウザでテストを実行します

npx nightwatch examples/tests --env selenium.chrome,selenium.firefox

参考資料