提升 Android 自動化測試穩定度

AppDev Ooops
AppDev Ooops
Published in
Apr 28, 2022

這篇文章想跟你分享:

團隊內針對 Espresso 測試框架無法偵測背景運作 Thread 的執行狀態,導致自動化測試時容易出錯的問題,簡單實作出封裝「等待機制」的自動化測試 API,藉此提升測試的穩定度。

自動化測試就像寵物一樣,看起來很可愛很美好,但顧起來很崩潰,尤其當 Flaky Test 不斷增生時,真的會是很挫敗團隊自動化專案推進的一大主因。

「同理,我們也遭遇到了 🥲」

Android Automation Test 在頁面轉換的等待,主要倚賴 Espresso 測試框架自身機制來完成,Espresso 會確認 UI Thread 已閒置才會執行下一個動作,但它無法偵測在背景執行的工作,經典案例就是 Espresso 不知道 API Request 什麼時候會完成,而 App 大部分頁面會在背景打 API 再呈現畫面,這會導致 Espresso 誤以為畫面已「完整呈現」而導致在不完整的畫面(API 資料還沒回來)下執行點擊、確認等測試行為。

因此想針對這點做些研究,試著解看看這惱人的 Flaky Test!

痛點

目前團隊使用客製化的 waitUntilDisplayed(view) 機制來解決畫面未穩定的問題。

但自動化測試框架沒有完善的機制做統一處理,導致哪裡需要等待就補上 waitUntilDisplayed(view),造成東補一個西補一個,自動測試的程式碼也因此會日漸凌亂,且也無法有效地防範 Flaky Test 產生。

「就像下方的 Sample Code

滿滿的 waitUntilDisplayed(view) 🙄」

調整方式

嘗試將等待機制封裝起來並提供簡易 API 供實作自動化測試使用,參考下方程式碼:

以先前的 FansBadgeInfoPage 為例子,集中在 ViewBase 處理等待問題後,便可以移除擾人視線的 Waiting Function,因 View 也一併封裝了 Espresso 語法。除了解決散落各地的 Waiting Function,也讓程式碼更簡潔。

成效

  • 以單一測試案例為例,比較套用機制前後各執行 40 次的成功率,從「未套用的 60% 成功率」提升至「100% 成功」, 改用新機制的自動化測試,明顯的提升了穩定度!
  • 同時,開發者實作自動化測試時也能仰賴此新機制直接處理了等待問題

已知問題

「此機制改善看起來好棒棒?」

封裝的等待機制中有用 device.waitForIdle() 來確保 App 為閒置狀態,此舉能增加測試穩定度卻也會增加測試時間,一個行為(Click、Scroll)約略加增 0.5 秒。

「增加測試時間」和「增加穩定度」一直以來也是個爭論不休的話題,若二擇一的話我會選擇穩定度,因測試時間可以透過其他方式解決,例如:平行測試、縮短測試情境等方法。

當然 Google 官方也有提供確認異步操作的框架 — Espresso idling resources,這也會是未來團隊可以前進研究的方向,若後續有相關的實驗再將結果分享出來!

Summary

測試不穩定其實有一部分是受測試框架影響,當在修正 Flaky Test 時若能自己發覺自己似乎是在亂槍打鳥、在不同地方貼補丁,這其實是反映出程式碼中有壞味道出現。

將程式碼做重構,把頁面處理集中管理,不僅易於維護也間接提升了測試穩定度,是個一舉兩得的做法。

--

--