我們在衡量一個自動化測試框架的好壞時候,通常一些指標來作為參考標準。比如會要求這個框架的測試程式碼易於開發和維護,穩定性高,滿足要求的執行效率,同時在這些基本需求等到滿足後,我們會要求它具備跨平臺、快應用能力和對 Hybrid 的支援。傳統的測試框架在這些指標上的表現各有優劣。
上圖可以看出,大多數平臺提供的測試框架本身不具備跨平臺能力,雖然 Appium 支援跨平臺,但是他本身是對不同平臺的封裝,而且由於它基於協議的方式,讓測試程式碼的維護性變得比其他框架要差。總結下來,傳統框架相對來說主要存在以下一些不足:
跨平臺能力差
跨應用能力差
穩定性對ID依賴較大
控制元件捕獲成本高
dump 系統檢視樹機率性的失敗
在這個背景下,測試人員其實渴望存在一種支援可見即可得的自動化測試框架,這樣讓測試程式碼的風格更加接近使用者平時的使用習慣。其實之前業內也有一些人在這方面做過一些常識,Sikuli 和網易的 AirTest 都是基於圖片截圖進行匹配的方式,完成的點選和驗證。
Sikuli 是早期 PC 時代的一個測試框架,AirTest 是網易近期推出的,可以說這個框架還是非常不錯,不過基於截圖匹配的方式還是會存在一些不足,比如匹配的準確度不夠,沒有層次結構,以及由於色差或者背景顏色變化帶來的測試程式碼不穩定性,都會降低程式碼可維護性。
其實我們在編寫測試程式碼的時候更希望能夠實現將 “點選'tab'裡面的'會員'”翻譯成 find('tab').find('會員').click() 這樣類似的操作,在進行一些總結之後,我們認為需要完成這樣的轉換,至少需要以下的一些基本能力:
影像切割
影像分類識別
OCR 文字識別
影像相似度匹配
畫素點操作
這些能力有些是傳統的技術手段已經具備的,有些是深度學習剛好給我們帶來的機會。
深度學習發展帶來的機會
這是 ImageNet 的 ILSVRC 挑戰賽的結果,可以發現在 2012 年之前,深度學習還沒有被引入到影像分類中,其結果的準確率一直在 75% 以下難以突破,但是在深度學習被引入以後,影像分類的準確率每年都在攀升,都近期已經達到 98% 甚至 99% 以上的結果。這樣的結果意味著深度學習的影像分類能力已經遠遠超出人類肉眼的分辨能力。
此外還有一項關鍵技術就是 OCR 的能力,在我們做過一些簡單的嘗試以後得到的結果是,文字整句識別的準確率可以達到 93%,單個文字的識別準確率已經可以提升到 98%。雖然召回率並沒有達到足夠的準確率,但是由於我們是先切圖在完成 OCR ,所以準確率對我們來說更為關鍵。
在基礎能力滿足條件的基礎上,於是我們開始嘗試搭建一套支援可見即可得的測試框架,前期方案調研的時候,行業上 UI2Code 這樣一個事情和我們在技術上有很多想通的地方,因為都會將一張圖片逆向生成出一套檢視樹。
PixelToApp
第一個接觸到的是一個基於傳統影像處理技術的 PixelToApp 的專案,這個專案會將一張截圖通過影像處理技術逆向生成一個佈局,並結合切割下來的資源生成一套應用程式碼,其中生成佈局的過程是我們關注的重點。
這個過程首先利用 OCR 識別出圖片中文字區域並標記出來,其次通過影像處理技術提出出圖片中各個元素的位置資訊,再次把這兩個位置資訊進行一個合併,得到一個更加準確的佈局資訊,最後通過一些演算法計算是否存在列表和 Grid 等資訊,從而生成得到的佈局資訊。
這個方案存在的問題比較明顯,1.複雜圖片處理能力不夠2.演算法的泛化能力不足,而且在演算法的瓶頸很難突破。
Pix2Code
另外一個方案是完全基於深度學習的端到端的技術方案。Pix2Code 在 Github 上有一定的知名度,也是利用深度學習進行 UI2Code 一個具有代表性的方案。
這個方案裡,構建了一個如上圖所示的模型,訓練過程中會先將圖片經過 CNN 生成一個特徵向量 p,然後將該圖片對應的佈局描述檔案拆分成一個序列,每個序列先通過一個 LSTM 模組生成一個特徵向量 q,然後將 p 和 q 進行級聯,在通過一個 LSTM 模組,最後通過一個 SoftMax 模組輸出結果,並作為下一個序列的一個輸入。
先不說這個模型設計的好壞,單從準確度上來講肯定是滿足不了需求的,這個專案的準確率只有 60-70%,而且是在一些簡單的介面。當然在這個之後也存在一些其他端到端的方案嘗試,效果比這個要好,但是總體準確率依然不高。
這種完全基於深度學習端到端的技術方案存在一個明顯的問題就是過程不可干預,當結果不理想時往往需要重新設計或優化模型,這個週期相對來說還是比較長的,而且訓練素材的樣本標註成本也會比較高。
Aion 的方案
在對比了傳統影像處理和純深度學習的方案以後,我們採用了將兩種技術進行融合的方案。在我們的方案裡,會先利用影像處理技術進行分塊切割,然後利用影像分類進行分塊的類別識別,再進行子元素的提取,最後利用 OCR 和影像分類技術識別對應的屬性填充到子元素的屬性中,生成一個二級的檢視樹。有了這個二級檢視樹以後,就可以完成團隊想要的點選和驗證操作了。
整個測試用例的執行流程如圖所示,其中場景判斷、分類識別和子元素屬性填充都會應用到 AI 技術。同時在我們的框架上,還無縫相容了傳統框架的使用,以滿足從傳統case切換的問題,和純影像處理沒法處理的場景。
Aion 的深度學習優化
我們選用的 MobileNetV2 模型,這個模型的好處是在滿足一定準確率的情況下,執行效率特別高。在進行訓練的過程中我們碰到的第一個問題就是訓練素材分佈不均勻的情況,這個時候我們採用指令碼生成和採集更多行業 App 資訊的方式,擴充了愛奇藝的資料來源,從而通過篩選實現一個相對均衡的訓練素材。
在提升準確率上,我們從遷移訓練的Top-Layer的方式切換到 Fine-tune的方式,這個過程中依然碰到了訓練素材不足的情況。除此之外團隊還採用多原圖多模型並用的方式提升整體的準確率。
Aion 的優勢與不足
Aion 作為一款基於全新技術方案的測試框架,和傳統框架相比,優勢是比較明顯的。
總結下來,大致如下:
可見即可得,易於理解和開發
對系統框架依賴弱,跨平臺
穩定性強,不用擔心 ID 混淆的問題
分類少,層次淺,檢視捕獲簡單
無縫支援傳統框架
當然也有美中不足,首先準確率需要進一步提升,其次就是一些特徵特別少的元素,如輸入框有時候只有一條線或一個游標作為特徵值,識別出來難度較大。在一些前背景元素融合度比較高的場景下,提取出子元素相對比價難。
寫在最後:
利用 AI 技術的確解決了團隊之前不能解決的問題,Aion 框架的表現整體也是優於現有的其他測試框架的。其實在移動端以及移動端測試還存在更多的場景,能夠利用 AI 解決更多問題,如頁面異常檢測、使用者行為預測,頁面預載入等。