【NCTS峰會(huì)回顧】阿里巴圖:基于圖片對(duì)比的頁(yè)面自動(dòng)化測(cè)試實(shí)踐
2019年10月26日,由Testin主辦的第二屆NCTS中國(guó)云測(cè)試行業(yè)峰會(huì)在京召開,此次峰會(huì)以“AI+未來(lái)”為主題,匯聚來(lái)自國(guó)內(nèi)外測(cè)試領(lǐng)域的知名專家學(xué)者、領(lǐng)先企業(yè)決策者、高層技術(shù)管理者、媒體從業(yè)者等,共同探討高端云測(cè)試技術(shù),幫助測(cè)試從業(yè)者了解最前沿行業(yè)趨勢(shì),及最新的行業(yè)實(shí)踐。
會(huì)上,阿里巴巴測(cè)試開發(fā)專家巴圖做《基于圖片對(duì)比的頁(yè)面自動(dòng)化測(cè)試實(shí)踐》的內(nèi)容分享。巴圖對(duì)比了傳統(tǒng)軟件公司和互聯(lián)網(wǎng)公司在軟件發(fā)布流程中有的不同,并指出如下三點(diǎn):
1、頁(yè)面用例的自動(dòng)生成,是阿里測(cè)試智能化探索的一部分;
2、測(cè)試平臺(tái)需要更好的穩(wěn)定性以及自動(dòng)化運(yùn)維;
3、測(cè)試平臺(tái)需要建立Bug閉環(huán),統(tǒng)計(jì)出一段時(shí)間內(nèi)攔截的Bug數(shù)量,這才能體現(xiàn)平臺(tái)的真正價(jià)值。”
以下為巴圖演講實(shí)錄:
大家上午好,我是來(lái)自阿里巴巴CBU技術(shù)部的巴圖,今天為大家?guī)?lái)的議題是基于圖片對(duì)比的頁(yè)面自動(dòng)化測(cè)試實(shí)踐。這里有一些老朋友,可能聽過這個(gè)議題了,我今天盡可能深入的多講一些。
本次議題包括以下五個(gè)議程,首先我們來(lái)看一下對(duì)于傳統(tǒng)軟件公司和互聯(lián)網(wǎng)公司他們的軟件發(fā)布流程有什么不同?首先從發(fā)布周期來(lái)講,傳統(tǒng)軟件公司一般都是以年為單位,比如說(shuō)微軟的Windows、Visual Studio等,都是兩到三年一個(gè)周期發(fā)布,而對(duì)于互聯(lián)網(wǎng)公司迭代是以天為單位,Bug修復(fù)是以小時(shí)為單位。互聯(lián)網(wǎng)公司在Bug修復(fù)成本方面成本比較低,對(duì)于用戶體驗(yàn)來(lái)講會(huì)友好一些,因?yàn)橛泻芏嗳嗽谧鲶w驗(yàn),數(shù)據(jù)的收集難度和接觸用戶成本也比較低。
傳統(tǒng)的軟件公司協(xié)同方式是強(qiáng)流程的,互聯(lián)網(wǎng)公司協(xié)同方式是強(qiáng)平臺(tái)的。在軟件發(fā)布之后,不同公司的QA的職責(zé)也是不一樣的,軟件公司的QA是研發(fā)環(huán)節(jié)最后一環(huán),以盡可能發(fā)現(xiàn)Bug為主要職責(zé),零Bug率是其主要的目標(biāo),QA是公司的流程推動(dòng)者和權(quán)限的制約者;而在互聯(lián)網(wǎng)公司又不太一樣,QA要構(gòu)建一個(gè)全流程的質(zhì)量體系,還是工具平臺(tái)的發(fā)起者和創(chuàng)造者,需要捍衛(wèi)真實(shí)的用戶體驗(yàn)。實(shí)際上現(xiàn)在很多公司都擁有測(cè)試開發(fā)工程師,就是說(shuō)測(cè)試要具備一定的開發(fā)能力,實(shí)際上阿里巴巴的測(cè)試還需要具備一定的算法能力,后面我再細(xì)說(shuō)。
我們BU有一個(gè)三到五年的規(guī)劃,推行的測(cè)試策略是實(shí)時(shí)質(zhì)量,就是運(yùn)行含測(cè)試,實(shí)時(shí)可反饋。一句話總結(jié)就是將質(zhì)量手段以模塊、組件乃至系統(tǒng)化的方式嵌入到業(yè)務(wù)型應(yīng)用當(dāng)中。在我們看來(lái),開發(fā)的代碼和測(cè)試的代碼是兩個(gè)領(lǐng)域,開發(fā)寫的代碼是為業(yè)務(wù)特性服務(wù)的代碼,測(cè)試寫的代碼是為業(yè)務(wù)質(zhì)量服務(wù)的代碼。
今年我們推出了“無(wú)人職守智動(dòng)化”,就是基于變更,提供全流程、多樣化、智能化的無(wú)人職守診斷能力,做到質(zhì)量的實(shí)時(shí)反饋,到現(xiàn)在為止,QA不僅做驗(yàn)收測(cè)試,還要為整個(gè)的產(chǎn)品質(zhì)量做一些診斷,要為全流程環(huán)節(jié)的質(zhì)量做保障。
首先,來(lái)看全流程看護(hù)的層面,我們要在發(fā)布的各個(gè)階段進(jìn)行看護(hù),包括變更前的預(yù)發(fā)階段、變更中的灰度階段和變更后的上線階段。另外,要覆蓋所有的變更,包括代碼類變更、配置類變更和DB類變更,還需要多維度診斷,包括自動(dòng)化診斷、業(yè)務(wù)監(jiān)控診斷和業(yè)務(wù)日志診斷,最終擁有發(fā)布門禁,作為發(fā)布的準(zhǔn)入,如果有質(zhì)量問題會(huì)卡發(fā)布,在預(yù)發(fā)階段和灰度階段進(jìn)行發(fā)布卡口。
這張圖是我們現(xiàn)在的協(xié)同流程,我們會(huì)在把很多的feature創(chuàng)建分支,進(jìn)行并行開發(fā),這些分支在不同時(shí)間進(jìn)行集成和發(fā)布。阿里不同的BU是不同策略,螞蟻那邊是在一個(gè)固定的時(shí)間大家統(tǒng)一來(lái)集成,統(tǒng)一進(jìn)行回歸測(cè)試的。但是對(duì)于新零售的電商業(yè)務(wù),分支都是很難統(tǒng)一一個(gè)時(shí)間發(fā)布的,所以處于高頻集成狀態(tài),這種高頻集成狀態(tài)也為質(zhì)量保障帶來(lái)了很大的挑戰(zhàn)。
我們需要用分層自動(dòng)化模型來(lái)應(yīng)動(dòng)挑戰(zhàn),左邊是一些自動(dòng)化框架&平臺(tái),包括UI層的MyDiff和MYUI,接口層的QTest和Doom,還有線上壓測(cè)的Amazon。分層主要分4個(gè)層面,從上到下來(lái)是展示層、接口層、服務(wù)層和數(shù)據(jù)層,越上層穩(wěn)定性越差,但是自動(dòng)化效果越好。
再看執(zhí)行階段,在生產(chǎn)運(yùn)行階段我們要進(jìn)行故障診斷和線上壓測(cè),預(yù)發(fā)布階段進(jìn)行變更檢測(cè)和預(yù)發(fā)布自動(dòng)化。開發(fā)/功能調(diào)試階段進(jìn)行無(wú)線組件測(cè)試和適配測(cè)試。
剛剛提到了UI層有MyDiff,MyDiff是零成本配置的截圖對(duì)比自動(dòng)化平臺(tái),有以下幾個(gè)特點(diǎn):成本低、預(yù)發(fā)布攔截、全屏與區(qū)域截圖、自定義操作、支持多瀏覽器和多語(yǔ)言。
首先測(cè)試平臺(tái)的發(fā)展要把自身融入到整個(gè)公司的研發(fā)生態(tài)里,所以我們要進(jìn)行一些測(cè)試平臺(tái)和協(xié)同平臺(tái)的對(duì)接,包括蓋亞、Tesla、AONE等平臺(tái)。我們支持10個(gè)以上BU,包括CBU、ICBU、AE,零售通,阿里云,盒馬等。MyDiff提供了任務(wù)管理、結(jié)果管理、執(zhí)行機(jī)管理、數(shù)據(jù)統(tǒng)計(jì)、告警通知和API接口等功能,還具有兩大核心能力:截圖能力和對(duì)比能力。
首先看截圖能力,截圖能力中包含環(huán)境管理、登錄管理、區(qū)域管理和前置操作四種能力:
阿里分四種環(huán)境:日常環(huán)境,預(yù)發(fā)環(huán)境,安全生產(chǎn)環(huán)境和線上環(huán)境。除了線上環(huán)境之外,所有的環(huán)境都需要綁定HOST訪問,所以需要進(jìn)行環(huán)境管理;
阿里一般分很多種登錄系統(tǒng),比如說(shuō)大家經(jīng)常登錄天貓?zhí)詫氂玫?ldquo;淘系登錄”、大麥登錄、內(nèi)網(wǎng)BUC登錄,還有其他的系統(tǒng)自建的登錄,所以,需要完善的登錄管理,在我們統(tǒng)計(jì)過程當(dāng)中90%以上頁(yè)面都需要登錄以后才能訪問的;
區(qū)域管理,我們提供了區(qū)域截圖的能力,在整個(gè)頁(yè)面圖片對(duì)比很難解決用戶的業(yè)務(wù)問題時(shí),用戶可以定義他在一個(gè)頁(yè)面具體截哪一部分,把這部分進(jìn)行截圖對(duì)比;
前置操作可以理解為簡(jiǎn)單的腳本功能,因?yàn)槲覀兊腗yDiff提倡的是零成本配置,所以不會(huì)提供復(fù)雜的腳本能力,復(fù)雜的腳本能力是剛才提到的MIUI提供的。
再看對(duì)比能力,對(duì)比分像素級(jí)和非像素級(jí)兩種。
像素級(jí)對(duì)比,比如PC上頁(yè)面在自動(dòng)化過程當(dāng)中可以控制瀏覽器尺寸,就意味著截圖尺寸是一樣的,可以通過簡(jiǎn)單的像素級(jí)對(duì)比來(lái)檢測(cè)出他們之間有什么差異,對(duì)于無(wú)線端來(lái)講,每一個(gè)手機(jī)的尺寸和分辨率都不相同,所以截圖從像素級(jí)別來(lái)講像素點(diǎn)對(duì)不上,通過傳統(tǒng)像素對(duì)比解決不了問題,我們就進(jìn)行非像素級(jí)的探索。
無(wú)論像素級(jí)或非像素級(jí),都需要提供相似度評(píng)估和差異標(biāo)定。適用的場(chǎng)景包括頁(yè)面回歸測(cè)試、頁(yè)面巡檢、頁(yè)面異常檢測(cè)和適配測(cè)試。其他場(chǎng)景還在探索中。
接下來(lái)看一下MyDiff在整個(gè)自動(dòng)化流程里是如何工作的:
首先,開發(fā)在AONE提交代碼進(jìn)行發(fā)布,預(yù)發(fā)環(huán)境部署后執(zhí)行STC安全掃描、CodeReview和自動(dòng)化測(cè)試,這些測(cè)試都成功后才允許進(jìn)行發(fā)布。我們的GAP平臺(tái)接受AONE的消息,會(huì)檢測(cè)應(yīng)用關(guān)聯(lián)哪些平臺(tái)自動(dòng)化的測(cè)試件,比如說(shuō)UI層MyDiff或MYUI,接口層的DOOM,隨后調(diào)取分層自動(dòng)化的框架,框架執(zhí)行完成以后會(huì)把結(jié)果反饋給GAP,GAP把結(jié)果同步給AONE。如果自動(dòng)化測(cè)試失敗,就需要測(cè)試人員上AONE處理,才能流轉(zhuǎn)到下一步,測(cè)試人員需要判斷這是一個(gè)正常業(yè)務(wù)變更引起的自動(dòng)化失敗還是確實(shí)測(cè)出了Bug。如果是Bug,通知開發(fā)處理,如果不是Bug就進(jìn)行跳過處理。
再看一下技術(shù)實(shí)現(xiàn)架構(gòu):
MyDiff通過Web提供服務(wù),需要有Web集群, Web集群里面應(yīng)用的技術(shù)是阿里開源的Tengine項(xiàng)目和Pandora Boot框架;共享存儲(chǔ)層,由IDB提供的MySQL集群服務(wù)、Tair提供的緩存服務(wù)和阿里云提供的OSS文件存儲(chǔ)服務(wù);Web集群,圖片對(duì)比集群和任務(wù)調(diào)度集群之間是通過消息來(lái)進(jìn)行交互的,這里寫的RockeMQ作為一個(gè)開源方案,在內(nèi)部RockeMQ叫MetaQ,任務(wù)調(diào)度集群和執(zhí)行機(jī)集群通過HTTP進(jìn)行交互。
下面是我們?cè)趫D片對(duì)比算法方面的一些實(shí)踐:
圖片對(duì)比的常規(guī)方案是將一個(gè)原始圖片進(jìn)行灰度化后再生成差值圖,最后進(jìn)行圖片對(duì)比。但是這種方案在頁(yè)面元素輕微平移后,對(duì)比的結(jié)果就不準(zhǔn)確了。我們?cè)谏刹钪祱D后,增加了形態(tài)學(xué)膨脹和形態(tài)學(xué)腐蝕兩步關(guān)鍵操作,膨脹是為了把離散的差值像素點(diǎn)膨脹成一個(gè)一個(gè)連通區(qū)域,連通以后為了避免連通區(qū)域擴(kuò)大再進(jìn)行一次腐蝕,這樣就會(huì)把各個(gè)離散的像素點(diǎn)都組成區(qū)域。
舉個(gè)例子,比如UI上一行文字,如果不進(jìn)行膨脹腐蝕的時(shí)候可能每個(gè)字是一個(gè)區(qū)域,進(jìn)行膨脹和腐蝕處理后一段話是一個(gè)區(qū)域,這樣再進(jìn)行標(biāo)定結(jié)果就會(huì)更準(zhǔn)確。
再來(lái)看我們?cè)诜窍袼丶?jí)圖片對(duì)比的探索,用肉眼看這兩張圖是有一定的差異,第一個(gè)差異點(diǎn)是上面的導(dǎo)航欄,第二個(gè)差異點(diǎn)是右圖下面的一個(gè)toast提示,第三個(gè)是虛擬按鍵。但實(shí)際上對(duì)于計(jì)算機(jī)識(shí)別來(lái)說(shuō),會(huì)認(rèn)為這兩個(gè)圖是完全不一致的,因?yàn)槲覀儊?lái)看兩張圖,首先字體就不太一樣,所以從像素點(diǎn)比較來(lái)看,他們之間是對(duì)不上的。再就是卡號(hào),包括后面“請(qǐng)輸入銀行卡號(hào)”文本框和按鈕尺寸都不一樣,位置也不一樣。這為我們對(duì)比提供了一定的挑戰(zhàn),我們首先會(huì)通過一些預(yù)處理,把一些與業(yè)務(wù)無(wú)關(guān)的圖片剪切掉,然后再進(jìn)行相應(yīng)的元素輪廓提取,把所有的元素提取出來(lái),在兩張圖互相搜索,在另一方搜索不到的元素實(shí)際上就是差異了。
當(dāng)時(shí)我們測(cè)試了幾種算法,包括SSIM、直方圖、PSNR和兩種組合算法,發(fā)現(xiàn)SSIM和感知哈希的組合算法的效果最好,可以達(dá)到86.74%的識(shí)別率,當(dāng)時(shí)用了362組阿里系的樣本。
現(xiàn)在看一下SSIM,自然圖像信息高度結(jié)構(gòu)化,像素信息具有強(qiáng)烈的依賴性,在空間上接近時(shí)依賴性攜帶關(guān)于視覺場(chǎng)景中的對(duì)象結(jié)構(gòu)信息,SSIM算法的優(yōu)勢(shì)在于契合人類的視覺系統(tǒng)的觀察特性,它的實(shí)現(xiàn)主要是通過亮度、對(duì)比度和結(jié)構(gòu)的度量組合來(lái)實(shí)現(xiàn)的相似度的評(píng)估。
接下來(lái)看一下感知哈希的算法,圖像都是二維信號(hào),包括不同頻率的部分,亮度比較小的頻率是低頻的部分,實(shí)際上在左邊的第二張圖就是一個(gè)低頻部分,但是實(shí)際上,通過肉眼來(lái)看低頻部分基本上是這張圖的信息了。再就是亮度變化劇烈的區(qū)域?qū)嶋H上是高頻部分,高頻部分肉眼基本上看到是一塊黑或者一塊藍(lán)的區(qū)域。所以要通過下采樣提取低頻信息。
提到了感知哈希一般都會(huì)與均值哈希進(jìn)行對(duì)比,均值哈希的實(shí)現(xiàn),首先將圖片縮放成8乘8的尺寸,再把圖片灰度化,之后再進(jìn)行二值化求值,然后對(duì)平均值進(jìn)行計(jì)算以后得到哈希指紋。均值哈希實(shí)際上有一些缺點(diǎn),對(duì)它進(jìn)行伽馬校正或直方圖均衡會(huì)影響均值,從而影響hash值?,F(xiàn)在業(yè)界大多應(yīng)用感知哈希,是把圖縮放到32乘32的尺寸,通過離散余弦變換來(lái)獲得低頻部分,離散余弦變換后有一個(gè)8乘8矩陣的低頻部分映射到左上角了,大家看到藍(lán)圖就是高頻的部分,提取出來(lái)左上角8乘8部分算出來(lái)指紋就會(huì)比較穩(wěn)定。
這是最后對(duì)比出來(lái)的實(shí)際結(jié)果,首先進(jìn)行預(yù)處理,識(shí)別出來(lái)上面的導(dǎo)航欄的特征和下面的虛擬按鍵的特征,因?yàn)闀?huì)干擾對(duì)比切掉了。然后兩張圖進(jìn)行元素提取,把一些元素提取出來(lái)后去另外一張圖搜索,搜索不出來(lái)的就是兩張圖的結(jié)構(gòu)差異,這里面可以看到,toast就是差異,對(duì)于右圖來(lái)講toast遮擋的7、8、9、完成等元素,所以會(huì)把位置整體框出來(lái)。
接下來(lái)是卡發(fā)布的實(shí)踐,各家公司協(xié)同平臺(tái)不太一樣,但原理都是一樣的,比如,在我們AONE當(dāng)中可以新建UI測(cè)試,這張圖被遮蓋了實(shí)際上可以選擇MyDiff服務(wù),也可以在這個(gè)流程配置當(dāng)中建立發(fā)布流程的配置,比如預(yù)發(fā)布正式的流程,就是先進(jìn)行預(yù)發(fā)環(huán)境發(fā)布,會(huì)觸發(fā)自動(dòng)化,自動(dòng)化通過以后才進(jìn)行正式發(fā)布。
這里用日常發(fā)布舉例,包括開始、構(gòu)建、日常部署、日常集成測(cè)試、日常驗(yàn)證、結(jié)束。關(guān)鍵點(diǎn)在于日常集成測(cè)試,大家會(huì)把自動(dòng)化關(guān)聯(lián)到這個(gè)環(huán)節(jié),部署完成以后立刻去觸發(fā)集成測(cè)試。這里可以為我們的測(cè)試服務(wù)添加驗(yàn)證點(diǎn),比如,我們?cè)O(shè)置在預(yù)發(fā)需要WebUI測(cè)試100%通過后,才能進(jìn)行下一步。
這實(shí)際上是在AONE當(dāng)中真實(shí)案例,比如預(yù)發(fā)集成測(cè)試過程當(dāng)中失敗了,就已經(jīng)卡住后面的正式構(gòu)建了,需要測(cè)試人員來(lái)上協(xié)同平臺(tái)看一下,點(diǎn)擊查看結(jié)果看一下具體的問題,如果沒有問題就可以進(jìn)行跳過,如果有Bug的話就打回去讓開發(fā)進(jìn)行修改。
上面這張圖是MyDiff列表里的一條任務(wù),總數(shù)是兩個(gè),代表兩個(gè)頁(yè)面,相同的是兩個(gè)的話就證明執(zhí)行通過沒有問題。下面的是一條不通過的結(jié)果,詢報(bào)價(jià)單頁(yè)面里有訂單區(qū)域,我們?yōu)橄嗨贫仍O(shè)置0.98,如果不滿足0.98代表測(cè)試不通過。
這里就是一個(gè)具體的真實(shí)的兩張截圖,上面截圖是在預(yù)發(fā)環(huán)境的截圖,下面這個(gè)是在線上環(huán)境的截圖。我們電商一般都會(huì)有一些大促活動(dòng),大促期間發(fā)貨時(shí)間比日常延長(zhǎng),所以一般會(huì)在大促的過程中進(jìn)行一些文字提示,然后這就是本次發(fā)版與線上之間會(huì)有一些差異,MyDiff平臺(tái)會(huì)直接把他們兩張圖之間的差異標(biāo)出來(lái),這樣測(cè)試人員就可以一眼定位到問題在哪里,也可以判斷這是一個(gè)正常業(yè)務(wù)變更,還是Bug。
現(xiàn)在說(shuō)一下我們對(duì)未來(lái)的規(guī)劃,首先體驗(yàn)要持續(xù)優(yōu)化,降低用戶門檻,因?yàn)槲覀儸F(xiàn)在是在阿里整個(gè)經(jīng)濟(jì)體下進(jìn)行推廣,所以降低門檻有助于讓它生存得更好。再就是流量錄制,今天會(huì)議的主題是“AI+未來(lái)”,現(xiàn)在大家都在探索智能化,阿里接口測(cè)試領(lǐng)域已經(jīng)實(shí)現(xiàn)初級(jí)智能化,我們的智能化定義也在于自動(dòng)生成,接口完全可以通過線上流量生成自動(dòng)化用例,UI也計(jì)劃著使用線上流量來(lái)實(shí)現(xiàn),一個(gè)是智能url推薦,還有就是對(duì)于某一個(gè)頁(yè)面用例自動(dòng)生成。還要在穩(wěn)定性上下工夫,為各個(gè)部門提供穩(wěn)定的服務(wù),做一些自動(dòng)化運(yùn)維的實(shí)踐。平臺(tái)的價(jià)值需要評(píng)估出來(lái),比如,在一個(gè)財(cái)年或者一段時(shí)間內(nèi),能攔截多少Bug,這才是平臺(tái)真正的價(jià)值。我們需要建立Bug的閉環(huán),把我們能攔截的所有的Bug統(tǒng)計(jì)出來(lái)。再就是一些能力優(yōu)化,比如執(zhí)行速度、對(duì)比能力以及算法能力。
我的分享就到這里,謝謝。