胡湘菲
摘 要: 依托于計算機學科的巨大發(fā)展,軟件自動化測試技術也有了長足進步。目前分布式軟件自動化測試環(huán)境相對脆弱,維護較難。文章在對Selenium-Grid部署測試環(huán)境的傳統(tǒng)方式進行分析的基礎上,對比了Docker容器和虛擬機的優(yōu)缺點,最后選擇開源引擎Docker與Selenium-Grid結合,研究并實現(xiàn)對軟件自動化測試環(huán)境的優(yōu)化。實踐證明,新的部署方式極大地提高了環(huán)境的穩(wěn)定性,簡化了配置的難度。
關鍵詞: 自動化測試; Selenium-Grid; Docker; 虛擬機
中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2017)03-26-04
Abstract: Relying on the great development of computer science, software automation testing technology has made great progress. At present, the distributed software automatic test environment is relatively weak and hard to maintain. Based on the analysis of the traditional way to deploy test environment with Selenium-Grid, this paper indicates the differences between Docker container and the virtual machine. The optimization of software automatic test environment is studied and realized by using the combination of Docker and Selenium-Grid. Practice has proved that the new deployment greatly improves the stability of the test environment and simplifies the configuration.
Key words: automatic test; Selenium-Grid; Docker; virtual machine
0 引言
很多企業(yè)認識到了軟件自動化測試的重要性,并將其納入日常生產(chǎn)。自動化測試可以提高測試覆蓋率,讓測試人員免于重復勞動而有更多的時間投入到新迭代中。軟件自動化測試在運行時,都需要分配真實的機器資源,并且配備相應環(huán)境。這些測試環(huán)境配置不易,伸縮機器節(jié)點效率不高。本文根據(jù)docker快速輕量構建環(huán)境的優(yōu)點結合selenium grid,探討一種更高效地搭建測試環(huán)境的方法。
1 Selenium Grid
1.1 Selenium Grid簡介
Selenium Grid[1]支持在不同的物理機,不同的瀏覽器上同時運行測試。也就是說,Selenium Grid支持在分布式軟件自動化測試環(huán)境中運行測試。
Selenium Grid對系統(tǒng)和瀏覽器的兼容性如下:
1.2 使用selenium grid的場景
⑴ 團隊需要盡快得到測試結果??蓪y試用例分發(fā)到多個機器上同時執(zhí)行,參與執(zhí)行的機器越多,團隊得到測試結果的時間越短。
多瀏覽器類型、多瀏覽器版本驗證。可在一臺機器上運行單一瀏覽器,也可在一臺機器上運行多個瀏覽器實例,以減少測試驗證時間,盡快得到測試結果。
最小化維護grid的時間。你可以自定義“鉤子”來控制軟件自動化測試環(huán)境的部署。
1.3 selenium grid的啟動與實現(xiàn)
selenium hub提供一個類似于服務器的節(jié)點,可以啟動在linux機器或者windows機器上。所有測試機都需要注冊到hub上。selenium grid作為一個子節(jié)點,hub負責將它們分發(fā)到正確的節(jié)點上。啟動selenium grid很簡單,首先將selenium提供的jar包下載到服務器。
⑴ 啟動selenium hub
java -jar selenium-server-standalone-3.0.0.jar -hub
默認情況下,hub會以端口4444啟動。如需更改默認端口,可在運行命令時添加port參數(shù)。通過http://localhost:4444/grid/console可以查看節(jié)點運行的狀態(tài)。
⑵ 啟動selenium grid
java -jar selenium-server-standalone-3.0.0.jar -role
node -hub http://localhost:4444/grid/register
如果沒有提供role選項,并且不是hub節(jié)點,則默認端口是5555。
windows下注冊ie、chrome、Firefox三種瀏覽器的方式如下。
① ie的注冊方式:
java -jar selenium-server-standalone-3.0.0.jar
Dwebdriver.ie.driver="C:/ IEDriverServer.exe" -role
webdriver -hub http://localhost:4444/grid/register -port
6666 -browser browserName="internet explorer"
② chrome的注冊方式:
java -jar selenium-server-standalone-3.0.0.jar
Dwebdriver.chrome.driver=" C:/ chromedriver.exe" -role
webdriver -hub http://localhost:4444/grid/register -port 7777 -browser browserName=chrome
③ firefox的注冊方式:
java -jar selenium-server-standalone-3.0.0.jar
Dwebdriver.chrome.bin="C:/Program Files (x86)/
Mozilla Firefox/firefox.exe" -role webdriver -hub
http://localhost:4444/grid/register -port 8888 -browser
browserName=firefox
ie和chrome自身無法啟動,需要單獨下載驅動才能運行。Selenium最早是為firefox做的,并有在firefox上錄制的插件Selenium IDE,不需要單獨的驅動。
2 Docker
2.1 Docker概述
2013年在Pycon,Solomon Hykes公布了docker初始版本之后,docker的發(fā)展異常迅猛,整個社區(qū)生態(tài)相當繁榮。Docker[2]是一個可以把開發(fā)的應用程序自動地部署到容器的開源引擎。參考docker官方宣稱的“BUILD, SHIP, RUN”,它借鑒了標準集裝箱的概念,軟件即“貨物”。它不關心容器里到底塞了什么,所有容器都是依照相同的方式裝載,它也不關心“貨物”將運到哪里,用戶可以在任何地方部署。這就為我們搭建自動化測試環(huán)境提供了很大的便利。
Docker對虛擬化、云計算甚至軟件開發(fā)過程都有革命性影響。Docker并不是lxc的替代品。它帶來內核特性的基礎之外,還提供了多種更強大的功能[3]。
跨機器的便攜式部署 Docker定義了一種格式,用于將應用程序及其所有依賴關系捆綁到單個對象中,該對象可以傳輸?shù)饺魏螁⒂胐ocker的機器,并在那里執(zhí)行,并保證暴露給應用程序的執(zhí)行環(huán)境相同。Docker定義了這些機器的特定設置的抽象,使得完全相同的docker容器可以在許多不同的機器上以不同的配置運行。運維人員能夠直接部署封裝的軟件鏡像來進行測試和發(fā)布,大大節(jié)省了運維人員搭建環(huán)境,排查環(huán)境問題的時間。
持續(xù)版本控制 Docker擁有類似git的功能,可用于跟蹤容器的連續(xù)版本,檢查版本之間的差異,提交新版本,回滾等。歷史記錄可以回溯到上游開發(fā)者。出現(xiàn)問題可以快速回滾,docker鏡像啟動比虛擬機鏡像要快速。
組件可復用 各個鏡像可以通過不同的組合產(chǎn)生不同的鏡像。例如,你準備好一個python的初始環(huán)境,可將其作為5個不同應用程序的基礎。
高資源利用率 虛擬機是硬件層面的隔離,docker是與宿主機共享一個系統(tǒng)內核的,沒有額外的系統(tǒng)開銷。所以docker充分利用了系統(tǒng)資源,利用率要比虛擬機高很多。Docker還擁有一定的資源隔離與限制的能力,保證了各個應用之間不會相互影響。
多云平臺支持 目前docker的云提供商有Amazon Web Services,Digital Ocean,Microsoft Azure,SoftLayer,Packet。代碼提供商有GitHub,Bitbucket。使用docker,可以在多種云上部署,用戶不會被單一云平臺捆綁。未來也會有更多的云平臺支持docker。
更好的移植性 就像JVM一樣,一次構建,到處運行。docker可以在任意的服務器上運行,為持續(xù)集成提供高效可靠的運行環(huán)境。
簡單輕量、易于理解 Docker原意為搬運集裝箱的碼頭工人,標志就是馱著集裝箱的鯨魚??梢钥闯黾b箱就是容器,開發(fā)者安裝和部署docker就像裝卸集裝箱一樣簡單,可在短時間內快速入門。
共享 作為一款開源軟件,docker繼承了開源軟件的理念。世界上所有用戶都可以通過訪問docker hub上傳或下載到共享的鏡像資源。目前官方托管的鏡像從mysql,mongo,tomcat,nginx到redis等等應有盡有。國內比如阿里云也提供了來自云端的容器鏡像服務,為開發(fā)者提供了便利。
當然,docker使用至今,也有一些問題。比如問題排查困難,docker作為較為底層的軟件,出了問題之后,對使用軟件的用戶來說解決困難。安全性不足,容器確實會受到資源的隔離和控制。但其實還有一些內核資源未被隔離開,會產(chǎn)生安全上的漏洞。
2.2 docker與VM比較
Selenium官方宣稱并發(fā)測試時可以使用VW或者單獨的物理機來充當服務器。那我們來對比一下VM和docker。VM的虛擬化技術可以讓一臺物理服務器或者“主機”上運行多個操作系統(tǒng)和應用,簡化IT架構,讓服務器滿負荷運行以提高服務器利用率,節(jié)約了物理成本。這種特性粗看和docker十分的相似。觀察圖1,與docker相比,VM在虛擬化技術之上還需要有一個操作系統(tǒng)才能運行應用。
⑴ VM模擬出了CPU、內存、IO設備等。Docker則不同,docker在docker引擎之上可以直接運行應用,省去了安裝操作系統(tǒng)的步驟,更便捷更節(jié)約成本。但docker并不是虛擬機。虛擬機可以在底層模擬出各種硬件設備。Docker使用的是宿主機的內核,docker性能無限接近原生,那是因為docker用的就是系統(tǒng)本身的進程。
⑵ VM支持幾乎所有操作系統(tǒng),docker僅支持部分版本的系統(tǒng)。例如Windows要求64bit Windows 10 Pro build 10586以上版本,centOS版本要求是7.X。
⑶ 隔離性方面,VM有單獨的操作系統(tǒng)、CPU等,隔離性較好。Docker通過namespace實現(xiàn)資源隔離,通過cgroups實現(xiàn)資源限制。但是它不能阻隔其他程序占用自己的資源。
⑷ 安全性方面,VM已有較為成熟的生態(tài)環(huán)境和安全解決方案。docker目前無法識別具體執(zhí)行指令的用戶,只要有一個用戶持有執(zhí)行docker的權限,那么該用戶就可以對docker的容器進行所有的操作,不管該容器是否是由該用戶創(chuàng)建。這會有誤刪的情況發(fā)生,存在一定的安全風險。
⑸ 啟動耗時上,由于docker是直接使用宿主機的內核,通常只需要幾毫秒就能啟動應用。虛擬機的啟動需要幾秒,甚至好幾分鐘。
⑹ 運行性能同上,docker減少了額外的資源消耗。VM需要更多的系統(tǒng)開銷。
⑺ 部署難度上,docker構建環(huán)境快速輕量,在部署運維上的優(yōu)勢有目共睹,VM比之不如。
⑻ 鏡像大小上,VM安裝操作系統(tǒng),通常需要百兆至千兆,而docker只需要幾兆。
⑼ 系統(tǒng)支持量上,VM單機部署幾十個已經(jīng)是極限,docker可以支持上千個。
3 軟件自動化測試環(huán)境利用docker部署
配合自動化測試任務的展開,測試計劃的執(zhí)行需要選擇測試環(huán)境并且注冊節(jié)點。這些測試環(huán)境往往是手工配置的。如果使用docker就可以免去手工配置的過程,使用腳本自動拉取docker鏡像,一鍵配置測試環(huán)境。2015年在selenium conf[4],Marek Jastrzebaki演示了利用docker構建selenium grid的例子。
4 軟件自動化測試環(huán)境搭建中應用docker的分析與實現(xiàn)
如果用VM部署selenium grid測試環(huán)境,則需要安裝操作系統(tǒng),安裝某個版本的瀏覽器和java環(huán)境等等。針對測試計劃要求的操作系統(tǒng)版本和瀏覽器版本部署更多的VM上。這樣很耗費成本,配置效率也不高。如果用docker部署環(huán)境就可以改善這些問題。首先開發(fā)人員進行統(tǒng)一的配置,確保各個環(huán)境部署鏡像的一致性。其次可以將需要安裝的組件打包成一個鏡像,方便管理和維護。然后鏡像提交新版本或者回滾也在一處維護,出問題可以快速排查和重啟。資源利用率會有很大提升。一個服務器上可以負荷更多的有效進程,而不用負荷額外的操作系統(tǒng)。以下是具體的安裝過程。
Docker版本要求[5]MAC下需要在OS X El Capitan 10.11以上,windows下需要64bit W indows 10 Pro 10586以上,centOS需要在7以上。安裝Docker Toolbox可以簡化安裝步驟。
⑴ 安裝docker。
⑵ 安裝docker compose。
⑶ 拉取selenium hub節(jié)點。
docker pull selenium/hub
⑷ 拉取chrome節(jié)點。
docker pull selenium/node-chrome
⑸ 拉取firefox節(jié)點。
docker pull selenium/node-firefox
⑹ 編寫selenium啟動腳本docker-compose.yml。包括啟動hub,注冊firefox節(jié)點和chrome節(jié)點的功能。測試用例可以調用已注冊節(jié)點。
⑺ 啟動腳本。
docker-compose up -d
⑻ 伸縮節(jié)點數(shù)量。
docker-compose scale chrome=5 firefox=5
⑼ 觀察啟動日志。
docker logs hub
⑽ 前臺查看節(jié)點啟動情況。
http://localhost:4444/grid/consol
5 結束語
軟件自動化測試技術的發(fā)展得益于計算機科學的總體發(fā)展。本文引入開源引擎docker,介紹了一種軟件自動化測試環(huán)境的部署優(yōu)化。Docker提供了“一次構建,到處運行”的特性,極大地簡化了selenium grid的部署,實踐證明新的部署方式切實減少了服務器資源的消耗和配置服務的時間,值得在業(yè)界推廣。
鑒于自動化測試較為脆弱的環(huán)境,后期可以對該環(huán)境增加功能,以提高系統(tǒng)的可度量性和自維護性。例如:監(jiān)控環(huán)境功能,監(jiān)視自動化測試環(huán)境部署的健康狀況,測試人員可以隨時查看環(huán)境是否啟動成功,或者超時等。智能重啟功能,對啟動失敗或者超時的環(huán)境,制定智能重啟的策略,并提供手動重啟的入口。
參考文獻(References):
[1] Selenium-Grid[EB/OL].http://docs.seleniumhq.org/docs/07_selenium_grid.jsp,2017.
[2] JamesTurnbull,特恩布爾,李兆海等.第一本Docker書[M].人民郵電出版社,2015.
[3] 浙江大學SEL實驗室.Docker容器與容器云[M]. 人民郵電出版社,2015.
[4] How do I build a better selenium grid with docker?[EB/OL].https://speakerdeck.com/marekj/seconf2015-docker-selenium,2015.
[5] Docker Documentation[EB/OL].https://docs.docker.com/,2017.