余錦潤(rùn),楊丹君,李波波
(浙江中控技術(shù)股份有限公司,杭州310053)
自動(dòng)化測(cè)試是軟件測(cè)試的一個(gè)重要分支,相對(duì)于手動(dòng)測(cè)試而言,自動(dòng)化測(cè)試是將人的測(cè)試行為通過(guò)代碼框架轉(zhuǎn)化成機(jī)器的測(cè)試行為,可用于各種測(cè)試范疇,主要強(qiáng)調(diào)的是通過(guò)工具結(jié)合自己的測(cè)試策略來(lái)輔助測(cè)試,可以全自動(dòng),也可以半自動(dòng),節(jié)省了大量的人力、時(shí)間和硬件資源,也同時(shí)提高了測(cè)試效率。一般來(lái)說(shuō),滿足3 個(gè)條件就可以對(duì)項(xiàng)目采取自動(dòng)化測(cè)試[1]:軟件需求變動(dòng)周期長(zhǎng)、項(xiàng)目周期長(zhǎng)、自動(dòng)化腳本可以重復(fù)利用。
在自動(dòng)化測(cè)試概念上,敏捷大師Mike Cohn 提出測(cè)試金字塔模式[2],并衍生出分層自動(dòng)化測(cè)試概念,區(qū)別于傳統(tǒng)的自動(dòng)化測(cè)試概念(基于產(chǎn)品UI 層面的自動(dòng)化測(cè)試,黑盒測(cè)試),分層自動(dòng)化測(cè)試倡導(dǎo)從黑盒單層到黑白盒多層的體系。
UI 層是用戶使用產(chǎn)品的入口,在傳統(tǒng)的測(cè)試模型中,大多數(shù)研發(fā)團(tuán)隊(duì)執(zhí)著于通過(guò)UI 進(jìn)行全面的測(cè)試,甚至投入大量的人力成本進(jìn)行手工測(cè)試,而自動(dòng)化實(shí)現(xiàn)難度也極大。進(jìn)行分層后,自動(dòng)化測(cè)試的設(shè)計(jì)就有了針對(duì)性,也因此誕生了許多針對(duì)UI的測(cè)試工具和框架。本文主要研究了UI 自動(dòng)化測(cè)試的相關(guān)方法,結(jié)合Electron 應(yīng)用的測(cè)試難點(diǎn)分析了位圖識(shí)別技術(shù)Sikulix 以及Opencv 算法的優(yōu)勢(shì),并進(jìn)行自動(dòng)化模塊的設(shè)計(jì)和工程項(xiàng)目的實(shí)際應(yīng)用,證明了其實(shí)用價(jià)值。
在常規(guī)桌面客戶端測(cè)試中,市面上流行很多測(cè)試工具,比如惠普公司開發(fā)的UFT 工具,商業(yè)軟件Ranorex 等,均提供了強(qiáng)大的錄制回放功能,能完成大部分測(cè)試需要。在Web 界面測(cè)試中,離不開兩大神器——ChromeDriver 和WebDriverIO 的支持,正因?yàn)檫@兩個(gè)驅(qū)動(dòng),Web 的自動(dòng)化測(cè)試進(jìn)行起來(lái)游刃有余,并且和很多框架相結(jié)合進(jìn)行高級(jí)別的測(cè)試需求定制,比如Selenium 等。由于Web 的流行,Electron 應(yīng)用程序也開始興起,Electron 是由Github 開發(fā),用HTML,CSS 和JavaScript 來(lái)構(gòu)建跨平臺(tái)桌面應(yīng)用程序的一個(gè)開源庫(kù)。Electron 通過(guò)將Chromium和Node.js 合并到同一個(gè)運(yùn)行時(shí)環(huán)境中,并將其打包為Mac,Windows 和Linux 系統(tǒng)下的應(yīng)用,節(jié)省了重復(fù)開發(fā)的資源[3]。針對(duì)于以上桌面端的UI 自動(dòng)化測(cè)試,目前主流的方法分為基于傳統(tǒng)框架的UI 自動(dòng)化測(cè)試和基于Spectron 框架的UI 自動(dòng)化測(cè)試。
傳統(tǒng)框架主要分為基于代碼API 層面的對(duì)象獲取法和基于圖片像素識(shí)別的對(duì)象獲取法2 種?;诖aAPI 層面的對(duì)象獲取法得益于開發(fā)人員給出了獲取方式,測(cè)試時(shí)操作精準(zhǔn),但從另一個(gè)角度來(lái)說(shuō),消耗大量的人力開發(fā)和處理API;基于圖片像素識(shí)別方式主要通過(guò)對(duì)整個(gè)軟件界面進(jìn)行二進(jìn)制比對(duì),類似于大多數(shù)測(cè)試工具中的錄制-回放功能,但是這樣的缺陷更加明顯,在不同分辨率,不同瀏覽器渲染方式下,坐標(biāo)點(diǎn)引起的偏移和失真,會(huì)導(dǎo)致識(shí)別出錯(cuò),降低了其可移植性。在一些高級(jí)的錄制-回放功能中,增加了元素id 識(shí)別,但很多非常規(guī)應(yīng)用,比如Electron 加殼應(yīng)用,或者開發(fā)修改過(guò)代碼的定制應(yīng)用,其元素id 是無(wú)法識(shí)別的。
上文提到Electron 應(yīng)用是Web 加殼的桌面客戶端形式的一種應(yīng)用,會(huì)導(dǎo)致其Web 元素id 被隱藏,常規(guī)的測(cè)試工具無(wú)法識(shí)別其元素id,官方給出了一個(gè)開源框架Spectron,通過(guò)JS 語(yǔ)言進(jìn)行測(cè)試代碼的編寫,可以調(diào)用WebDriverIO 的API,但版本有限制。另一方面,Spectron 專門針對(duì)Electron,無(wú)法作為常規(guī)的測(cè)試工具,擴(kuò)展性弱,且使用JS 語(yǔ)言,對(duì)于以Python 為基礎(chǔ)語(yǔ)言的測(cè)試人員而言,學(xué)習(xí)成本也比較高。
Sikulix 是麻省理工學(xué)院的一個(gè)開源項(xiàng)目,是一種全新的UI 自動(dòng)化測(cè)試模式,俗稱“上帝之眼”,完全模擬人的操作模式[4],可以利用Opencv 提供的圖像識(shí)別算法進(jìn)行可視化檢索和操作,相對(duì)于以上兩種框架,Sikulix 的優(yōu)勢(shì)在于:①Sikulix 由于其jar 包的獨(dú)立性,完全可以作為API 跨平臺(tái)操作,用Python調(diào)用可以靈活構(gòu)建大型的測(cè)試方案;②Sikulix 的圖像識(shí)別可以解決常規(guī)的錄制-回放工具元素id 無(wú)法識(shí)別問(wèn)題,對(duì)不同分辨率以及不同瀏覽器的渲染方式,Sikulix 不需去操作其坐標(biāo)點(diǎn),且圖片識(shí)別精度可以按照需求設(shè)定,默認(rèn)0.7,解決這種場(chǎng)景的問(wèn)題;③對(duì)于UI 自動(dòng)化測(cè)試,這種方式帶來(lái)的可擴(kuò)展性以及編寫腳本的直觀性,大大降低了測(cè)試人員的上手難度,使測(cè)試人員投入更多的資源去探索性測(cè)試領(lǐng)域。
Sikulix 是以Java 為運(yùn)行環(huán)境,本身提供了一個(gè)簡(jiǎn)易的IDE,并提供了一個(gè)完整的方法庫(kù)模擬測(cè)試人員的操作行為,為了實(shí)現(xiàn)更復(fù)雜的測(cè)試需求,我們不使用其IDE,而應(yīng)用Jython 集成Python 環(huán)境編寫驅(qū)動(dòng)模塊,Sikulix 的工作原理如圖1所示。
圖1 Sikulix 系統(tǒng)框架Fig.1 System framework of Sikulix
可以看到,除了常規(guī)的Java 和Jython 支持外,最重要的一個(gè)底層驅(qū)動(dòng)Opencv 用于圖像對(duì)比和圖片匹配,Opencv 是目前最流行的計(jì)算機(jī)視覺(jué)開源庫(kù),在人工智能領(lǐng)域應(yīng)用完善。Opencv 的圖片對(duì)比指標(biāo)主要有:①均方差MSE 對(duì)比:將兩張尺寸一樣的圖片的所有RGB 三種顏色的像素點(diǎn)進(jìn)行一一對(duì)比;②峰值信噪比PSNR 對(duì)比:將一張?jiān)瓐D和一張壓縮過(guò)的圖片進(jìn)行對(duì)比,用PSNR 值表示其失真程度;③結(jié)構(gòu)相似性SSIM 對(duì)比: 不同于前兩種指標(biāo)只是機(jī)械地通過(guò)線性變換分解圖片信息,SSIM 考慮了人眼的生物特征,基于感知模型(自然圖像具備高度結(jié)構(gòu)化,像素點(diǎn)之間存在相關(guān)性),可檢測(cè)結(jié)構(gòu)信息的差異。SSIM 主要由3 個(gè)模塊組成:結(jié)構(gòu)、對(duì)比度和亮度,在本文中使用SSIM 對(duì)比,其算法流程如圖2所示[5]。
圖2 SSIM 測(cè)量系統(tǒng)Fig.2 SSIM measurement system
將以上3 個(gè)模塊的函數(shù)整合之后,得到SSIM的表達(dá)式:
式中:μx表示x 的均值;μy表示y 的均值;表示x的方差;表示y 的方差;σxy表示x 和y 的協(xié)方差;常數(shù)c1=(k1L)2,c2=(k2L)2是為了避免分母接近0 時(shí)引起系統(tǒng)不穩(wěn)定,其中,L 為圖像灰度級(jí)數(shù)(L=2bit數(shù)-1),k?1,默認(rèn)為k1=0.01,k2=0.03。
Opencv 的圖片匹配原理是在原圖片中找到一塊與模板圖片匹配的區(qū)域,通過(guò)全范圍滑動(dòng)覆蓋原圖像進(jìn)行比較,并將滑動(dòng)時(shí)的度量值存入結(jié)果圖片矩陣中,矩陣的值表示匹配度,矩陣的位置就是匹配位置。Opencv 通過(guò)MatchTemplate 函數(shù)提供了6種匹配算法,如表1所示。
本文使用的是相關(guān)系數(shù)匹配-歸一化版本:采用模板與目標(biāo)圖片像素與每個(gè)圖片的平均值計(jì)算數(shù)量積,正值越大匹配度越高,范圍為[-1,1],如果圖片沒(méi)有明顯的特征,則為0,表示無(wú)法進(jìn)行匹配。
表1 Opencv 匹配算法Tab.1 Matching algorithms of Opencv
針對(duì)UI 的功能測(cè)試,以本公司內(nèi)部的Electron應(yīng)用為測(cè)試目標(biāo),為了覆蓋其完整的功能測(cè)試點(diǎn),本文基于Opencv 的圖片識(shí)別匹配算法以及Sikulix的操作庫(kù)設(shè)計(jì)出如圖3 的系統(tǒng)結(jié)構(gòu)圖。
圖3 系統(tǒng)結(jié)構(gòu)圖Fig.3 Systematic structure diagram
前端UI 事件 在圖片素材給定的基礎(chǔ)上,通過(guò)鼠標(biāo)的點(diǎn)擊操作,鍵盤的輸入以及快捷鍵操作,界面狀態(tài)的檢測(cè),截圖保存等操作,完成一套UI 自動(dòng)化測(cè)試的流程事件。
優(yōu)化層 在整體流程無(wú)重大邏輯錯(cuò)誤的基礎(chǔ)上,對(duì)于素材圖片,過(guò)程圖片,結(jié)果圖片的匹配度有一個(gè)預(yù)先設(shè)定的閾值,因?yàn)椴煌愋偷慕貓D,不同類型的區(qū)域,匹配度不盡相同,不能一個(gè)匹配度用于所有情況,必須靈活設(shè)定。本文每輪至少經(jīng)過(guò)3次測(cè)試以確定閾值。只有當(dāng)匹配度大于這個(gè)閾值時(shí),才能進(jìn)行下一步操作。對(duì)于軟件界面,有2 種情況,一種是軟件界面被遮擋,導(dǎo)致識(shí)別不到相應(yīng)圖片,解決方式是采用區(qū)域遍歷的方式,搜索出遮擋區(qū)域,確認(rèn)存在遮擋后,將軟件前置或者強(qiáng)制重啟(極端情況);第二種是軟件崩潰情況,會(huì)彈出error指示框,識(shí)別出指示框界面后,標(biāo)記未通過(guò)測(cè)試,并強(qiáng)制重啟后進(jìn)行下一個(gè)用例測(cè)試。
界面層與功能模塊層 這兩層同屬于測(cè)試核心驅(qū)動(dòng)項(xiàng),針對(duì)整個(gè)界面,結(jié)合各個(gè)功能模塊的操作,完成了UI 自動(dòng)化驅(qū)動(dòng)框架的編寫。其中過(guò)程圖片和更新圖片模塊是動(dòng)態(tài)自動(dòng)更新,對(duì)比點(diǎn)擊功能點(diǎn)的前后截圖,如果相似度小于設(shè)定的閾值,則判斷此處UI 發(fā)生變化,當(dāng)UI 發(fā)生變化時(shí)(核心圖片素材未變),會(huì)以自動(dòng)截圖的形式保存至相應(yīng)的路徑中。
管理組件和運(yùn)行環(huán)境 本文使用RobotFrame work 來(lái)管理整個(gè)測(cè)試工程以及用例的編寫[6],主要的三大核心部分如圖4所示。其運(yùn)行環(huán)境調(diào)用Java虛擬機(jī),Sikulix 的函數(shù)庫(kù),Python 的第三方庫(kù)。
圖4 測(cè)試工程結(jié)構(gòu)圖Fig.4 Testing engineering structure diagram
根據(jù)以上方法,本文的具體實(shí)施測(cè)試對(duì)象是公司內(nèi)部的AppDev 前端程序,是一款使用Electron加殼的應(yīng)用,從圖4所示的測(cè)試工程可以看出:
(1)工程建立了測(cè)試驅(qū)動(dòng)文件夾,用來(lái)管理此應(yīng)用的各個(gè)功能模塊的Python 驅(qū)動(dòng)代碼,比如菜單欄、工具欄等操作代碼;
(2)工程建立了測(cè)試用例文件夾,使用RF 統(tǒng)一管理測(cè)試用例的代碼,可以符合測(cè)試一體化平臺(tái)的運(yùn)行要求;
(3)工程建立了資源庫(kù)文件夾,用來(lái)管理測(cè)試過(guò)程中使用的圖片素材,更新過(guò)程文件等,這也是自動(dòng)化測(cè)試必不可少的判斷要素。
整個(gè)測(cè)試工程搭建了之后,進(jìn)行以下章節(jié)的對(duì)比實(shí)驗(yàn),并分析了實(shí)驗(yàn)結(jié)果。
實(shí)驗(yàn)環(huán)境DELL 5820 工作站,CPU Inter Xeon 3.20 GHz,內(nèi)存8 G,Windows10 64 位中文版操作系統(tǒng),分辨率1920*1080 以及1280*1024
測(cè)試對(duì)象Electron 應(yīng)用
實(shí)驗(yàn)1Opencv 算法的對(duì)比分析
上文提到,本文使用Sikulix+Opencv 圖片識(shí)別和匹配算法進(jìn)行自動(dòng)化框架的集成。我們基于Opencv 的SSIM 圖片對(duì)比算法基礎(chǔ)上,通過(guò)6 種匹配算法遍歷匹配此應(yīng)用的126 個(gè)圖片元素(未優(yōu)化匹配度),結(jié)果如表2所示。
表2 匹配算法對(duì)比Tab.2 Comparison of matching algorithms
從表中可以看出相關(guān)系數(shù)匹配法成功率最高,但是耗時(shí)最多。而圖片識(shí)別率是保證自動(dòng)化進(jìn)行的前提條件,因此使用其歸一化版本,在降低一定耗時(shí)量的同時(shí),識(shí)別率不變。
實(shí)驗(yàn)2主流的UI 自動(dòng)化測(cè)試軟件對(duì)界面的識(shí)別效果
本文的Electron 應(yīng)用界面一共擁有126 個(gè)可點(diǎn)擊以及鍵盤編輯元素,UI 自動(dòng)化測(cè)試的前提是能在不同分辨率下識(shí)別這126 個(gè)元素,將本文設(shè)計(jì)的系統(tǒng)方案和主流的UI 自動(dòng)化工具進(jìn)行對(duì)比實(shí)驗(yàn),并增加了不同分辨率以及匹配度優(yōu)化的實(shí)驗(yàn)數(shù)據(jù)。
圖5 工具的元素識(shí)別數(shù)對(duì)比Fig.5 Element recongnition number comparison of tools
從圖5 可以看出,Ranorex 和UFT 由于無(wú)法識(shí)別到元素id,而自帶的位圖識(shí)別功能效果不佳,導(dǎo)致識(shí)別率很低。Spectron 由于是官方提供的框架,能準(zhǔn)確識(shí)別元素id,因此均能完整識(shí)別。而本文Sikulix 方案,由于基于圖片識(shí)別匹配,在匹配度沒(méi)有進(jìn)行調(diào)整的狀態(tài)下,會(huì)出現(xiàn)少量的錯(cuò)誤,在匹配度優(yōu)化后,能完全識(shí)別,進(jìn)而可以滿足UI 自動(dòng)化的功能測(cè)試要求,且擴(kuò)展性,代碼易讀性方面均優(yōu)于Spectron。
實(shí)驗(yàn)3與人工測(cè)試進(jìn)行對(duì)比
自動(dòng)化和人工測(cè)試的一個(gè)差異就是,自動(dòng)化可以無(wú)差別的進(jìn)行測(cè)試,杜絕了某些情況下人工的疏忽。我們?cè)赗F 框架下運(yùn)行編寫好的148 條冒煙測(cè)試用例,運(yùn)行結(jié)果如圖6所示,同時(shí)參照文字版測(cè)試用例進(jìn)行人工測(cè)試,對(duì)比兩者的時(shí)間,通過(guò)數(shù),fail率等,結(jié)果如表3所示。
圖6 RF 自動(dòng)化測(cè)試結(jié)果Fig.6 RF automation test results
表3 人工與自動(dòng)化測(cè)試的效果比對(duì)Tab.3 Comparison of the effects of manual and automated testing
從表3 中分析可知,就冒煙測(cè)試而言,自動(dòng)化測(cè)試發(fā)現(xiàn)bug 效率明顯高于人工,證明本文方案符合自動(dòng)化測(cè)試的效率要求。
綜合以上實(shí)驗(yàn)結(jié)果,我們可以看出,本文結(jié)合Sikulix+Opencv 的作為底層驅(qū)動(dòng),整個(gè)系統(tǒng)設(shè)計(jì)是可以滿足測(cè)試要求的,對(duì)比了其他工具在electron應(yīng)用的表現(xiàn),通過(guò)低成本的方法可以解決id 元素識(shí)別,分辨率更改,UI 發(fā)生某種改變等一些突出問(wèn)題。在UI 自動(dòng)化測(cè)試領(lǐng)域,本方案擁有上手難度低,擴(kuò)展性強(qiáng)等優(yōu)勢(shì),測(cè)試人員能很快設(shè)計(jì)出對(duì)應(yīng)的測(cè)試框架,是一種實(shí)用性很強(qiáng)的方法。
本文從UI 自動(dòng)化測(cè)試出發(fā),從Electron 應(yīng)用的角度思考,提出一種簡(jiǎn)潔易上手,擴(kuò)展性高的測(cè)試設(shè)計(jì)方案。通過(guò)研究Opencv 圖片識(shí)別和匹配算法,Sikulix 的庫(kù)函數(shù),得出相應(yīng)的底層設(shè)計(jì)思路,并完成了整個(gè)測(cè)試系統(tǒng)框架的設(shè)計(jì)搭建。通過(guò)將本方案和常規(guī)工具進(jìn)行對(duì)比,從不同的角度進(jìn)行冒煙測(cè)試,實(shí)驗(yàn)結(jié)果表明本方案優(yōu)于傳統(tǒng)的測(cè)試工具。
由于本文主要針對(duì)桌面應(yīng)用,且目前只實(shí)現(xiàn)了冒煙用例的編寫,后期復(fù)雜測(cè)試需求提出,可能面臨各種如下的改進(jìn):①過(guò)度依賴截圖,某些功能組合數(shù)很多,單一的圖片識(shí)別方式會(huì)導(dǎo)致圖片數(shù)巨大,此時(shí)需要考慮以圖片識(shí)別輔助接口測(cè)試的方案;②由于是界面展示型測(cè)試,和后臺(tái)數(shù)據(jù)型測(cè)試相比,未知干擾多,包括輸入法兼容,桌面變化等因素,后期需要思考其規(guī)避方案;③目前可以解決UI重排的圖片更新問(wèn)題,但是無(wú)法解決UI 文字,圖形變化問(wèn)題,需要重新手動(dòng)進(jìn)行素材的提取,后期可能要從人工智能的角度出發(fā),探索新的無(wú)人值更新方法。