你一定想不到,實現一個AI自動化測試工具就這麼簡單!(基礎篇)
作者:閒魚技術-金喏
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:離差平方和,計算公式較複雜,要想了解具體計算公式和其他計算方法見 ofollow,noindex" target="_blank">計算簇之間距離的方法 。
通過嘗試後發現ward效果比較好,所以最終選用ward作為計算簇之間距離的方法。
Z = linkage(X, 'ward')
執行上述語句後,聚類完成。
3)臨界距離選擇
該值直接影響聚類的效果,臨界距離過小,會導致某些相似圖片不能聚集到一類,臨界距離過大,又會導致不是同一個頁面的圖片聚在一起,所以如何選一個合適的距離非常重要。
實驗發現,如果圖片被頁面異常模型識別為異常圖片時,往往這類圖片之間的相似性越高,為了不錯誤聚類不同的異常頁面,分別對識別為異常和正常的圖片進行聚類,並且異常類的臨界距離會設定更小一點。
5.總結與展望
目前該工具對整體頁面異常的識別效果較好,文字異常的識別準確率也在豐富樣本的過程中不斷提升。


接下來我們會整合LabelImg工具,用TensorFlow搭建SSD模型來識別控制元件異常的圖片,此外元素/文字佈局錯亂等問題頁面識別、頁面操作預期結果識別也在不斷嘗試中。使用圖片處理和錯誤識別技術,作為質量保證的一種方法,我們會持續探索下去。
參考文件:
[1]圖片聚類計算: https://haojunsui.github.io/2016/07/16/scipy-hac/