Skip to main content

Android 自動化測試工具介紹與實務應用

To auto test or not to auto test, that’s the question.

一直以來,在軟體業界,自動化測試面臨著二難的局面:大家都知道它對品質有多重要,但一旦面對需求、資源、時程的壓力下,它又會是第一個被省略的步驟。本文希望借由 91APP 在 Android 自動化測試的相關實作,提供我們的做法,供大家參考。

Android 自動化測試工具簡介

Android 官方文件中,就自動化測試工具提供了三種工具:

AndroidJUnitRunner

自動化測試的根本之一,在於如何「自動化執行測試」。

在技術上,每個開發人員都可以定義一套獨特的方式來執行自動化測試,但這樣會面臨整合與管理的問題。因此在 Java 語言中,一般都使用業界公認的自動化測試架構 – JUnit,來整合管理自動化測試。AndroidJUnitRunner 則是 Android 所實作,符合 JUnit 的test runner。

AndroidJUnitRunner 支援 JUnit3、JUnit4 測試案例 (test case),並提供 test filtering、test sharing 等進階功能。基於 AndroidJUnitRunner,Android 開發者就可以在 Android 環境中,執行單元測試 (Unit Test)。

單元測試是開發者執行自動化測試的基本項目。理論上所有的函式 (function)、物件 (object)、類別 (class),開發者都可以利用單元測試來測試其正確性。我們通常將單元測試視為白箱測試:基於被測試的程式架構,test case 明確指定程式中類別及函式名稱,並驗證其功能正確性。

UI 介面測試工具

UI 介面測試,不同於單元測試,測試工具不需基於被測試的程式架構,而是針對其顯示出來的使用介面做測試。目前已存在許多的 UI 介面測試工具,如:網頁介面測試的 Selenium,或另闢新路,利用圖型辨識做介面測試的 Sikuli

UI 介面測試工具的挑戰之後,在於「如何找到使用介面上的元件」。如:測試『按下使用介面「取消」鍵』,通常有下列幾種做法:

  • 絕對座標:在測試中直接寫死「取消」鍵絕對座標。這種做法優點是:實做簡單直覺。但缺點是:無法支援不同尺寸裝置測試,且「取消」鍵一旦搬動位置,測試就就無法正常執行,造成維護困難。
  • 元件辦識:在測試中利用工具,找出「取消」鍵的元件編號 (ID) 或名稱。元件辦識又分為二種做法:
    • 與程式原始碼連結:利用程式中的資源檔,找出元件。例如:「取消」鍵在程式中的名稱為「cancel_button」,測試程式可直接使用此名稱,找出取消鍵。此做法的優點是,取消鍵可以做名稱、外觀、位置及其他的各式修改,測試程式也會一併修改,方便維護。
    • 不與程式原始碼連結:在許多情境中,測試者無法取得原始碼,如:需調整 Android 系統設定,或測試與第三方的 APP (Facebook 等) 的互動等。這類測試需要可以利用測試工具,找出「取消鍵」的 ID 或名稱。但一旦系統或第三方 APP 程式有所修改,造成 ID 或名稱改變,測試程式也需要一併修正。
  • 圖型辨識:直接利用圖型辨識,找出「取消」鍵。目前這類測試的使用還在陸續發展中,其中關鍵在於圖型辨識核心引擎的強度與容錯持續強化。

在 UI 介面測試工具中,Android 官方提供了二個工具:針對單一 App 介面測試的 Espresso,及可針對 Android 系統與多 APP 介面測試的 UI Automator。

多 APP 介面測試:UI Automator

UI Automator 是 Android 針對系統/多 APP 所供的架構,Android 版本 4.3 以上可使用。

UI Automator 的優點是,可以改變 Android 系統層(如:WiFi 開關,GPS 開關) 組態,也可以處理跨 APP 的整合測試 (如:測試分享連結到 Facebook 是否成功) 等,相比 Espresso 更加強大。但相對的,在複雜性、易用性及可維護性上,門檻也提高不少。Android 也另外提供了 UiAutomatorViewer 方便開發者找出元件。

UiAutomatorViewer
使用 UiAutomatorViewer 取得 Android Facebook App 的元件 ID / 名稱

單一 APP 介面測試:Espresso

Espresso 是 Android 針對單一 APP 測試所提供的架構,Android 版本 2.2 以上即可使用。相對 UI Automator,Espresso 與被測試的程式原始碼連結,所以只能處理單一 APP,無法處理多 APP,或 Android 系統設定測試。但也因為其與程式原始碼連結,測試程式可直接調用 APP 的資源,在測試程式的可讀性、可維護性及易用性上,比 UI Automator 優秀許多。

Espresso使用方式
Espresso 使用方式

在實務上,因為 UI Automator 與 Espresso 可混合使用,Android 官方建議:單一 APP 測試使用 Espresso,而在做系統設定或跨 APP 測試時,再搭配使用 UI Automator 使用,會是較佳的選擇。

Espresso Cheat Sheet
Espresso Cheat Sheet

91APP 應用實例

單元測試

實作單元測試時,我們面對的第一個問題是:範圍為何?要先實做那些功能的單元測試?

一直以來,程式可測試性一直是架構上考量之一。換言之,一個可被自動化測試的程式,是需要被妥善設定與實作的。91APP Android 的單元測試,是選擇 data model 及 network api 存取功能開始執行,主要是這二類功能在架構上較獨立,與介面關係較小,執行上可基於在既有程式架構,不需大量程式重構。

Espresso

我們利用 Espresso,測試線上購物中的「型錄」功能,包括首頁廣告、分類頁、商品頁。91APP 的 Android 型錄功能,因大量的功能開關/模組,形成巨量組態:就首頁廣告版位,就有上百種組合,人工設定組態後再測試,會耗費巨大的人力與時間。利用 Espresso,可在執行自動化測試時,即時產生上百種組態加以測試,大幅增加測試涵蓋率 (test coverage)。

UI Automator

我們利用 UI Automator,測試 Facebook Deep Linking 功能。

所謂 Deep Linking,是 Facebook 對一般「網頁連結」的延伸標準:當使用者點選 Deep Linking 連結時,若手機上有安裝對應 App 時,會直接開啟 App 指定頁面(如:特定商品頁)。91APP 目前有實做 Deep Linking 功能,但因目前 Deep Linking 在 Facebook App 實做尚未穩固,常常會因 Facebook App 版本不同,造成機制失效。為了處理 Deep Linking,我們開發了基於 UI Automator 的自動化測試,能自動打開最新版 Facebook App,點選 Deep Linking 聯結,並確認是否會開啟我們的 Android App 特定頁面。目前我們已實做了數十個不同情境的測試案例,每日自動執行,並在測試有問題時,主動回報,使開發人員能在第一時間處理異常。

自動化測試平台 Jenkins

執行自動化測試程式,一定會基於一個自動化測試平台。我們使用 Jenkins 做為自動化測試平台,並安排每日定期、GIT commit 等方式,驅動自動化測試。在 91APP,Jenkins 已大量深化使用。利用每日產出的報表,我們可以知道,是否有新程式碼產生 side effect,造成舊有功能測試失敗。關於我們 Jenkins 使用的深入細節,有機會再另行專文介紹。

Jenkins執行自動化測試結果
Jenkins 執行自動化測試結果

未來展望

  • MVP (Module-View-Presenter) 架構:目前 91APP 的Android APP,基於 MVC (Model-View-Controller) 架構。目前架構下,程式「可測試性」會受到許多限制。在未來如能導入 MVP 架構,在單元測試就能 Mock View 及 Model,測試 Presenter 的正確性。或利用 Espresso,Mock Presenter,以測試 View 的正確性,則我們自動化測試涵蓋率將會有大幅提升。
  • Espresso Test Recording:Google 日前公佈,Android Studio 2.2 起,會開始提供錄影自動產生測試程式碼功能,這也可能是快速增加測試範圍新方式

結語 – 自動化測試

基於十多年的軟體開發經驗,筆者整理了關於自動化測試的一些觀點,與大家分享:

  • 單元測試是開發人員的基本功與責任,如能切實執行,不僅能有效提升軟體品質,也能提升個人能力。
  • 重要、複雜的商業流程,一定要實做單元測試,或進一步利用 BDD 等方式加以保護。
  • 掌握 UI 介面自動化測試,將會是許多測試人員成長的機會與挑戰。
  • UI介面自動化測試是否要執行,需視產品性質、功能重要性、介面穩固性等,通盤考量後再決定。
  • 自動化測試不是 0 與 1 的選擇:部份實做,也許是最佳選擇。

軟體開發方式的快速進展,一直是從業人員快樂與痛苦的來源。在 91APP,我們不斷打破自己的界線,並挑戰自己的極限。歡迎想接受挑戰各位,一同加入我們

參考資料

  1. Android官方測試函式庫
  2. AndroidJUnitRunner簡介
  3. Espresso簡介
  4. Espresso cheat sheet
  5. UI Automator簡介
  6. UiAutomatorViewer簡介
  7. Facebook Deep Linking
  8. Jenkins官方網站
  9. Espresso錄影自動產生測試程式碼
  10. BDD
搶攻行動商機,現在就加入 7,000 家已在網路開店的品牌行列!
分享至:
林 大維
91APP 研發副總,擁有十多年軟體開發經驗,專注在軟體開發流程與技術管理。

掌握最新電商脈動,加入 91APP 品牌全通路學院!

免費獲得最新市場趨勢、行銷技巧與資源,直接送達您的信箱。

完全免費,可隨時取消。
搶攻行動商機,現在就加入 7,000 家已在網路開店的品牌行列!