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