符偉杰 ,邵 軍 ,褚澤帆 ,張志堅(jiān) ,宗 澤
(1.水利部南京水利水文自動(dòng)化研究所江蘇南京210012;2.水利部水文水資源監(jiān)控工程技術(shù)研究中心江蘇南京 210012)
緊密圍繞水資源高效開發(fā)利用的國家目標(biāo),針對(duì)復(fù)雜多變條件下的大江大河流量在線監(jiān)測(cè)技術(shù)問題[1-2],研發(fā)適合于國內(nèi)實(shí)際情況的時(shí)差法流量監(jiān)測(cè)裝置,滿足水資源智能調(diào)度及精細(xì)化管理要求[3]。web遠(yuǎn)程管理控制系統(tǒng)為時(shí)差法流量監(jiān)測(cè)裝置提供水位、流速、流量、視頻安防監(jiān)控等的顯示與控制功能,同時(shí)實(shí)現(xiàn)聲道距離、安裝高程、當(dāng)前水位、安裝角度等的參數(shù)設(shè)置,提升時(shí)差法流量監(jiān)測(cè)裝置遠(yuǎn)程數(shù)據(jù)實(shí)時(shí)顯示、設(shè)置等的操作便捷性、統(tǒng)一管理性[4-5],因此,時(shí)差法流量監(jiān)測(cè)裝置web遠(yuǎn)程管理控制系統(tǒng)必須經(jīng)過嚴(yán)格緊密的功能性測(cè)試,不斷優(yōu)化完善邊界條件、多瀏覽器支持等異常情況,確保其能夠穩(wěn)定可靠的運(yùn)行在各個(gè)環(huán)境條件,為開發(fā)及管理人員提供技術(shù)決策支撐。
selenium是目前web和app自動(dòng)化測(cè)試的主要框架,用于創(chuàng)建衰退測(cè)試檢驗(yàn)軟件功能和用戶需求,包含測(cè)試的錄制(Selenium IDE)、編寫及運(yùn)行(Selenium Remote Control)和測(cè)試的并行處理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript編寫,因此可運(yùn)行于任何支持JavaScript的瀏覽器,selenium不僅支持對(duì)瀏覽器原生API進(jìn)行操作,也同時(shí)支持javascript[6-8]。由于其能夠完全模擬手動(dòng)操作行為,故被應(yīng)用于自動(dòng)化測(cè)試系統(tǒng)中,理論上只要測(cè)試用例寫得足夠詳細(xì)完全能夠取代人為測(cè)試,特別在回歸測(cè)試環(huán)節(jié)有效減少人力成本,提高測(cè)試效率。Selenium Standalone Server的Grid分布式布局的基本結(jié)構(gòu)如圖1所示,selenium hub類似于一個(gè)中央處理器,selenium node是遠(yuǎn)程需要執(zhí)行測(cè)試的節(jié)點(diǎn),selenium Test case是運(yùn)行在hub上的測(cè)試用例[9-10]。
圖1 Grid分布式布局結(jié)構(gòu)圖
對(duì)于單版本瀏覽器,selenium可以在一臺(tái)PC機(jī)器上完成測(cè)試,由于一臺(tái)PC機(jī)器上不能同時(shí)安裝2種不同版本的瀏覽器,針對(duì)多版本的瀏覽器兼容性測(cè)試有3種解決方案,第一種方案是增加真實(shí)PC機(jī)的數(shù)量,但是這在管理、資源及成本上造成不必要的浪費(fèi);第二種方案是在vm虛擬機(jī)上裝有多個(gè)操作系統(tǒng),每個(gè)操作系統(tǒng)安裝不同版本的瀏覽器,但是這消耗了PC機(jī)大量系統(tǒng)資源,可操作性不高;取代這兩種方案的第3種方案是基于docker容器引擎技術(shù)[11],在docker不同的容器中安裝不同版本的瀏覽器且注冊(cè)到selenium的hub節(jié)點(diǎn)上,這樣既節(jié)省系統(tǒng)資源開銷與成本也方便管理。
Docker使用客戶端-服務(wù)器(C/S)架構(gòu)模式,使用遠(yuǎn)程API來管理和創(chuàng)建docker容器,其容器通過docker鏡像來創(chuàng)建。容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶?duì)象與類。docker daemon一般在宿主主機(jī)后臺(tái)運(yùn)行,等待接收來自客戶端的消息[12]。docker是一個(gè)由Go語言寫的程序,運(yùn)行的容器(Linux containers,LXCs)實(shí)現(xiàn)了一種應(yīng)用程序級(jí)別的隔離,由直接操作虛擬主機(jī)(VM),轉(zhuǎn)換到操作程序運(yùn)行的容器上。其把特定的應(yīng)用裝在容器內(nèi),通過Linux Container技術(shù)將App變成一種標(biāo)準(zhǔn)化的、可移植的、自管理的組件,這種組件可以在你的Laptop上開發(fā)、調(diào)試、運(yùn)行,最終非常方便和一致地運(yùn)行在生產(chǎn)環(huán)境下,其應(yīng)用架構(gòu)設(shè)計(jì)如圖2所示。
圖2 docker架構(gòu)設(shè)計(jì)圖
docker鏡像是一個(gè)只讀的鏡像,通過鏡像ID進(jìn)行識(shí)別,一個(gè)docker鏡像可以構(gòu)建于另一個(gè)docker鏡像之上,根據(jù)測(cè)試環(huán)境的需要,這種層疊關(guān)系可以為多層,鏡像繼承了他們的父層鏡像的所有屬性和設(shè)置。將負(fù)責(zé)管理容器的docker服務(wù)端和控制服務(wù)端進(jìn)程的docker客戶端安裝部署在同一臺(tái)PC機(jī)器上,使用Xshell或者CRT連接docker后,執(zhí)行命令docker pull selenium/hub,系統(tǒng)自動(dòng)從鏡像源中下載最新的selenium/hub鏡像,構(gòu)建selenium自動(dòng)化測(cè)試環(huán)境,接著執(zhí)行命令docker pull selenium/node-firefox,將自動(dòng)從鏡像源中下載最新selenium/node-firefox鏡像。在Xshell中輸入指令docker images,Xshell或者CRT遠(yuǎn)程連接器提示selenium/node-firefox(firefox瀏覽器鏡像)及selenium/hub[13-15],顯示如圖3所示信息,則說明docker鏡像安裝并部署成功。
圖3 鏡像提示信息
構(gòu)架分布式測(cè)試環(huán)境必須先啟動(dòng)一個(gè)selenium hub,在docker中啟動(dòng)命令如下:
docker run-p 5555:4444-d--name'selenium_hub'selenium/hub
具體的參數(shù)說明如下:
1)run:通過鏡像啟動(dòng)一個(gè)容器。
2)-p:端口映射,5555是容器宿主機(jī)的端口,4444是容器的端口。說明把容器的4444端口開放給docker主機(jī)的5555端口,從而實(shí)現(xiàn)通過docker主機(jī)的5555端口來訪問容器。
3)-d:docker后臺(tái)運(yùn)行的容器,運(yùn)行 serverstandalone-2.52.0.jar后啟動(dòng)一個(gè)socket程序,使得在xshell當(dāng)前窗口進(jìn)行其他指令操作。
4)--name:指定容器運(yùn)行的別名,如果不指定則隨機(jī)生成一個(gè)。
5)selenium/hub:要運(yùn)行的鏡像文件。
啟動(dòng)selenium hub后,需要啟動(dòng)node,在Xshell中啟動(dòng)node命令如下:
docker run-P-d--link selenium_hub:hub sele nium/node-firefox
具體的參數(shù)說明如下:
1)run:通過鏡像啟動(dòng)一個(gè)容器。
2)-P:隨機(jī)生成映射端口號(hào),啟動(dòng)selenium hub指令中的-p是指定特定的端口號(hào),此處并不需要知道容器內(nèi)部的端口號(hào),但端口號(hào)不可沖突。
3)-d:docker后臺(tái)運(yùn)行的容器。
4)--link:依賴容器selenium_hub。
5)selenium_hub:hub:selenium_hub是通過 selenium/hub鏡像啟動(dòng)容器的別名;hub一定要寫成hub或者HUB,寫成其他啟動(dòng)失敗。
6)selenium/node-firefox:node的鏡像。
啟動(dòng)selenium/hub與selenium/node后,運(yùn)行指令docker ps有如圖4所示提示信息,則說明啟動(dòng)成功。
圖4 selenium hub及node啟動(dòng)成功提示信息
在docker啟動(dòng)elenium hub及node后,在瀏覽器中輸入如下ip地址:
http://192.168.99.100:5555/grid/console,有如圖 5所示瀏覽器提示信息,從圖中可以看到hub中有個(gè)新注冊(cè)的裝有firefox瀏覽器且版本號(hào)為50.0的node節(jié)點(diǎn),接著可以通過docker客戶端運(yùn)行腳本來測(cè)試Grid分布式布局是否部署成功。
圖5 瀏覽器提示信息
當(dāng)從docker鏡像倉庫中下載的鏡像不能滿足項(xiàng)目需求時(shí),必須構(gòu)建符合項(xiàng)目測(cè)試特征的docker鏡像。時(shí)差法流量監(jiān)測(cè)裝置web遠(yuǎn)程管理與控制系統(tǒng)需要各版本瀏覽器支持中文顯示,為了保證鏡像的健壯性,需重新編寫Dockerfile,制作中文鏡像。修改Dockerfile,使得內(nèi)容如下:
修改Dockerfile文件內(nèi)容后,保存退出,切換至Dockerfile文件目錄執(zhí)行指令docker build-t selenium/my_node-firefox,即可完成docker中文鏡像的制作,為該容器下載中文包及相應(yīng)的字體后,有效避免測(cè)試過程中出現(xiàn)中文亂碼。
在鏡像獲取過程中,獲取的鏡像版本號(hào)為50.0版本,但是為了集群測(cè)試每臺(tái)機(jī)器上不同版本的firefox,需要?jiǎng)?chuàng)建不同版本的鏡像[16]。構(gòu)建firefox瀏覽器版本為47.0.2的鏡像,修改添加Dockerfile內(nèi)容如下:
添加不同版本瀏覽器鏡像支持后,切換到Dockerfile文件目錄中運(yùn)行指令:docker build-t selenium/node-firefox47.0.2,經(jīng)過一段時(shí)間后建立一個(gè)firefox版本為47.0.2的鏡像,當(dāng)run這個(gè)鏡像來啟動(dòng)容器時(shí),注冊(cè)進(jìn)hub的就是這個(gè)版本的瀏覽器,并且可通過使用docker ps命令可以查看所有正在運(yùn)行中的容器列表。
通過在docker容器引擎中制作多個(gè)鏡像來啟動(dòng)不同的容器,并在每個(gè)容器實(shí)現(xiàn)不同的軟件需求,從而開發(fā)一套時(shí)差法流量監(jiān)測(cè)裝置web分布式多容器測(cè)試系統(tǒng),解決基于Selenium Standalone Server的Grid分布式布局需多臺(tái)PC機(jī)同時(shí)配合的難題,節(jié)約運(yùn)營成本,降低系統(tǒng)運(yùn)行開銷,同時(shí)實(shí)現(xiàn)時(shí)差法流量監(jiān)測(cè)裝置web自動(dòng)化測(cè)試系統(tǒng)統(tǒng)一、集中管理。
參考文獻(xiàn):
[1]周斌.國家重點(diǎn)研發(fā)計(jì)劃“水資源高效開發(fā)利用”重點(diǎn)專項(xiàng)2016年度申報(bào)情況解析[J].中國環(huán)境管理,2017(2):101-104.
[2]我國加大水資源高效開發(fā)利用研究[J].地質(zhì)裝備,2016(3):5-6.
[3]全力推進(jìn)水資源管理專項(xiàng)整治行動(dòng)構(gòu)建科學(xué)、規(guī)范、高效的水資源開發(fā)利用環(huán)境[N].濟(jì)寧日?qǐng)?bào),2010-06-01(A02).
[4]楊劍.基于FPGA超聲波流量計(jì)的設(shè)計(jì)[D].武漢:武漢理工大學(xué),2012.
[5]秦偉,李娟,劉東.在線超聲波流量監(jiān)測(cè)系統(tǒng)設(shè)計(jì)及其應(yīng)用[J].計(jì)算機(jī)測(cè)量與控制,2017(2):32-34,53.
[6]馬亞明.基于selenium的前端自動(dòng)化云測(cè)試平臺(tái)[D].南京:南京大學(xué),2015.
[7]柴旭琴.基于Selenium的Web應(yīng)用性能測(cè)試系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西安建筑科技大學(xué),2012.
[8]黃華林.使用Selenium進(jìn)行Web應(yīng)用自動(dòng)化測(cè)試的研究[J].電腦開發(fā)與應(yīng)用,2012(4):54-56.
[9]吳伶琳.基于Selenium的軟件自動(dòng)化測(cè)試的研究與應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2013(2):65-68.
[10]辛慶.基于Selenium的Web UI自動(dòng)化測(cè)試[D].廣州:華南理工大學(xué),2012.
[11]馬越,黃剛.基于Docker的應(yīng)用軟件虛擬化研究[J].軟件,2015(3):10-14.
[12]張建,謝天鈞.基于Docker的平臺(tái)即服務(wù)架構(gòu)研究[J].信息技術(shù)與信息化,2014(10):131-134.
[13]羅明宇.基于Selenium的安全自動(dòng)測(cè)試技術(shù)的研究與實(shí)現(xiàn)[D].廣州:廣東工業(yè)大學(xué),2015.
[14]王艷艷.基于Selenium的前端自動(dòng)化測(cè)試平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[D].青島:山東大學(xué),2016.
[15]王艷梅.基于Selenium的Web應(yīng)用測(cè)試框架的開發(fā)[D].上海:上海交通大學(xué),2014.
[16]耿朋,陳偉,魏峻.面向Dockerfile的容器鏡像構(gòu)建工具[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2016(11):14-21.