機(jī)器學(xué)習(xí)以及深度學(xué)習(xí)技術(shù)迅猛發(fā)展,很多行業(yè)已經(jīng)從中受益,其中軟件質(zhì)量工程也從中收益良多。機(jī)器學(xué)習(xí)的很多思想和方法可以被用來(lái)解決目前軟件測(cè)試領(lǐng)域的多項(xiàng)難題。本文將會(huì)從測(cè)試設(shè)計(jì)、測(cè)試執(zhí)行和測(cè)試結(jié)果分析三個(gè)維度來(lái)探討目前機(jī)器學(xué)習(xí)在其中的應(yīng)用與創(chuàng)新。其中會(huì)涉及基于機(jī)器學(xué)習(xí)來(lái)識(shí)別 GUI 控件以提高 GUI 自動(dòng)化測(cè)試的效率與穩(wěn)定性、基于路徑權(quán)重來(lái)優(yōu)化測(cè)試設(shè)計(jì)、基于 kNN 之類的算法對(duì)批量失敗測(cè)試用例做自動(dòng)分類處理等多個(gè)案例,希望通過(guò)本文可以引發(fā)你對(duì)機(jī)器學(xué)習(xí)在軟件測(cè)試領(lǐng)域應(yīng)用的更多思考。

  人工智能應(yīng)用概述

  自從 2016 年 AlphaGo 以 4:1 戰(zhàn)勝了圍棋九段李世乭,人工智能的威力在公眾面前得到了充分的展現(xiàn)。這種基于改進(jìn)的蒙特卡洛樹(shù)搜索、殘差卷積神經(jīng)網(wǎng)絡(luò)的強(qiáng)化學(xué)習(xí)系統(tǒng)首次向公眾展示了其超越人類智慧的強(qiáng)大的力量,也使 AI 變得更加廣為人知。之后各行各業(yè)都出現(xiàn)了大量的基于 AI 的產(chǎn)品與應(yīng)用,其中以機(jī)器學(xué)習(xí),自然語(yǔ)言處理,計(jì)算機(jī)視覺(jué)和專家系統(tǒng)為支撐的應(yīng)用層出不窮,大到金融分控模型,無(wú)人駕駛,輿情監(jiān)控與分析,小到智能美顏,智能音箱,無(wú)處不見(jiàn) AI 的應(yīng)用。這類應(yīng)用基本都是通過(guò)軟件來(lái)實(shí)現(xiàn)的,那在軟件研發(fā)的過(guò)程中,AI 技術(shù)是否也有其應(yīng)用場(chǎng)景,并可以幫助來(lái)提高軟件研發(fā)的效能呢?那么我們今天就一起來(lái)探討一下機(jī)器學(xué)習(xí)在軟件測(cè)試領(lǐng)域的應(yīng)用。

  軟件測(cè)試技術(shù)的局限性

  當(dāng)前普遍采用的傳統(tǒng)軟件測(cè)試技術(shù)主要有以下三個(gè)方面的局限性:

  從測(cè)試的執(zhí)行層面來(lái)看,GUI 自動(dòng)化測(cè)試的開(kāi)發(fā)效率與維護(hù)成本高居不下。這個(gè)主要表現(xiàn)在 GUI 控件識(shí)別上,當(dāng)界面發(fā)生變化,或者控件屬性發(fā)生細(xì)微變化的時(shí)候,都會(huì)引發(fā)很多自動(dòng)化測(cè)試用例的維護(hù)工作量,這也正是自動(dòng)化測(cè)試無(wú)法真正成為“銀彈”的一個(gè)主要原因。

  從測(cè)試的設(shè)計(jì)層面來(lái)看,測(cè)試覆蓋率的鴻溝隨著產(chǎn)品功能點(diǎn)的增長(zhǎng)而不斷放大。不知道你沒(méi)有注意到,做軟件產(chǎn)品研發(fā)的企業(yè)都有一個(gè)普遍特點(diǎn),就是產(chǎn)品迭代的初期,一般研發(fā)的效率都比較高,但是隨著產(chǎn)品規(guī)模的不斷擴(kuò)大,軟件功能的逐漸增多,軟件研發(fā)的效率會(huì)變得越來(lái)越差,有時(shí)候很小的改動(dòng)都會(huì)引發(fā)大量測(cè)試需求。這個(gè)主要是由于隨著軟件生命周期的增長(zhǎng),功能點(diǎn)越來(lái)越多,因?yàn)樾碌墓δ芘c現(xiàn)有的功能進(jìn)行交互,當(dāng)功能點(diǎn)的基數(shù)很大的時(shí)候,就會(huì)引發(fā)所謂的“蝴蝶效應(yīng)”,因?yàn)檫@個(gè)過(guò)程中測(cè)試只能線性增長(zhǎng),這中間就會(huì)存在大量測(cè)試無(wú)法覆蓋的盲區(qū)。為此,在快速迭代持續(xù)交付的今天,即使已經(jīng)普遍采用自動(dòng)化測(cè)試技術(shù),軟件測(cè)試人員依然面臨著前所未有的壓力。下面的圖 1 很好展示了這個(gè)現(xiàn)象。

  

image

  圖 1:測(cè)試覆蓋率的鴻溝

  從測(cè)試結(jié)果分析的角度來(lái)看,失敗測(cè)試用例分析并進(jìn)行分類的工作量是很大的,而且時(shí)間成本也很高。注意這里的”分類”僅限于指將失敗的測(cè)試用例分配給某個(gè)開(kāi)發(fā)組來(lái)后續(xù)做進(jìn)一步處理。由于互聯(lián)網(wǎng)產(chǎn)品的自動(dòng)化測(cè)試大規(guī)模普及,所以自動(dòng)化測(cè)試用例的數(shù)量往往比以往任何時(shí)候都多,像 eBay 這樣的大型全球化電商,全回歸自動(dòng)化測(cè)試用例的數(shù)量會(huì)達(dá)到好幾萬(wàn)的數(shù)量級(jí),這個(gè)時(shí)候,哪怕只有 1% 的測(cè)試用例失敗,那么需要分析的失敗測(cè)試用例的絕對(duì)數(shù)量也是好幾百,可想而知這個(gè)如果完全基于人工來(lái)對(duì)失敗用例進(jìn)行分類分發(fā)的工作量是比較大的,很難在分鐘級(jí)別完成,這就勢(shì)必拉長(zhǎng)了整個(gè)測(cè)試的周期,降低了迭代速度。

  針對(duì)上述的三個(gè)局限性,接下來(lái)我們來(lái)看看如何利用機(jī)器學(xué)習(xí)技術(shù)來(lái)優(yōu)化測(cè)試的過(guò)程。

  機(jī)器學(xué)習(xí)在 GUI 自動(dòng)化測(cè)試執(zhí)行領(lǐng)域的應(yīng)用與創(chuàng)新

  機(jī)器學(xué)習(xí)在 GUI 自動(dòng)化測(cè)試執(zhí)行領(lǐng)域的應(yīng)用有很多種不同的思路。這里我介紹其中最主要也是具有實(shí)際落地案例的應(yīng)用。

  第一種是通過(guò)控件的統(tǒng)計(jì)學(xué)特征來(lái)識(shí)別 GUI 對(duì)象,以此來(lái)克服 GUI 控件識(shí)別的穩(wěn)定性難題。早期 GUI 的自動(dòng)化測(cè)試中有一種所謂的“低級(jí)錄制“和”虛擬對(duì)象“功能,是指自動(dòng)化測(cè)試的回放執(zhí)行是通過(guò)頁(yè)面對(duì)象像素的比較以及相對(duì)位置關(guān)系來(lái)完成的,也就是說(shuō)是通過(guò)控件的像素比較來(lái)確定頁(yè)面對(duì)象的,這種技術(shù)雖然簡(jiǎn)單直接,但是其穩(wěn)定性是個(gè)大問(wèn)題,而且也無(wú)法應(yīng)對(duì)今天的終端設(shè)備分辨率的多樣性。那么基于統(tǒng)計(jì)學(xué)特征來(lái)識(shí)別 GUI 對(duì)象則是這個(gè)方法的升級(jí)版本,可以順利解決穩(wěn)定性以及應(yīng)對(duì)不同分辨率的難題,同時(shí)當(dāng)控件的顯示發(fā)生變化的時(shí)候,依然可以做到較高的準(zhǔn)確識(shí)別率。

  那基于統(tǒng)計(jì)學(xué)特征的 GUI 對(duì)象識(shí)別的原理到底是怎么回事呢?這里舉個(gè)簡(jiǎn)單的例子你應(yīng)該就能一下子明白了。比如現(xiàn)在有個(gè)”OK“的按鈕,那么這個(gè)按鈕的深色像素(OK 的字體部分)和淺色像素(按鈕的背景色部分)所占的百分比我們是可以統(tǒng)計(jì)計(jì)算得到的,假定是 8:92,那么當(dāng)這個(gè)按鈕的 ID 或者 XPATH 發(fā)生變化的時(shí)候,或者界面的大小發(fā)生變化的時(shí)候,再或者界面的配色發(fā)生變化的時(shí)候,這個(gè)深色像素和淺色像素的百分比是不會(huì)發(fā)生變化的,那么這個(gè)時(shí)候我們就可以通過(guò)這個(gè)百分比來(lái)唯一確定這個(gè)頁(yè)面對(duì)象了。這個(gè)百分比就是統(tǒng)計(jì)特征值,當(dāng)我們綜合應(yīng)用多個(gè)維度的統(tǒng)計(jì)特征,尤其是高階統(tǒng)計(jì)特征的時(shí)候,我們的控件識(shí)別率就會(huì)非常穩(wěn)定。

  目前網(wǎng)易公司的 AirTest 就是利用了類似的技術(shù)來(lái)完成基于 AI 的控件識(shí)別的,并且能夠很好地應(yīng)對(duì)游戲測(cè)試中的對(duì)象識(shí)別。愛(ài)奇藝則更進(jìn)一步,他們開(kāi)發(fā)的 Aion 更是在控件識(shí)別之前利用機(jī)器學(xué)習(xí)和機(jī)器視覺(jué)對(duì)軟件界面做了圖像切割和子元素提取,進(jìn)一步提高了頁(yè)面對(duì)象的識(shí)別率。

  第二種方式更加直觀,即直接通過(guò)視覺(jué)外觀來(lái)查找頁(yè)面對(duì)象。比如測(cè)試代碼中可以直接指定點(diǎn)擊“購(gòu)物車“而無(wú)需事先提供購(gòu)物車圖標(biāo)的 ID 和 XPATH 等定位信息。比如下面的代碼(圖 2)就是直接通過(guò)”購(gòu)物車“來(lái)完成點(diǎn)擊操作的,其中完全沒(méi)有給出傳統(tǒng)的定位器信息(購(gòu)物車圖標(biāo)的 ID,XPATH 等)。

  

image

  圖 2:直接通過(guò)“ShoppingCart“來(lái)點(diǎn)擊購(gòu)物車圖標(biāo)

  這個(gè)的實(shí)現(xiàn)原理就是利用機(jī)器學(xué)習(xí)來(lái)訓(xùn)練模型,我們會(huì)收集市面上所有的購(gòu)物車圖標(biāo)作為模型訓(xùn)練的樣本數(shù)據(jù)來(lái)完成模型的訓(xùn)練(圖 3),然后就可以直接這個(gè)模型來(lái)實(shí)現(xiàn)各種購(gòu)物車圖標(biāo)的識(shí)別了。目前移動(dòng)應(yīng)用測(cè)試工具 Appium 的一個(gè) AI 插件 Appium Classifier Plugin 就已經(jīng)實(shí)現(xiàn)了類似的功能,并且這個(gè)機(jī)器學(xué)習(xí)模型的訓(xùn)練數(shù)據(jù)是開(kāi)源的,它可以告訴我們,圖標(biāo)代表什么樣的內(nèi)容。我們可以使用此插件根據(jù)其外觀在屏幕上查找圖標(biāo),即通過(guò)視覺(jué)外觀查找元素。這種方法比傳統(tǒng)的頁(yè)面對(duì)象定位靈活得多,因?yàn)?AI 模型經(jīng)過(guò)訓(xùn)練后識(shí)別圖標(biāo)時(shí)無(wú)需任何上下文,并且不要求進(jìn)行圖像樣式的精確匹配,這意味著使用 AI 模型查找“購(gòu)物車”圖標(biāo)可以跨應(yīng)用程序和跨平臺(tái)工作,而無(wú)需擔(dān)心各個(gè)平臺(tái)的細(xì)微差別。

  

image

  圖 3:用作訓(xùn)練樣本集的各種購(gòu)物車圖標(biāo)

  機(jī)器學(xué)習(xí)在測(cè)試設(shè)計(jì)領(lǐng)域的應(yīng)用與創(chuàng)新

  上面講述的利用機(jī)器學(xué)習(xí)來(lái)對(duì) GUI 控件進(jìn)行智能化識(shí)別雖然在自動(dòng)化測(cè)試執(zhí)行層面帶了很大的幫助,但是此種類型的應(yīng)用對(duì)于機(jī)器學(xué)習(xí)來(lái)講,似乎有點(diǎn)“殺雞用牛刀”了。因?yàn)槿绻覀兡軐C(jī)器學(xué)習(xí)用在測(cè)試設(shè)計(jì)上,或者說(shuō)用在縮小測(cè)試范圍上,那么機(jī)器學(xué)習(xí)將會(huì)發(fā)揮更強(qiáng)大的作用,此時(shí)機(jī)器學(xué)習(xí)就像是變形金剛中的能量塊,能夠發(fā)揮舉足輕重的重要作用。可以這樣說(shuō)“機(jī)器學(xué)習(xí)和測(cè)試設(shè)計(jì)結(jié)合將成為交付真正測(cè)試自自動(dòng)化的催化劑”。

  

image

  圖 4:機(jī)器學(xué)習(xí)在測(cè)試設(shè)計(jì)中將發(fā)揮更大的作用

  具體來(lái)講,這里有兩種完全不同的思路來(lái)應(yīng)用機(jī)器學(xué)習(xí)技術(shù)來(lái)幫助測(cè)試的設(shè)計(jì)。

  第一種思路是通過(guò)機(jī)器學(xué)習(xí)來(lái)訓(xùn)練一個(gè)機(jī)器人,使其成為某個(gè)領(lǐng)域的測(cè)試專家。比如通過(guò)大量的訓(xùn)練,“登錄”測(cè)試機(jī)器人可以比人類更好地對(duì)登錄功能進(jìn)行全方位的測(cè)試,“訂單“測(cè)試機(jī)器人可以進(jìn)行全方位的訂單系統(tǒng)測(cè)試,這種類型的機(jī)器人有點(diǎn)類似于專家系統(tǒng)的概念,能夠根據(jù)訓(xùn)練時(shí)積累的場(chǎng)景來(lái)展開(kāi)測(cè)試。并且你會(huì)發(fā)現(xiàn)這樣一個(gè)事實(shí),幾乎所有的應(yīng)用都是有共性的,比如都有登錄功能,都有搜索功能,都有用戶管理功能等,這也就是說(shuō)我們可以通過(guò)構(gòu)建有限種類的機(jī)器人來(lái)支持大多數(shù)軟件的測(cè)試設(shè)計(jì)工作,而且構(gòu)建的測(cè)試機(jī)器人數(shù)量并不會(huì)隨著應(yīng)用數(shù)量的增長(zhǎng)而增長(zhǎng)。相反,當(dāng)構(gòu)建了一定數(shù)量的測(cè)試機(jī)器人之后,這些機(jī)器人就能應(yīng)對(duì)大量應(yīng)用的測(cè)試了。目前比較知名的 Appdiff 就是利用了這樣的思路來(lái)構(gòu)建 AI 測(cè)試工具的,并且通過(guò)自動(dòng)化地比較前后多次的執(zhí)行結(jié)果,比如 GUI 的變化,頁(yè)面性能的變化等來(lái)自動(dòng)化地發(fā)現(xiàn)潛在問(wèn)題(圖 5)。

  

image

  圖 5:通過(guò)自動(dòng)化地比較前后多次的執(zhí)行結(jié)果來(lái)發(fā)現(xiàn)軟件中的異常

  第二種方式是先構(gòu)建被測(cè)系統(tǒng)的模型,這里又可以分為兩種不同的種類的模型。一種是基于被測(cè)系統(tǒng)頁(yè)面流轉(zhuǎn)的模型(圖 6),這個(gè)模型反映的是被測(cè)系統(tǒng)各個(gè)頁(yè)面之間的跳轉(zhuǎn)關(guān)系,比如 A 頁(yè)面可以到 B 頁(yè)面,然后 B 頁(yè)面可以到 C 頁(yè)面,那么這個(gè)三個(gè)頁(yè)面就對(duì)應(yīng)圖論中的三個(gè)節(jié)點(diǎn),然后 A 可以到 B,那么 A 到 B 之間就存在一條有向邊,同樣的,B 和 C 之間也有一條有向邊。另一種是基于后端微服務(wù)架構(gòu)的系統(tǒng)架構(gòu)圖(圖 7),反映的是后端各個(gè)微服務(wù)之間的相互調(diào)用關(guān)系網(wǎng)絡(luò)。

  有了這種基于圖論的模型后,接下來(lái)會(huì)通過(guò)應(yīng)用的后臺(tái)日志系統(tǒng)來(lái)分析頁(yè)面和頁(yè)面之間的跳轉(zhuǎn),或者是微服務(wù)和微服務(wù)之間的調(diào)用,這個(gè)過(guò)程通常需要借助大數(shù)據(jù)分析系統(tǒng)的能力,通常使用 Hadoop 和 MapReduce 來(lái)完成,然后對(duì)于頁(yè)面模型每檢測(cè)到一次頁(yè)面跳轉(zhuǎn),就將有向邊的權(quán)重加一,如果是微服務(wù)模型每檢測(cè)到一次調(diào)用,也將有向邊的權(quán)重加一,然后后面測(cè)試路徑的選擇就會(huì)優(yōu)先覆蓋哪些高權(quán)重的路徑,當(dāng)測(cè)試時(shí)間資源有限的時(shí)候,就只會(huì)覆蓋那些高權(quán)重路徑,以此來(lái)體現(xiàn)軟件測(cè)試中“基于風(fēng)險(xiǎn)驅(qū)動(dòng)“的設(shè)計(jì)思想。同時(shí),我們還可以考慮利用圖論的算法來(lái)合并多個(gè)模型來(lái)形成一個(gè)更大的模型,下面的圖 8 給出了示例。

  

image

  圖 6:基于頁(yè)面流轉(zhuǎn)的圖

  

image

  圖 7:基于微服務(wù)調(diào)用關(guān)系的圖

  

image

  圖 8:利用圖論的算法來(lái)合并多個(gè)模型來(lái)形成一個(gè)更大的模型

  進(jìn)一步設(shè)想,如果我們將上述的測(cè)試設(shè)計(jì)和測(cè)試自動(dòng)化執(zhí)行結(jié)合起來(lái),這樣就能完成一條龍的測(cè)試設(shè)計(jì)和執(zhí)行,并且整個(gè)過(guò)程并沒(méi)有人工的干預(yù)。可想而知,這樣將可以最大化利用機(jī)器的空余時(shí)間來(lái)完成大量測(cè)試用例的設(shè)計(jì)和執(zhí)行,以此來(lái)填補(bǔ)測(cè)試覆蓋率的鴻溝。

  機(jī)器學(xué)習(xí)在測(cè)試分析領(lǐng)域的應(yīng)用與創(chuàng)新

  最后,我們來(lái)看一下機(jī)器學(xué)習(xí)在測(cè)試結(jié)果分析領(lǐng)域的應(yīng)用與創(chuàng)新。前文中我們提到失敗測(cè)試用例分析的工作量很大的,而且時(shí)間成本也很高,那么我們是否可以利用機(jī)器學(xué)習(xí)來(lái)對(duì)失敗測(cè)試用例進(jìn)行自動(dòng)化的分類呢?答案是肯定的,而且這種基于特征值的分類問(wèn)題正是機(jī)器學(xué)習(xí)的強(qiáng)項(xiàng)。

  具體的做法是選擇失敗測(cè)試用例的多個(gè)特征值,然后基于 kNN 之類的算法來(lái)完成失敗用例的自動(dòng)化分類。這里特征值的選擇將直接影響分類的準(zhǔn)確性,同時(shí)需要事先標(biāo)注大量的已知失敗用例的分類結(jié)果來(lái)對(duì) kNN 進(jìn)行訓(xùn)練。kNN 算法的基本原理是“近朱者赤,近墨者黑”,由你的鄰居來(lái)推斷出你的類別。系統(tǒng)的整體架構(gòu)設(shè)計(jì)如圖 9 所示。從圖中可見(jiàn),我們選擇了 Exception Name,Exception Message,Stack Trace 等作為了我們的特征值。

  這里需要要特別注意兩點(diǎn),一是我們必須確保輸入日志的完整性,只有當(dāng)日志包含了完整準(zhǔn)確的信息,才有可能基于此做出準(zhǔn)確的分類,這種對(duì)日志完整性的要求其實(shí)可以看做可測(cè)試性需求,在設(shè)計(jì)階段,作為資深的測(cè)試工程師就應(yīng)該需要關(guān)注這方面的內(nèi)容。二是在 kNN 算法模塊的前面,我們放置了一個(gè) Hard Rule 模塊,這個(gè)模塊和機(jī)器學(xué)習(xí)沒(méi)有任何關(guān)系,而是基于日志中硬編碼的規(guī)則來(lái)對(duì)失敗測(cè)試用例進(jìn)行分類,比如假定日志中拋出異常的模塊是 A,那么我們就應(yīng)該將這個(gè)失敗用例自動(dòng)分配給模塊 A 的開(kāi)發(fā)團(tuán)隊(duì)去做進(jìn)一步的分析,由于這里采用的是確定的硬編碼,所以分類的準(zhǔn)確率在前期就會(huì)很高。而那些無(wú)法通過(guò) Hard Rule 完成分類的用例才會(huì)進(jìn)入到 kNN 的算法模塊,而 kNN 模塊的分類準(zhǔn)確性在很大程度上取決于訓(xùn)練樣本的數(shù)量與質(zhì)量。

  eBay 就是通過(guò)這樣的系統(tǒng)來(lái)完成日常全回歸過(guò)程中失敗用例的分類,基本每天會(huì)自動(dòng)完成超過(guò) 200 個(gè)失敗用例的分類任務(wù),項(xiàng)目前期由于樣本數(shù)量的局限性,所以前期的準(zhǔn)確率在 70% 左右,后期隨著樣本數(shù)量的增加,準(zhǔn)確率維持在 90% 左右。

  

image

  圖 9:基于 kNN 和 Hard Rule 的失敗測(cè)試用例分類系統(tǒng)

  進(jìn)一步,我們可以想象,如果將機(jī)器學(xué)習(xí)應(yīng)用到性能測(cè)試報(bào)告的分析上又會(huì)是什么樣的效果。這個(gè)和目前 AI 在醫(yī)療診斷領(lǐng)域的應(yīng)用非常類似,只是醫(yī)療診斷領(lǐng)域的輸入是各種化驗(yàn)報(bào)告,而性能測(cè)試分析領(lǐng)域的輸入則是各種性能指標(biāo),然后基于機(jī)器學(xué)習(xí)的算法來(lái)發(fā)現(xiàn)這些指標(biāo)之間的連帶關(guān)系,以此來(lái)確定系統(tǒng)的性能瓶頸。

  總結(jié)

  本文介紹了機(jī)器學(xué)習(xí)在測(cè)試執(zhí)行,測(cè)試設(shè)計(jì)以及測(cè)試結(jié)果分析領(lǐng)域的典型應(yīng)用場(chǎng)景,并希望由此拋磚引玉,激發(fā)讀者更多關(guān)于人工智能在軟件測(cè)試領(lǐng)域應(yīng)用的落地實(shí)踐與方法。