作者:閑魚技術-金喏
1.前言
閑魚品質團隊一直緻力于傳遞高品質的app給使用者,目前随着AI技術不斷發展,TensorFlow大熱,也給測試手段帶來了更多種可能,本文接下來給大家介紹AI在閑魚測試的一點實踐:如何應用AI技術通過圖檔找bug。
2.模型選型
不需要了解業務就能發現的bug主要有整體頁面空白、部分控件顯示異常和文本異常這幾類。對于整體空白圖檔,發現它們的共同特征是比較明顯:大面積空白或者中心區域報錯,是以選擇使用TensorFlow搭建的簡單CNN模型來識别正常圖檔和異常圖檔。對于文本異常這類包含亂碼的圖檔,則是用OCR+LSTM建立了一個簡單的漢字識别模型來識别圖檔中的文本内容後判斷是否存在亂碼。
訓練以上模型的樣本則來源于bug曆史截圖和mock的正向資料樣本。
3.模型重訓練——提高模型識别準确率
初始模型在訓練時樣本有限,但随着app不停更新疊代,圖檔檢測樣本數量的逐漸增多,會出現某些新頁面被錯誤分類,要解決這類誤報問題,亟需加入模型重訓練。
顯然靠人肉啟動模型重訓練并替換舊模型成本太高,是以在前端實作了個勾選圖檔去重訓練的入口,通過Jenkins定時任務,讀取所有重訓練圖檔并執行重訓練腳本,并把舊模型替換成新生成的即可。經過幾輪自動疊代後模型識别準确率有大幅提升。
4.圖檔處理——提升結果的人工甄别效率
4.1特殊截圖
有些截圖可能是存在大面積空白,但從業務角度上來說這類圖檔是正确的,比如搜尋中間頁。此類若不處理,每次都會被識别為異常圖檔上報,浪費大家check的時間,若放入模型進行重訓練又有導緻模型不收斂的風險。為了解決這類圖檔,維護了一個圖庫,對模型識别為異常的圖檔,會與圖庫中的圖檔進行對比,如果與圖庫中任意一張相似度超過設定門檻值,即認為該圖檔可被忽略不用上報。
4.2圖檔去重
目前周遊截圖任務為了保證頁面上所有元素都取到,單次周遊任務會至少通路同一個頁面兩次;同時周遊時,為了友善頁面上下文分析,會對點選元素用紅框标記。這帶來了一個問題:待識别圖檔集中,同一個頁面會有多張重複截圖、且同一頁面上可能會在不同的地方有紅框标記。人工檢驗大量重複圖檔識别結果難免視覺疲勞,是以展示去重後的結果可以大大提升人工甄别效率,減少成本。
4.2.1解決辦法
圖檔數量大,且不确定這次周遊截圖了多少不同頁面時,可以使用層次聚類算法解決這個問題。本文采用的是自底向上的聚類方法,即先将每一張截圖分别看成一個簇,然後找出距離最小的兩個簇進行合并,不斷重複到預期簇或者滿足其他終止條件。
4.2.2實作[2]
1)計算圖檔之間的距離
先将圖檔轉換成w*h*3維向量,把向量間的歐式距離作為圖檔之間的距離,圖檔越相似,距離越小。
def get_pic_array(url,w,h):
file = cStringIO.StringIO(urllib2.urlopen(url).read())
img = Image.open(file) # PIL打開圖檔
img=img.resize((w, h))
try:
r, g, b, k = img.split() # rgb通道分離,相容4通道情況
except ValueError:
r, g, b = img.split()
# 獲得長度為(w*h)的一維數組
r_arr = np.array(r).reshape(w * h)
g_arr = np.array(g).reshape(w * h)
b_arr = np.array(b).reshape(w * h)
#将RGB三個一維數組(w*h)拼接成一個一維數組(w*h*3)
image_arr = np.concatenate((r_arr, g_arr, b_arr))
return image_arr
一次app周遊得到的n張圖檔要完成聚類,先單張圖檔按照上述處理後,再整體拼接成 n*(w*h*3)的矩陣,做為樣本集。
2)計算簇之間距離的方法
single:兩個簇中距離最近的兩個樣本的距離作為這簇間的距離
complete:兩個簇中距離最遠的兩個樣本的距離作為這簇間的距離
average:兩個簇間樣本兩兩距離的平均值決定,解決個别異常樣本對結果對影響,但計算量比較大
ward:離差平方和,計算公式較複雜,要想了解具體計算公式和其他計算方法見
計算簇之間距離的方法。
通過嘗試後發現ward效果比較好,是以最終選用ward作為計算簇之間距離的方法。
Z = linkage(X, 'ward')
執行上述語句後,聚類完成。
3)臨界距離選擇
該值直接影響聚類的效果,臨界距離過小,會導緻某些相似圖檔不能聚集到一類,臨界距離過大,又會導緻不是同一個頁面的圖檔聚在一起,是以如何選一個合适的距離非常重要。
實驗發現,如果圖檔被頁面異常模型識别為異常圖檔時,往往這類圖檔之間的相似性越高,為了不錯誤聚類不同的異常頁面,分别對識别為異常和正常的圖檔進行聚類,并且異常類的臨界距離會設定更小一點。
5.總結與展望
目前該工具對整體頁面異常的識别效果較好,文本異常的識别準确率也在豐富樣本的過程中不斷提升。
接下來我們會內建LabelImg工具,用TensorFlow搭建SSD模型來識别控件異常的圖檔,此外元素/文字布局錯亂等問題頁面識别、頁面操作預期結果識别也在不斷嘗試中。使用圖檔處理和錯誤識别技術,作為品質保證的一種方法,我們會持續探索下去。
參考文檔:
[1]圖檔聚類計算:
https://haojunsui.github.io/2016/07/16/scipy-hac/