開發一個好的網路應用程式意味著它必須是可用、功能完整且相容的。嚴格的端對端測試可確保推出穩定的網路應用程式。在所有可能的瀏覽器上進行測試可保證良好的使用者體驗。

Nightwatch 是一個用於網路應用程式的端對端自動化測試解決方案。開發人員和測試工程師可以使用 Nightwatch 撰寫測試,並輕鬆針對各種瀏覽器,而無需擔心測試不穩定性。

考慮一個基礎架構設定,其中不同的瀏覽器位於不同的作業系統機器上。現在,測試和基礎架構都已準備就緒。但是,我們如何將測試委派到基礎架構上執行?Selenium Grid 可以無縫地將兩者結合在一起。Selenium Grid 有助於有效地找到執行測試的正確環境。

什麼是 Selenium Grid?

Selenium Grid 是一個中心點,有助於分散式測試、擴展多個環境和負載平衡傳入的測試。Grid 通過支援跨多種瀏覽器和作業系統組合的平行測試來提高測試效率。所有測試都指向 Grid,它會智慧地將測試路由到基礎架構上執行。

如果您有本機或雲端裝置伺服器陣列,Selenium Grid 將處理所有網路測試的委派需求。

Grid Architecture

Selenium Grid 的功能分為以下幾個元件:

路由器 (Router)

顧名思義,路由器的主要責任是將請求路由到正確的元件。任何對 Selenium Grid 的請求都會先傳送到路由器。路由器會根據請求識別可處理該請求的 Grid 元件。

分配器 (Distributor)

分配器維護所有已註冊節點的模型。分配器會將新的會話請求與適當的節點匹配,並啟動會話建立。它還會定期 ping 節點的健康檢查,並追蹤節點的活動訊號。

節點 (Node)

節點存在於託管作業系統和瀏覽器的機器上。因此,節點會與 Web 驅動程式互動,並將瀏覽器命令轉發給它們。每個節點都包含一組功能。功能是瀏覽器名稱、瀏覽器版本和作業系統的組合。

啟動時,節點會向 Grid 註冊自己。分配器會處理節點註冊。

會話地圖 (Session Map)

會話地圖包含會話 ID 和會話執行所在節點的對應關係。對於每個現有會話的請求,路由器會使用會話地圖來查詢節點,並將請求轉發到各自的節點。

新會話佇列 (New Session Queue)

新會話佇列會將每個新的會話請求排入佇列。新會話佇列是 FIFO 佇列。同時,分配器會定期檢查是否有任何節點具有新會話的容量。如果有的話,分配器會阻止節點中的匹配插槽,並從新會話佇列中移除請求。節點會建立會話並回應用戶端。

新會話佇列還具有請求重試和請求逾時機制。

事件匯流排 (Event Bus)

Grid 元件利用事件匯流排透過訊息彼此互動。Grid 元件透過事件匯流排彼此通訊。

設定 Selenium Grid

先決條件

  1. 請確保已下載 Java。如果沒有,請下載並在將執行 Grid 的機器上設定 Java。
  2. Selenium 下載頁面下載最新的 jar。
  3. 請確保 Web 驅動程式位於系統路徑中。有關詳細資訊,請參閱安裝瀏覽器驅動程式。伺服器將自動偵測路徑上的驅動程式。此行為是可設定的。

Selenium Grid 可以設定為以下三種模式中的任何一種:獨立模式、中心和節點模式,以及完全分散式模式。

在這三種模式中,預設伺服器位址為 http://localhost:4444

獨立模式

獨立模式將所有 Grid 元件集中在一個位置。這是開始使用 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 是否已啟動,請 ping http://<grid-url>/status 端點。

每個元件都有可設定的 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

設定 Nightwatch 以使用 Grid

測試執行器需要一個組態檔。檔案可以使用 ".json" 或 ".js" 副檔名。由於 ".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

延伸閱讀