標簽(空格分隔): 測試架構
什么是測試基礎架構?
測試基礎架構指的是,執行測試的過程中用到的所有基礎硬件設施以及相關的軟件設施。因此,我們也把測試基礎架構稱之為廣義的測試執行環境。通常來講,測試基礎架構主要包括以下內容:
- 執行測試的機器;
- 測試用例代碼倉庫;
- 發起測試執行的 Jenkins Job;
- 統一的測試執行平台;
- 測試用例執行過程中依賴的測試服務,比如提供測試數據的統一測試數據平台、提供測試全局配置的配置服務、生成測試報告的服務等;
由於測試基礎架構的核心是圍繞測試執行展開的,所以我們今天就先來重點討論一下“執行測試的機器”部分。
先試想一下:你要在一個典型測試場景中,基於某種瀏覽器去執行 Web 應用的 GUI 測試。這時,你首先要做的就是找到相應的機器,並確保上面已經安裝了所需的瀏覽器。如果這台機器上,還沒有安裝所需瀏覽器的話,你需要先安裝這個瀏覽器。一切准備就緒后,你就可以使用這台機器執行測試了。
如果你要執行的測試只需要覆蓋一種瀏覽器的話,那就很簡單了,你只要事先准備好一批專門的機器或者虛擬機,然后安裝好所需的瀏覽器就可以了。同時,如果測試用例的數量也不是很多的話,你需要的這批機器或者虛擬機的數量也不會很多。執行測試時,你只要將需要使用的那台機器的地址提供給測試用例就可以了。
其實,這種模式就是典型的“小作坊”模式。“小作坊”模式的特點就是,人工維護一批數量不多(通常在 30 台以內)的執行測試的機器,然后按需使用。
對於小團隊來講,“小作坊”模式的問題並不大。但是,隨着測試覆蓋率要求的提升,以及測試用例數量的增加,這種“小作坊”模式的弊端就逐漸顯現,並被不斷放大了。其中,最主要問題體現在以下四個方面:
- 當 Web 應用需要進行不同瀏覽器的兼容性測試時,首先你需要准備很多台機器或者虛擬機,並安裝所需的不同瀏覽器;然后,你要為這些機器建立一個列表,用於記錄各台機器安裝了什么瀏覽器;最后,你在執行測試時,需要先查看機器列表以選擇合適的測試執行機。
- 當 Web 應用需要進行同一瀏覽器的不同版本的兼容性測試時,你同樣需要准備很多安裝有同一瀏覽器的不同版本的測試執行機,並為這些機器建立列表,記錄各台機器安裝的瀏覽器版本號,然后執行測試時先查看列表以選擇合適的測試執行機。
- 測試執行機的機器名或者 IP 發生變化,以及需要新增或者減少測試機時,都需要人工維護這些機器列表。很顯然,這種維護方式效率低下,且容易出錯。
- 在 GUI 自動化測試用例的數量比較多的情況下,你不希望只用一台測試執行機以串行的方式執行測試用例,而是希望可以用上所有可用的測試執行機,以並發的方式執行測試用例,以加快測試速度。為了達到這個目的,你還是需要人工管理這些測試用例和測試執行機的對應關系。
四種情況的問題,可以歸結為:測試執行機與測試用例的關系是不透明的,即每個測試用例都需要人為設置測試執行機。
為了改善這種局面,Selenium Grid 就應運而生了。
- 一方面,使用 Selenium Grid 可以讓測試機器的選擇變得“透明”。也就是說,我們只要在執行測試用例時指定需要的瀏覽器版本即可,而無需關心如何找到合適的測試執行機。因為,這尋找符合要求的測試執行機的工作,Selenium Grid 可以幫你完成。
- 另一方面,Selenium Grid 的架構特點,天生就能很好地支持測試用例的並發執行。
接下來,我就和你詳細聊聊到底什么是 Selenium Grid,Selenium Grid 的架構是什么樣的。
- Selenium Hub 用來管理各個 Selenium Node 的注冊信息和狀態信息,並且接收遠程客戶端代碼的測試調用請求,並把請求命令轉發給符合要求的 Selenium Node 執行。
傳統 Selenium Grid 的搭建方法
- 通過官網下載 selenium-server-standalone-.jar 文件。這里需要注意的是,不管是 Hub 還是 Node,都使用同一個 JAR 包啟動,只是啟動參數不同而已。將下載的 selenium-server-standalone-.jar 文件分別復制到兩台機器上。選定其中一台機器作為 Selenium Hub,並在這台機器的命令行中執行以下命令:
java -jar selenium-server-standalone-<version>.jar -role hub
在這條命令中,“-role hub”的作用是將該機器啟動為 Selenium Hub。啟動完成后,這台機器默認對外提供服務的端口是 4444。
然后,你就可以在這台機器上通:http://localhost:4444/grid/console
觀察Selenium Hub 的狀態,也可以在其他機器上通過 http://:4444/grid/console 觀察 Selenium Hub 的狀態。其中, 是這台 Selenium Hub 機器的 IP 地址。由於此時還沒有 Node 注冊到該 Hub 上,所以你看不到任何的 Node 信息。
啟動過程和狀態信息,分別如圖
- 在另一台作為 Selenium Node 的機器上執行以下命令:
java -jar selenium-server-standalone-<version>.jar -role node -hub http:// <Hub_IP>:4444/grid/register
這條命令中,“-role node”的作用是,將該機器啟動為 Selenium Node,並且通過“-hub”指定了 Selenium Hub 的節點注冊 URL.執行成功后,你可以再次打開 http://:4444/grid/console 觀察 Selenium Hub 的狀態。此時,你可以看到已經有一個 Node 掛載到了 Hub 上。這個 Node,就是用來實際執行測試的機器了。並且,這個 Node 上已經缺省提供了 5 個 Firefox 瀏覽器的實例、5 個 Chrome 瀏覽器的實例和 1 個 IE 瀏覽器的實例,同時默認允許的並發測試用例數是 5 個
如果你想自己配置這些內容,可以在啟動 Node 的時候提供不同的啟動參數。具體可以指定哪些參數,你可以參考
https://github.com/SeleniumHQ/selenium/wiki/Grid2
所示為在 Hub 端注冊 Node 的過程,如圖 6 所示為掛載完 Node 后 Selenium Hub 的狀態。
完成上述操作后,在測試用例中通過以下代碼將測試指向 Selenium Hub,然后由 Selenium Hub 完成實際測試執行機的分配與調度工作。其中,最關鍵的部分是,創建 RemoteWebDriver 實例的第一個參數,這個參數不再是一個具體的測試執行機的 IP 地址或者名字了,而是 Selenium Hub 的地址。
DesiredCapabilities capability = DesiredCapabilities.firefox();
WebDriver driver = new RemoteWebDriver(new URL("http://<Hub_IP>:4444/wd/hub"), capability);
基於 Docker 的 Selenium Grid 的搭建方法
目前,Docker 技術的廣泛普及,再加上它的輕量級、靈活性等諸多優點,使得很多軟件都出現了 Docker 版本。當然,Selenium Grid 也不例外。所以,我也會在這里和你簡單介紹一下基於 Docker 的 Selenium Grid 搭建過程。
在這個搭建過程中,你將會發現基於 Docker 運行 Selenium Grid 的話,機器的利用率會得到大幅提高。因為,一台實體機或者虛擬機,往往可以運行非常多的 Docker 實例數量,而且 Docker 實例的啟動速度也很快。因此,相對於虛擬機或者實體機方案而言,Docker 方案可以更高效地創建 Node。
接下來,我們就一起看看如何基於 Docker 來搭建 Selenium Grid 吧。
在基於 Docker 搭建 Selenium Grid 之前,你需要先安裝 Docker 環境。具體安裝方法,https://docs.docker.com/get-started/
接下來,你就可以通過以下命令分別啟動 Selenium Hub 和 Selenium Node 了。
#創建了Docker的網絡grid
$ docker network create grid
#以Docker容器的方式啟動Selenium Hub,並且對外暴露了4444端口
$ docker run -d -p 4444:4444 --net grid --name selenium-hub selenium/hub:3.14.0-europium
#以Docker容器的方式啟動並掛載了Chrome的Selenium Node
$ docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome:3.14.0-europium
#以Docker容器的方式啟動並掛載了Firefox的Selenium Node
$ docker run -d --net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-firefox:3.14.0-europium
相比基於實體機或者虛擬機搭建 Selenium Grid 的方法,基於 Docker 的方式靈活性更大、啟動效率也更高、可維護性也更好。而且,在更高級的應用中,比如當我們需要根據測試用例的排隊情況,動態增加 Selenium Grid 中的 Node 數量的時候,Docker 都將是最好的選擇。關於這部分內容具體的細節,我會在后面兩篇文章中詳細展開。