黃 松,王廷永,孫金磊,陽 真,洪 宇
(陸軍工程大學 指揮控制工程學院,江蘇 南京 210007)
眾包測試是軟件測試與眾包模式相結合產生的新興軟件測試模式,其特點是測試周期短、測試成本低、測試多樣性等[1,2]。眾包測試流程如圖1所示。

圖1 眾包測試流程
但眾包測試也存在局限性,現有眾測平臺主要根據測試報告間接評估測試任務完成質量[2]。但是眾測人員提交測試報告的質量參差不齊:一方面,由于眾測人員具有趨利性,導致提交的測試報告包含大量隨意甚至虛假內容[3,4];另一方面,Hao等[5]指出眾測報告呈現數量大、重復率高、質量低的特點,這給評估測試質量帶來極大困難與挑戰。
由于測試成本和測試門檻等問題,眾測人員無法撰寫規范化的測試用例。在現有測試用例生成的研究中,基于用戶操作序列的測試用例生成方法適合以黑盒GUI測試為主的眾測場景。此方法無需眾測人員具有專業編程和手動撰寫測試用例的能力,可有效規避測試成本和測試門檻等問題,但需要眾測人員的操作序列作為數據來源。不同于專業測試人員的測試過程,眾測人員的測試過程中存在測試步驟不一致、冗余操作過多等問題,因此直接將眾測人員操作作為測試用例輸入會生成大量冗余測試用例,降低測試用例質量。因此需要針對性研究如何在眾測中實現對操作序列的有效記錄,目前這方面研究比較匱乏。
本文提出一種適用于眾測的GUI軟件操作序列記錄方法,首先在眾測過程中記錄眾測人員的操作信息,以截圖方式保存待測軟件狀態,然后對獲得的操作信息進行聚類和基于時間劃分方式處理,最后按照時間順序完成操作序列的記錄。
目前針對軟件測試的操作序列研究有:侯津等[6]提出的基于控件路徑的跨設備UI自動化測試方法,解決操作序列中跨設備查找控件失敗的問題。張文燁[7]利用深度學習的目標檢測提高操作序列中控件查找的準確度。Zhengrui等[8]通過設計的MobiPlay工具實現在應用層捕獲用戶輸入數據,在服務器環境下重現用戶操作,并將其應用到移動應用軟件的白盒與黑盒測試。Coppola等[9]實現從現有的基于Android軟件布局的測試方法中衍生出基于圖像匹配的Android軟件截圖測試腳本并在軟件布局發生變化時動態修正測試腳本。然而,上述研究只研究專業測試人員生成操作序列存在問題,未考慮類似眾測場景下生成操作序列存在問題,無法直接應用于眾測場景。
為實現操作序列生成,需要獲得眾測過程中測試人員的操作信息?,F有針對操作序列的研究中,基于坐標信息方法能夠保存測試人員觸發的事件信息,而基于圖像的方法能夠有效利用待測軟件的圖像信息。因此本文將兩種方法結合,通過基于坐標信息的方法捕獲測試人員使用GUI待測軟件時基本全局事件,包括鼠標事件、鍵盤事件以及觸摸事件等,記錄事件類型、對應坐標、相對時間以及待測軟件的實時截圖等。通過圖像匹配的方法提取待測軟件截圖包含的操作信息。
圖2給出了方法的基本框架,面向眾測的操作序列記錄方法主要分為3步:

圖2 方法框架
(1)眾測操作信息獲取。通過記錄待測軟件基本事件信息以及獲取事件觸發時待測軟件的截圖來構建包含事件描述和待測軟件截圖的操作信息;
(2)眾測操作信息分類。首先將截圖進行數據預處理,然后采用基于CNN的圖像特征提取方法提取截圖的圖像特征,最后借助聚類方法實現對眾測操作信息劃分;
(3)眾測操作序列記錄。首先使用基于時間劃分方法優化聚類結果提升分類精確度,然后依據時間先后完成最終操作序列生成。
在本節中,主要介紹眾測操作信息的獲取方法。本文定義眾測操作信息由操作行為描述和待測軟件截圖組成。使用基本全局事件機制獲取操作行為描述,將眾測人員的測試過程分解成一個個單獨操作行為,每個操作行為對應一個基本全局事件,將基本全局事件信息作為眾測人員的操作行為描述。使用基于窗口事件截圖機制獲取待測軟件觸發事件窗口的實時截圖。
基本全局事件監聽是指使用工具對另一個軟件進行基本事件監聽??紤]知識產權因素,企業提交給眾測平臺的待測軟件一般是不附帶源碼,目的是希望利用眾測模式完成待測軟件的黑盒測試。眾測平臺無法對待測軟件進行修改,這導致眾測平臺想要獲取眾測人員對待測軟件的操作信息難度增大。而基本全局事件監聽是解決眾測平臺難以獲取操作信息困境的有效方法,此方法能夠不需要對待測軟件進行修改的同時監聽待測軟件基本事件。
基于窗口事件截圖是指特定窗口觸發事件時獲取截圖?;诖翱谑录貓D方法一方面能夠避免侵犯眾測人員隱私,另一方面有助于減少眾測人員操作其它軟件影響獲取待測軟件截圖的質量。本文采用捕獲待測軟件的窗口句柄來實現對窗口的事件監聽,捕獲待測軟件與測試人員交互時圖像狀態。但是基于窗口事件截圖方法存在以下3個問題:
(1)軟件窗口渲染方式的差異可能會導致當前顯示操作的窗口與實際響應事件的窗口不一致;
(2)對選定待測軟件窗口句柄進行事件監聽時無法監聽彈出窗口事件;
(3)監聽的窗口在測試待測軟件期間存在被銷毀的可能性。
針對第一個問題,本文解決方法是遍歷窗口樹以檢查事件發生窗口可視屬性,若不可視則檢查其父窗口的可視性,若父窗口不可視則檢查當前窗口(即原窗口的父窗口)的父窗口可視性,直至找到可視窗口,對此可視窗口進行截圖。
針對第二個問題,本文解決方法是通過對待測軟件的窗口樹循環判斷彈出窗口與監聽窗口是否為父子節點關系,若在待測軟件的窗口樹中彈出窗口與監聽窗口存在父子節點關系,則可將監聽對象改為彈出窗口。
針對第三個問題,本文解決方法是保存開始監聽時待測軟件窗口樹,若監聽窗口被銷毀,而事件發生窗口與原監聽窗口在保留的窗口樹中存在父子節點關系,則將監聽窗口句柄改為事件發生窗口的句柄,并更新保留的待測軟件窗口樹。
在解決窗口監聽問題后,可以通過記錄眾測人員測試待測軟件觸發的事件來獲取操作信息:首先通過窗,包括事件名稱,事件相對坐標以及發生的相對時間,以Json格式保存;其次記錄觸發待測軟件事件時刻對應窗口的狀態,以截圖方式保存;最后將各個眾測人員操作信息上傳至眾測平臺,經過匯總獲得眾測場景待測軟件的原始操作信息。流程如圖3所示。

圖3 眾測操作信息獲取
在獲取眾測原始操作信息后,并不能直接將其作眾測人員的操作序列。原因是眾測人員測試過程中不可避免會產生一些冗余操作,這些冗余操作雖然不會降低眾測人員的測試質量,但會導致最終記錄的測試操作序列過于繁瑣,影響后續生成的測試用例質量。不同眾測人員的冗余操作往往各異,而關鍵操作對應的操作信息是相似的,因此可以通過分類方法實現對冗余操作和關鍵操作區分。由于無法得知操作對應標簽,也無法針對全部類型的測試操作進行人工標注,因此采用無監督分類方式。在原始操作信息中同一個操作行為對應的待測軟件截圖總是相似的,因此通過對待測軟件的截圖進行聚類操作可以實現對冗余和關鍵操作的劃分。完成聚類后每個類別包含著測試環節中必要的操作步驟有效描述。
此階段的工作分為3個環節:
(1)待測軟件截圖的數據預處理。去除截圖失敗和截圖未完成圖片和對數據進行歸一化等;
(2)基于深度學習的特征提取。相比傳統的圖像處理方法,基于深度學習的CNN模型能夠更深入提取圖像信息。Caron等[10]指出使用更好的特征提取模型可獲得更好的聚類效果。在眾多可用于圖像提取模型中,He等[11]提出的殘差網絡ResNet在不同圖像數據集上取得比AlexNet、VGGNet和GoogLeNet網絡更好的分類效果,這表明殘差網絡ResNet提取的圖像特征更豐富。在考慮模型復雜度和待測軟件的截圖本身語義信息不明顯后,本文采用ResNet50網絡完成特征提取工作;
(3)基于聚類的操作截圖分類。相比其它聚類算法對類別值設置較為敏感,層次聚類算法無需設置類別值,聚類效果穩定,更適合類別未知的待測軟件截圖分類。
使用圖像聚類對操作信息分類可能存在一個問題:劃分到同一類的截圖實際可能隸屬于不同操作行為,例如在實際操作序列中,按鈕被點擊多次,多數情況下此按鈕觸發事件時待測軟件的截圖是相似的,所提取的截圖特征也是極其相似,因此以圖像特征作為數據輸入的聚類無法區分不同操作的相似截圖。
為了解決相似截圖可能隸屬于不同操作行為的問題,本文通過操作信息中時間信息對聚類結果進一步優化,這是因為屬于同一個測試步驟相似圖片的相對時間信息是相近的,而屬于不同的測試步驟的相似圖片其時間信息相距甚遠。
眾測操作行為本質上是眾測人員的使用待測軟件的行為屬于用戶行為。眾測人員在測試待測軟件時其操作行為的時間分布是具有規律性,屬于同一個測試操作的相似圖片在時間上相近,而屬于不同的測試步驟的相似圖片其時間信息相距甚遠。Sarker等[12]研究結果表明對用戶的時間序列進行合理劃分能夠有效描述用戶軟件使用行為。因此本文將收集到眾測人員的測試操作信息按照時間進行劃分,依據時間分布對聚類結果優化。
文雨等[13]通過實驗驗證在統計學意義上用戶行為特征符合正態分布。眾測場景下獲取的操作信息是大量眾測人員相互獨立的測試行為的描述,服從高斯混合模型。眾測用戶行為的時間特征分布也服從高斯混合模型。具體來說,大量眾測人員的獨立的操作行為在同一個測試步驟的發生相對時間是相近的,因此利用高斯混合模型(GMM)劃分操作時間可以解決不同操作因截圖相似被劃分為同一類問題,高斯混合模型的公式如下
(1)
相比于高斯分布概率公式,k代表數據符合高斯分布模型數,同時每個高斯分布有自身μi和σi參數,以及對應的權重參數φi,權重之和為1。
此階段工作分為以下4步:
(1)對每個類中操作截圖對應時間的信息進行訓練,找到該類中操作截圖時間信息的多個高斯分布模型;
(2)獲得每個高斯分布模型的均值和標準差后,依據3-Simga準則獲取每個高斯分布的數據。3-Simga準則是指數據分布在(μ-3σ,μ+3σ)區間內的概率為99.74%,超出此范圍的可能性僅占不到0.3%,認為是小概率事件,屬于異常數據,需要剔除;
(3)使用各個高斯分布的數據對聚類結果進一步劃分,使得每個高斯分布的數據對應一個操作步驟。
(4)按照時間順序完成眾測操作序列記錄。
如圖4所示,操作序列中每個操作步驟由步驟號、相對時間、操作類別、待測軟件、操作描述以及操作截圖組成。

圖4 操作序列示例
本節設計實驗對操作序列記錄方法有效性進行分析,選取了Windows平臺6款規模不同、類型不同的GUI軟件作為實驗對象。其中Knowte是一款筆記軟件,使用WPF框架開發。Speedtest是一款測速軟件,使用UWP框架開發。Ktplayer是一款開源的簡易音樂播放軟件,使用JavaFX框架開發,VNC Viewer是一款遠程訪問的商業軟件,使用QT框架開發。Battle是一款游戲對戰平臺的商業軟件,使用QT框架開發,6款待測軟件詳細信息見表1。

表1 實驗對象
由于每個軟件的軟件規模不一,對應的功能模塊數不同,實驗中對軟件的測試任務也不相同。6款軟件涵蓋目前主流的GUI開發框架,具有一定代表性。
3.2.1 評估準則
通過回答下面3個問題評估本文提出的操作序列記錄方法的有效性。
本文方法獲取的操作信息是否能夠有效反映眾測人員的測試操作?
本文選取的聚類方法是否滿足于獲取的操作信息分類要求?
本文記錄的操作序列是否覆蓋對應測試任務必要操作步驟?
3.2.2 實驗驗證
為了研究本文方法獲取的操作信息是否有效反映眾測人員的測試操作,本文采用QTP商業軟件以及UFT商業軟件與本文的記錄方法進行比較。本文實驗環境:操作系統為Windows10,CPU為Intel Core i9-9900K@ 3.60 GHz,運行內存64 G,GPU為2080Ti 11 G。為了減少誤差影響,實驗過程中對每個對象程序的每個測試任務執行10次。實驗中使用以下定義的平均操作覆蓋率AOCR(average ope-rations coverage rate)來衡量不同錄制方法對眾測人員測試操作的覆蓋度
(2)
其中,real-operations代表實際的操作集合,record-operations代表執行測試任務中被錄制下的操作集合。結果見表2。

表2 平均操作覆蓋率
實驗結果顯示本文方法取得不低于89%的平均覆蓋率,除Battle軟件以外,其它軟件的平均覆蓋率均高于QTP,主要原因是QTP對當下不斷出現的GUI框架支持度不夠,如UWP、JavaFX等框架。UFT軟件是QTP軟件的改進版,支持更多GUI框架,但仍然不支持UWP軟件的操作信息獲取。相比于UFT,本文方法在knowte軟件、KtPlayer軟件、VNC Viewer軟件以及Battle軟件的平均操作覆蓋率要低于UFT的平均操作覆蓋率,但是二者差距較小。經過人工驗證,本文方法也覆蓋眾測人員測試過程的關鍵步驟,相比于UFT是商業收費軟件,本文方法更適合眾測場景。因此,上述實驗結果驗證了本文方法實現了對眾測人員測試操作的高覆蓋率。
為了研究本文選取的聚類方法是否滿足于獲取的操作信息分類要求,實驗選取了兩種特征提取方法和4種聚類方法進行對比,特征提取方法是傳統圖像特征提取方法SIFT算法和深度學習特征提取方法ResNet50,聚類方法是K-Means聚類方法、DBSCAN聚類方法、GMM(Gaussian mixture model)聚類方法和HC(hierarchical clustering)聚類方法。對比實驗結果見表3。

表3 聚類效果對比
選用F1score作為評估指標,F1score是Precision和Recall加權調和評估,常用于評估分類結果。Precision、Recall和F1score公式如下所示
(3)
(4)
(5)
其中,TP指相似操作截圖劃分到一類的數量,FP指不相似操作截圖被劃分到一類的數量,FN指相似的操作截圖被劃分到不同類的數量,Precision表示精確率,指在劃分為同一類的操作截圖中實際為同一類的操作截圖比例。Recall表示召回率,指在所有實際為同一類的操作截圖中,被正確劃分為同一類的比例。F1score表示精確率和召回率的綜合,該指標越高代表聚類效果越好。
實驗結果表明,相比傳統特征提取方法,使用基于ResNet50的特征提取方法的聚類算法比使用傳統特征提取方法SIFT的聚類效果有了明顯提升,從各種傳統特征提取方法精確率不足30%提升至接近70%,K-Means算法和層次聚類算法尤為明顯,而實驗結果還發現基于高斯混合模型的聚類方法在傳統特征提取方法上召回率最高,但精確度只有21%,更換為ResNet50提取方法后,實驗失敗,原因是計算復雜度太高,需要遠超實驗機器實際的內存空間。在實驗中還發現傳統特征提取方法普遍能夠達到較高召回率而ResNet50最高不超過65%,基于DBSCAN算法存在截然相反的召回率,使用ResNet50提取特征導致分類結果過多,是實際近3倍,因此不考慮使用此算法。
綜合來看基于K-Means算法和層次聚類算法使用ResNet50提取特征后有更高精確度和較高的召回率,F1score相比其它聚類算法更高。而K-Means算法本身需要指定聚類的數量,而實際過程中無法確定劃分類別數而層次聚類不要求指定聚類數量,相比之下更合適用作操作信息劃分,因此基于層次聚類方法更適合眾測操作信息的劃分。
為了研究本文方法記錄的操作序列是否覆蓋對應測試任務必要操作步驟,在實驗中,對6款測試對象的操作信息進行聚類并基于時間劃分優化,最后按照時間先后對優化結果組合操作序列。采用平均重現率來評估本文獲得的操作序列對完成測試任務所必須的操作步驟的覆蓋程度,平均重現率ARR(average reproduction rate)定義如下
(6)
其中,reproduce-operation代表經人工驗證可以完成測試任務的操作序列,record-operations代表記錄的操作序列數,n代表實驗次數。平均重現率越高,表示本文所提出方法更能有效記錄眾測操作序列。實驗結果如圖5所示。

圖5 不同待測軟件的平均重現率
實驗結果表明本文方法記錄的操作序列的平均重現率達到不低于90%,針對軟件規模較小的Speedtest以及Ktplayer能夠實現97%以上的重現,而對于VNC Viewer和Battle也可以達到不低于90%的平均重現率。由于VNC Viewer涉及用戶遠程界面,同一測試操作對應的待測軟件截圖相差較大,影響了最終操作序列的平均重現率。Battle軟件由于軟件規模較大,獲取的操作信息存在更多遺漏,導致最終操作序列的平均重現率低于其它待測軟件的平均重現率。但總體上本文提出的眾測操作序列記錄方法能夠有效覆蓋對應測試任務必要操作步驟。
針對眾測過程中眾測人員測試步驟不統一、冗余操作過多的問題,提出一種面向眾測的GUI軟件的操作序列記錄方法。該方法通過獲取眾測過程中工人的操作信息以及在測試時待測軟件的圖像狀態信息,經過聚類和時間劃分實現操作序列記錄。相關實驗驗證該方法從大量操作信息中提取出必要操作步驟并實現對測試人員操作序列的有效覆蓋。下一步工作包括:①將本文方法應用到更多程序中,檢測方法的有效性,并加以完善;②使用本文方法記錄的操作序列作為數據來源,研究眾測場景下基于操作序列的測試用例生成。