Android 自動化測試深度研究

Android 自動化測試的演進:從 2015 年到 AI 驅動時代的全面分析

第一節:現代 Android 測試的基礎原則與戰略要務

本節旨在建立現代 Android 測試的戰略與架構基石。其目的不僅是闡述測試的「如何做」,更是深入剖析其「為何如此」的根本原因,分析驅動測試策略的經濟因素、戰略模型,以及作為成功且可擴展自動化策略先決條件的軟體設計模式。

1.1 邁向自動化的必然轉變:驅動力與效益

在現代軟體開發的快節奏脈動中,手動測試已從一種常規實踐演變為一種難以維持的瓶頸。尤其在 Android 生態系中,此一轉變更顯得迫切且不可逆。其背後的驅動力是多維度的,其中最核心的挑戰來自於指數級增長的複雜性。隨著每年新設備的發布以及 Android 作業系統版本的頻繁更新,一個應用程式需要兼容的設備與 OS 組合數量呈爆炸性增長。在這種情況下,手動測試每一種組合不僅耗時費力,且在經濟上變得不切實際 1。

為應對此挑戰,自動化測試應運而生,它不僅僅是趨勢,更是現代軟體開發的必需品 1。自動化測試帶來了一系列根本性的效益,徹底改變了品質保證的格局:

然而,僅僅加速測試並不足以保證品質。一個更深層次的觀念是「內建品質 (Built-in Quality, BiQ)」。這意味著品質不應僅僅在測試階段被檢驗,而應在定義、設計和交付軟體的整個過程中被融入。自動化測試是實現內建品質的關鍵工具,但它必須與優化的開發流程和工具相結合,才能真正提升軟體品質,而非僅僅加速發現劣質產品的速度 1。

1.2 測試金字塔:品質的戰略藍圖

測試金字塔是一個概念性框架,旨在指導開發團隊如何以一種高效且可持續的方式組織其自動化測試套件 6。其核心思想是根據測試的範圍、速度和維護成本,將測試分層,並以金字塔的形狀進行數量上的分配。這個模型的根本目標是在發現錯誤的成本與開發者生產力之間取得最佳平衡 7。

傳統的測試金字塔通常分為三層 6:

  1. 單元測試 (Unit Tests):位於金字塔的底部,數量最多。它們專注於驗證程式碼中最小的可測試單元(如一個方法或一個類別)的邏輯正確性。單元測試運行速度極快,因為它們在本地 JVM 上執行,且不依賴於 Android 框架或外部系統,這使得它們非常可靠且易於維護 5。
  2. 整合測試 (Integration Tests):位於金字塔的中間層。它們驗證多個單元(或組件)之間的交互是否按預期工作。例如,測試一個 ViewModel 與其依賴的 Repository 之間的協作。這些測試比單元測試慢,因為它們可能需要更複雜的設置,甚至可能需要一個模擬的 Android 環境 5。
  3. 端到端測試 (End-to-End, E2E Tests):位於金字塔的頂部,數量最少。它們模擬完整的用戶場景,驗證整個應用程式的功能流程。E2E 測試(如 UI 測試)運行在真實設備或模擬器上,涵蓋了從 UI 交互到後端服務的所有層級。它們的執行速度最慢,維護成本最高,也最容易出現不穩定(flaky)的情況 5。

隨著 Android 應用程式架構的演進,Google 提出了一個更為細緻的五層測試金字塔模型,以更好地反映現代應用程式的測試需求 7:

  1. 單元測試 (Unit Test):與傳統模型定義相同,驗證單一功能單元的邏輯,無 Android 框架依賴。
  2. 組件測試 (Component Test):驗證一個模組或 UI 組件的功能或外觀,獨立於系統的其他部分。這比單元測試的範圍更廣,例如,對一個自定義按鈕進行截圖測試 7。
  3. 功能測試 (Feature Test):驗證兩個或多個獨立組件或模組的交互。這通常在功能層級進行,例如,驗證一個螢幕中 UI 狀態管理的 UI 行為測試 7。
  4. 應用程式測試 (Application Test):以可部署的二進制檔案形式驗證整個應用程式的功能。這是一種大型整合測試,使用包含測試鉤子 (testing hooks) 的偵錯版本作為被測系統 7。
  5. 發行候選版本測試 (Release Candidate Test):驗證發行版本的構建功能。與應用程式測試類似,但測試的二進制檔案是經過壓縮和優化的。這是在最接近生產環境的條件下進行的大型 E2E 整合測試,例如驗證關鍵用戶旅程或性能測試 7。

這個演進反映了一種更深刻的理解:測試並非鐵板一塊,而是需要根據其目標和範疇進行精確分類。無論是三層還是五層模型,其核心戰略原則始終如一:擁有一個由大量快速、小範圍測試構成的堅實基礎,並謹慎地使用少量緩慢、大範圍的測試 7。一個健康的測試策略應該呈現金字塔形狀。反之,如果一個專案的測試套件呈現出「冰淇淋甜筒」的反模式(即大量的 E2E 測試和稀少的單元測試),這通常意味著其測試效率低下,發現錯誤的成本高昂 7。

這種戰略不僅僅是關於測試本身,它還深刻地影響著應用程式的架構。為了有效地實現金字塔底部龐大的單元測試,開發者被迫編寫解耦、模組化的程式碼。這自然而然地推動了對乾淨架構 (Clean Architecture) 和依賴注入 (Dependency Injection) 等設計模式的採納。因此,一個團隊對測試金字塔的承諾,實質上是在驅動其程式碼庫走向更健康、更易於維護的架構。測試策略與應用程式架構之間存在著一種共生關係,兩者相互影響,共同決定了軟體的最終品質。

1.3 測試的架構先決條件

一個可測試的應用程式架構是高效自動化測試的基石。如果沒有良好的架構設計,測試將變得困難、緩慢且不穩定,進而侵蝕自動化所帶來的效益 5。一個不可測試的架構通常會導致大型、緩慢且脆弱的測試,因為無法進行單元測試的類別必須由更大範圍的整合測試或 UI 測試來覆蓋。這不僅降低了測試效率,也限制了測試不同場景的能力 5。因此,在編寫任何測試之前,必須先建立一個支持測試的架構。

1.3.1 透過依賴注入 (DI) 實現解耦

依賴注入 (Dependency Injection, DI) 是實現可測試架構最核心的技術之一。它的基本原則是,一個物件不應該自己創建其所依賴的物件,而應該由外部提供(注入)這些依賴。這種控制反轉 (Inversion of Control, IoC) 的模式能夠有效地將組件解耦,使得每個組件都可以被獨立測試 5。在測試時,我們可以輕易地用測試替身(如 mock 或 fake 物件)來替換真實的依賴項,從而將被測單元與其外部依賴隔離開來。

在現代 Android 開發中,主要有兩個主流的 DI 框架:Hilt 和 Koin。它們代表了兩種不同的設計哲學和技術權衡。

選擇 Hilt 還是 Koin,不僅僅是一個技術實現的選擇,更反映了一個團隊的核心工程哲學和戰略優先級。選擇 Hilt 的團隊,通常更看重穩定性編譯時的確定性,願意為此犧牲一部分開發速度(更長的構建時間)。這在大型、成熟的企業級專案中尤為常見,因為在這些專案中,一個生產環境的錯誤可能導致巨大的損失。相反,選擇 Koin 的團隊,則更看重開發速度快速的迭代週期簡潔性。這在初創公司或小型團隊中更為普遍,他們需要快速開發和驗證想法,並願意接受運行時依賴錯誤的風險以換取更高的開發效率。因此,DI 框架的選擇,成為了衡量一個團隊風險偏好和開發優先級的風向標。

特性 Hilt (基於 Dagger) Koin
核心原則 編譯時程式碼生成 (Compile-time Code Generation) 運行時解析 (Runtime Resolution) / 服務定位器 (Service Locator)
性能影響 增加構建時間,但運行時性能高 構建時間快,但運行時有輕微解析開銷
錯誤檢測 編譯時錯誤檢查,安全性高 運行時異常,錯誤發現較晚
樣板程式碼/設置複雜度 較高,需要註解和模組配置 較低,使用 Kotlin DSL,設置簡單
學習曲線 較陡峭,需理解 Dagger 概念 較平緩,對初學者友好
生態系整合 Google 官方支持,與 Jetpack 深度整合 社群驅動,與 Kotlin 生態系緊密結合
測試支持 提供專門的測試 API (@HiltAndroidTest),可輕鬆替換和注入依賴 提供測試模組,可在測試中啟動 Koin 並替換依賴定義

表 1: 可測試性依賴注入框架比較:Hilt vs. Koin 9

1.3.2 透過頁面物件模型 (POM) 提升 UI 測試可維護性

對於位於測試金字塔頂端的 UI 測試,其最大的挑戰之一是可維護性。隨著應用程式 UI 的演進,測試腳本很容易因為 UI 元素的 ID、佈局或交互邏輯的改變而失效,導致大量的維護工作。頁面物件模型 (Page Object Model, POM) 是一種廣泛採用的設計模式,旨在解決這一痛點 13。

POM 的核心思想是將測試邏輯與 UI 交互邏輯分離 13。具體做法是為應用程式的每一個螢幕或重要功能區塊創建一個對應的「頁面物件」類別。這個類別封裝了該頁面上所有 UI 元素的定位符(locators)以及與這些元素交互的方法 13。

實施 POM 帶來了顯著的好處:

一個典型的 POM 實現通常包含以下幾個部分 14:

  1. Base Class (BaseTest/BaseScreen):包含所有測試和頁面物件共用的功能,如測試環境的初始化、清理、以及一些通用的輔助方法。
  2. Page Classes:每一個類別代表應用程式的一個螢幕。它定義了該螢幕上 UI 元素的定位符,並提供與這些元素交互的公共方法。
  3. Test Classes:包含實際的測試邏輯。它會實例化所需的頁面物件,並調用其方法來執行用戶操作和斷言。

例如,在一個使用 Espresso 的 Android 測試中,一個 LoginPage 類別會封裝用戶名輸入框、密碼輸入框和登入按鈕的 ViewInteraction 物件,並提供如 typeUsername(String text)、typePassword(String text) 和 clickLogin() 等方法。而測試類別 LoginTest 則會調用這些方法來執行一個完整的登入流程並驗證結果 14。POM 的應用,使得 UI 測試從脆弱的腳本集合,轉變為健壯、可擴展且易於維護的測試資產。

第二節:Google 主導的復興 - 原生 Android 測試框架 (2015-2020)

本節記錄了 Android 測試發展史上的一個關鍵時期。大約從 2015 年開始,Google 採取了果斷的行動,引導 Android 生態系從零散的第三方測試工具,轉向一個標準化、深度整合且更為可靠的原生測試框架體系。這一轉變不僅是技術的升級,更是一場深刻的文化變革。

2.1 2015 年前的格局與 Espresso 的崛起

在 2015 年之前,Android 的自動化測試領域呈現出碎片化的狀態。當時,像 Robotium 這樣的第三方框架是主流選擇之一 16。Robotium 是一個黑盒測試框架,它允許測試人員編寫能夠跨 Activity 交互的測試案例。雖然在當時它提供了重要的功能,但其缺點也十分明顯:它與 Android 系統和開發工具的整合不夠深入,測試的穩定性也常常受到挑戰 16。

Google 推出並大力推廣 Espresso,標誌著一個戰略性的轉折點 18。Espresso 被設計為一個「白盒」UI 測試框架,這意味著它運行在與被測應用程式相同的進程中,可以直接訪問應用程式的內部元件、資源(如

R.id)和程式碼 19。這種設計帶來了幾個決定性的優勢:

Google 的這一舉動,其深層意圖不僅僅是提供一個更好的工具,而是要將測試的責任和能力重新交還給開發者。Robotium 作為一個黑盒工具,其使用場景更偏向於獨立的 QA 團隊。而 Espresso 的白盒特性,要求測試編寫者必須接觸到應用程式的源程式碼,這天然地使其更適合由開發者自己來使用。這種轉變推動了一種新的文化:品質不應是開發流程結束後由 QA 團隊來「檢驗」的東西,而應該是在開發過程中由開發者親手「構建」進去的。Espresso 的崛起,正是 Google 推動「內建品質」文化 1 的一個關鍵佈局。

2.2 Espresso 的核心架構:自動同步的力量

Espresso 最具革命性的特性,也是其相比前代工具最大的優勢,就是其內建的自動同步機制 19。在 UI 測試中,最大的不穩定性來源之一就是時序問題:測試腳本執行得太快,試圖在 UI 元素還未出現、動畫尚未完成或數據仍在加載時與之交互,從而導致測試失敗。

傳統的解決方案是手動在測試中插入 Thread.sleep() 等待,但這是一種非常糟糕的實踐。等待時間過短,測試依然會失敗;等待時間過長,則會極大地拖慢整個測試套件的執行速度,使其變得不切實際 24。

Espresso 的自動同步機制從根本上解決了這個問題。其工作原理是:在執行每一個測試操作(如 perform(click()))或斷言(如 check(matches(isDisplayed())))之前,Espresso 會檢查以下幾個條件,確保應用程式處於「閒置 (idle)」狀態 22:

  1. 主執行緒消息隊列 (Main Thread Message Queue):確保消息隊列中沒有待處理的消息。
  2. AsyncTask:確保沒有正在執行的 AsyncTask。
  3. 開發者定義的 Idling Resources:確保所有註冊的自定義異步操作都已完成(後續詳述)。

只有當所有這些條件都滿足時,Espresso 才會執行下一步操作。這個機制確保了測試操作總是在一個穩定和可預測的 UI 狀態下進行,從而極大地減少了因時序問題導致的測試不穩定性 (flakiness) 19。

Espresso 的核心 API 非常簡潔,主要由三個部分組成 22:

一個典型的 Espresso 測試語句看起來像這樣:
onView(withId(R.id.login_button)).perform(click());
這種設計使得測試程式碼清晰地表達了「在某個元件上,執行某個操作,然後檢查某個結果」的意圖,而將所有複雜的同步邏輯隱藏在底層。

2.3 UI Automator 2:跨越應用程式邊界的測試

儘管 Espresso 在應用程式內部的 UI 測試中表現出色,但它的能力範圍有著明確的界限:它無法與被測應用程式進程之外的任何 UI 元素進行交互 19。這意味著,像系統級的權限請求對話框、通知欄中的通知、或是從「設定」應用中切換權限這樣的場景,Espresso 都無能為力。

為了解決這個問題,Google 提供了另一個官方框架:UI Automator 2 23。UI Automator 是一個黑盒測試框架,它的工作方式與 Espresso 完全不同。它不是在應用程式進程內部運行,而是在系統層級運作,透過 Android 的無障礙服務 (Accessibility Services) 來查找和操作螢幕上的 UI 元素,就像一個真正的用戶在與設備交互一樣 16。

這使得 UI Automator 能夠完成 Espresso 無法做到的事情 19:

然而,這種強大的跨應用能力也帶來了顯著的權衡。UI Automator 最大的缺點是它不具備 Espresso 那樣的自動同步機制 19。這意味著測試編寫者需要自己處理等待和同步問題,這使得 UI Automator 的測試本質上比 Espresso 的測試更慢,也更容易變得不穩定 25。

因此,Google 推薦的策略是一種協同工作的模式:

開發者甚至可以在同一個 Espresso 測試中調用 UI Automator 的 API,以處理測試流程中短暫的系統級交互部分,從而結合兩者的優點 25。這種「Espresso 為主,UI Automator 為輔」的策略,構成了原生 Android UI 測試的完整解決方案。

2.4 阿喀琉斯之踵:使用 IdlingResource 處理異步性

儘管 Espresso 的自動同步機制非常強大,但它並非萬能。它只能自動監控主執行緒消息隊列和標準的 AsyncTask。對於應用程式中更常見的異步操作,如使用 OkHttp 或 Retrofit 進行的網絡請求、從 Room 資料庫加載數據、或任何在自定義背景執行緒中執行的任務,Espresso 是無法感知的 24。

這是 Espresso 測試中最常見的不穩定性來源。當測試觸發了一個背景數據加載操作時,Espresso 可能會因為主執行緒閒置而錯誤地認為應用程式已準備就緒,並立即執行後續的斷言,而此時數據尚未加載到 UI 上,導致測試失敗 27。

為了解決這個根本性問題,Espresso 提供了一個明確且強大的機制,稱為 IdlingResource 3。

IdlingResource 的核心概念是讓應用程式的異步操作能夠主動通知 Espresso 它們的狀態。它就像一個信號旗,應用程式在開始一個耗時的背景任務時舉起旗子(表示「忙碌」),在任務完成時放下旗子(表示「閒置」)27。Espresso 在執行任何操作前,都會檢查所有註冊的

IdlingResource 是否都處於「閒置」狀態。

CountingIdlingResource 是最常用的一種 IdlingResource 實現 27。它的工作方式非常直觀:

一個典型的使用流程如下 27:

  1. 在應用程式程式碼中:在觸發網絡請求或資料庫查詢的地方調用 MyIdlingResource.increment()。在網絡請求的回調 (callback) 或數據加載完成的 finally 區塊中,調用 MyIdlingResource.decrement()。
  2. 在測試程式碼中:在測試的 @Before 方法中,使用 IdlingRegistry.getInstance().register(...) 來註冊這個 IdlingResource。在 @After 方法中,使用 IdlingRegistry.getInstance().unregister(...) 來取消註冊,以避免測試之間的狀態洩漏 28。

這個機制雖然非常有效,但也揭示了 UI 測試中一個固有的矛盾:簡單性與可靠性之間的權衡。Espresso 的自動同步為簡單場景提供了「免費」的可靠性。但隨著應用程式異步邏輯的複雜化,開發者必須介入,編寫更為明確和侵入性(需要在產品程式碼或測試注入程式碼中進行修改)的 IdlingResource 程式碼,才能維持測試的可靠性。這個過程雖然增加了複雜性,但也迫使開發者更深入地思考其應用程式的異步行為,從而提升了程式碼的整體品質。除了手動實現,社群也提供了一些封裝好的解決方案,如用於 OkHttp 的 OkHttp3IdlingResource 和 BusyBee 等替代方案,以簡化這一過程 30。

2.5 本地測試的演進:Robolectric 與 Mockito

除了運行在設備或模擬器上的儀器化測試 (instrumented tests),另一條重要的測試演進線路是在本地開發機的 JVM 上運行的本地測試 (local tests)。這類測試速度更快,反饋更迅速,是測試金字塔底層的關鍵組成部分。

Robolectric:在 JVM 上模擬 Android

許多 Android 程式碼邏輯都與 Android 框架類別(如 Context, Activity, Bundle)緊密耦合,這使得它們無法直接在標準的 JVM 上進行單元測試。Robolectric 的誕生就是為了解決這個問題 33。

Robolectric 是一個強大的框架,它在本地 JVM 中模擬了一個 Android 環境 33。其核心技術是

"Shadow Classes" 35。當測試程式碼實例化一個 Android 框架類別時,Robolectric 會攔截這個調用,並返回一個對應的 "Shadow" 物件。這個 Shadow 物件重新實現了原始 Android 類別的行為,但使用的是標準 Java 實現,因此可以在 JVM 上運行。例如,一個 Shadow

Activity 可以模擬生命週期方法的調用,而一個 Shadow SharedPreferences 則將數據存儲在內存中的 map 裡。

Robolectric 的主要優勢是速度。它避免了啟動和部署到模擬器的巨大開銷,使得依賴 Android 框架的測試也能夠快速執行 34。這對於測試 ViewModel、自定義 View 或任何與 Android API 有交互的組件級別測試非常有價值 33。

然而,Robolectric 也有其局限性:

因此,Robolectric 被定位為一個重要的補充工具,特別適用於那些因為依賴 Android 框架而無法進行純單元測試,但又不需要完整儀器化測試開銷的場景,例如對遺留程式碼的測試 33。

Mockito:隔離依賴的藝術

在測試金字塔的最底層,純單元測試的目標是在隔離的環境中驗證單個類別的邏輯。為了實現這種隔離,我們需要一種方法來切斷被測類別與其依賴項之間的聯繫。這就是 Mockito 發揮作用的地方 36。

Mockito 是 Java/Kotlin 生態系中事實上的標準模擬框架 (mocking framework) 38。它允許開發者為任何類別或介面創建「模擬物件 (mock objects)」36。這些模擬物件看起來和真實物件一樣,但其行為完全由測試程式碼控制。

使用 Mockito 的核心流程包括 38:

  1. 創建模擬物件:使用 mock(MyDependency.class) 來創建一個依賴項的模擬。
  2. 設定行為 (Stubbing):使用 when(mock.someMethod()).thenReturn(someValue) 來定義當模擬物件的某個方法被調用時,應該返回什麼值或拋出什麼異常。
  3. 執行測試:將模擬物件注入到被測類別中,並調用被測方法。
  4. 驗證交互 (Verification):使用 verify(mock).someMethod(expectedArgument) 來檢查被測類別是否以預期的方式調用了模擬物件的方法。

Mockito 使得編寫純粹的、快速的、可靠的單元測試成為可能,是實現測試金字塔堅實基礎的必備工具 37。它可以與 JUnit 完美結合,也可以在 Robolectric 測試中使用,以模擬更深層次的依賴。

第三節:抽象化與聲明式 UI 的時代

隨著 Android 開發的成熟,測試領域也進入了一個新的階段,其特點是向更高層次的抽象化演進。這一時期,跨平台框架試圖統一不同平台的測試編寫,而聲明式 UI 的革命則從根本上改變了測試的構思與實現方式。

3.1 跨平台抽象:Appium 的架構

在多平台開發成為常態的背景下,為 Android 和 iOS 分別維護兩套獨立的測試程式碼庫,成為了許多團隊的巨大負擔。Appium 的出現,正是為了解決這個痛點,它提供了一個統一的、跨平台的移動端自動化測試解決方案 4。

Appium 的核心架構基於一個廣為人知的標準:W3C WebDriver 協議 4。這個協議最初是為 Web 瀏覽器自動化設計的(Selenium WebDriver 的基礎),Appium 巧妙地將其擴展到了移動端。Appium 的工作模式可以理解為一個

客戶端-伺服器 (Client-Server) 模型 39:

  1. Appium Client:測試人員使用各種程式語言(如 Java, Python, JavaScript)編寫測試腳本,這些腳本透過 Appium 的客戶端庫,將操作指令(如「點擊按鈕」、「輸入文字」)轉換為標準的 WebDriver API 請求。
  2. Appium Server:這是一個運行在本地或遠程機器上的 HTTP 伺服器。它接收來自客戶端的 WebDriver 請求。
  3. 翻譯與執行:Appium Server 的核心職責是將這些通用的 WebDriver 請求翻譯成特定平台能夠理解的原生自動化指令。
  4. 原生自動化框架:伺服器將翻譯後的指令發送給運行在設備上的原生自動化框架來執行。

一個至關重要的洞察是,Appium 並沒有重新發明輪子。它在底層封裝並利用了各個平台官方提供的原生測試工具 4。對於 Android 平台,這意味著:

Appium 的最大優勢顯而易見:程式碼重用。團隊可以編寫一套測試邏輯,在稍作調整後即可同時在 Android 和 iOS 平台上運行,這極大地提高了效率 4。然而,這種抽象層也帶來了不可避免的權衡:

3.2 聲明式革命:Jetpack Compose 測試

Jetpack Compose 的推出,是 Android UI 開發領域的一場範式轉移,從傳統的命令式 (imperative) 視圖系統轉向了聲明式 (declarative) UI 43。這種轉變也從根本上重塑了 UI 測試的理念和實踐。

在傳統的 View 系統中,測試是透過查找和操作 View 物件來進行的。而在 Compose 中,UI 是狀態的函數,並沒有一個可以直接操作的、持久的 View 物件層級結構。為了適應這一點,Compose 測試框架引入了幾個核心概念:

Jetpack Compose 的測試框架代表了與 UI 開發範式同步的演進,它提供了一種更現代、更健壯、更符合直覺的 UI 測試方式。

3.3 下一波聲明式測試浪潮:Maestro

如果說 Jetpack Compose 將聲明式理念應用於 UI 的構建,那麼 Maestro 則將這一理念應用到了 UI 測試的編寫上 17。Maestro 是一個新興的、開源的 UI 測試框架,它明確地將自己定位為吸取了 Appium、Espresso 等前輩框架痛點教訓後的產物 17。

Maestro 的核心設計哲學是追求極致的簡單性可靠性,其主要特點包括:

Maestro 的出現,清晰地展示了測試工具演進的一個重要趨勢:從 Espresso 到 Appium 再到 Maestro,測試框架的抽象層次越來越高,越來越貼近用戶的自然語言描述。Espresso 要求你用程式碼操作 UI 元件;Appium 讓你用跨平台的程式碼操作 UI;而 Maestro 則讓你直接描述用戶的操作流程

這種演進背後,是測試範式與 UI 開發範式的同步變遷。命令式的 View 系統催生了命令式的 Espresso 測試。當聲明式的 Jetpack Compose 出現後,測試框架也開始向聲明式演進,最初是透過語義樹作為橋樑,而 Maestro 則代表了這一趨勢的邏輯終點——用聲明式的方式來描述測試本身。這表明,測試方法論從根本上是與其所測試的對象的開發範式緊密耦合、共同演進的。

特性 Espresso Appium Jetpack Compose Test Maestro
主要使用場景 應用內白盒 UI 測試 跨平台 E2E 測試 應用內聲明式 UI 測試 快速、可靠的 E2E 流程測試
範式 命令式 命令式 命令式 (API) / 聲明式 (目標) 聲明式
語言 Java / Kotlin Java, Python, JS, Ruby 等 Java / Kotlin YAML
同步機制 自動同步 + 手動 IdlingResource 無內建同步,需手動等待 內建自動同步 內建自動等待和重試
性能 高 (進程內運行) 中 (客戶端-伺服器架構) 高 (進程內運行) 中高 (解釋執行,但優化良好)
跨平台 否 (僅 Android) 是 (Android, iOS 等) 否 (僅 Android) 是 (Android, iOS)
學習曲線 中等 中等
關鍵創新 自動同步機制 WebDriver 協議跨平台抽象 基於語義樹的測試 YAML 聲明式語法與內建容錯

表 2: 核心 Android UI 測試框架的比較分析 4

第四節:生態系統 - 在開發生命週期中擴展與整合測試

本節將探討支持自動化測試大規模實施的廣泛生態系統。焦點將從單個測試框架轉向如何將測試無縫整合到現代軟體交付流程中,涵蓋了從克服設備碎片化到實現高速 CI/CD 實踐的各個方面。

4.1 征服設備碎片化:雲端設備農場

Android 生態系統最顯著的挑戰之一便是設備碎片化:市場上存在著成百上千種不同製造商、螢幕尺寸、作業系統版本的設備 49。要確保應用程式在所有主流設備上都能提供一致且優質的體驗,對任何團隊來說都是一項艱鉅的任務。自行購買和維護一個包含足夠多樣性設備的實體實驗室,不僅成本高昂,而且管理複雜。

雲端設備農場 (Cloud Device Farms) 作為業界對此挑戰的標準解決方案應運而生。這些平台提供了對大量真實設備和模擬器的遠程訪問,讓開發團隊能夠按需、大規模地執行自動化測試。

這些雲端平台的興起,從根本上改變了測試基礎設施的經濟學。過去,大規模測試能力是一種資本密集型的資產,只有大型公司才能負擔得起。如今,雲端設備農場將其轉變為一種可擴展的、按需付費的公共事業。這使得小型初創公司也能以相對較低的運營成本,獲得以往只有科技巨頭才能擁有的設備覆蓋能力,從而實現了測試能力的民主化。

特性 Firebase Test Lab BrowserStack
設備類型 真實設備與虛擬設備 主要為真實設備
設備庫存規模 較大,由 Google 維護 極大,涵蓋廣泛的全球設備
關鍵差異化功能 Robo 測試 (無腳本自動探索)、與 Firebase 生態深度整合 App Live (交互式手動測試)、極廣的設備/OS 覆蓋範圍
CI/CD 整合 良好,提供 gcloud CLI 非常好,提供豐富的 CI 插件和 API
測試框架支持 Espresso, UI Automator, Robo, Game Loop Appium, Espresso, XCUITest 等主流框架
報告與調試功能 提供日誌、影片和截圖 提供日誌、影片、截圖、性能指標、網絡日誌等
定價模型 基於設備使用分鐘數,有免費額度 基於並行執行數量和用戶數的訂閱模式

表 3: 雲端測試平台能力比較:Firebase Test Lab vs. BrowserStack 51

4.2 持續整合與持續交付 (CI/CD)

持續整合 (Continuous Integration) 和持續交付 (Continuous Delivery) 已成為現代軟體開發的標準實踐。CI/CD 流程將「構建-測試-部署」的循環自動化,確保每一次程式碼提交都能得到快速、一致的驗證 57。自動化測試是 CI/CD 流程的核心,沒有可靠的自動化測試,CI/CD 就無從談起。

以下是在主流 CI/CD 平台上配置 Android 自動化測試的工作流程範例:

4.3 高速測試策略

當 CI/CD 流程建立起來後,下一個挑戰就是如何提高測試的執行速度和結果的可靠性,以匹配高速的開發節奏。

當測試在 CI 系統中高頻率自動執行時,其角色也發生了轉變。測試套件不再僅僅是一個驗證工具,它演變成了一個豐富的數據源。透過分析歷史測試數據,工程團隊可以實現從被動修復 bug 到主動管理品質的轉變。例如,追蹤測試的通過/失敗歷史可以自動識別不穩定測試 73;監控測試執行時間可以檢測性能回歸 81;分析程式碼覆蓋率的變化趨勢可以評估測試的完備性 77。測試報告的價值,已從簡單的「通過/失敗」狀態,提升到了能夠產生驅動流程改進的深刻洞見。

第五節:新前沿 - AI 與特殊形態設備

本節將探討 Android 測試領域的最前沿動態,分析自動化技術如何適應新穎的硬體形態,以及人工智慧 (AI) 將如何從根本上重塑整個測試生命週期。

5.1 為新現實而測試:可折疊設備

可折疊設備的出現為 Android 應用程式帶來了全新的交互模式和佈局可能性,同時也引入了傳統智慧手機所沒有的獨特測試挑戰 82。為這類設備設計的測試策略,必須超越傳統的螢幕尺寸和方向測試,專注於其動態變化的物理形態。

可折疊設備的興起,正成為一種催化劑,推動著整個 UI 測試生態系統從過去驗證靜態佈局的模式,轉向驗證動態、自適應佈局及其之間無縫過渡的能力。

5.2 AI 在自動化測試中的崛起

人工智慧 (AI) 和機器學習 (ML) 正在為自動化測試帶來一場深刻的變革,其目標是將測試從簡單的腳本執行,提升為能夠自我適應、自我修復甚至自我生成的智能系統 88。

AI 的崛起正在從根本上改變 QA 工程師的角色。過去,自動化工程師的大部分時間都花在編寫和維護脆弱的測試腳本上。隨著測試維護(自我修復)和測試創建(AI 生成)這兩大核心手動任務逐漸被自動化,QA 工程師的價值將發生轉移。他們不再僅僅是「腳本編寫者」,而是轉型為「品質策略師」和「AI 訓練師」。他們的工作將更多地聚焦於定義高層次的測試策略、識別需要 AI 關注的關鍵用戶旅程、分析 AI 工具產生的洞見以發現系統性的品質問題,以及管理和策劃用於訓練 AI 模型的測試數據 94。這是一次從戰術層面的重複性勞動,向戰略層面的分析性工作的深刻轉變。

第六節:綜合分析與戰略建議

本節將對前述的演進歷程進行綜合提煉,從基礎原則到 AI 驅動的未來,勾勒出一幅完整的 Android 自動化測試發展圖景。基於此分析,本節將為工程領導者和架構師提供一套可操作的、高層次的戰略建議,以幫助他們構建一個現代化且面向未來的 Android 測試策略。

6.1 演進軌跡的綜合分析

回顧自 2015 年以來的發展,Android 自動化測試的演進可以清晰地劃分為五個相互關聯且層層遞進的階段:

  1. 鞏固與標準化 (約 2015 年):Google 透過推出 Espresso,結束了早期測試工具的混亂局面。這一階段的核心是標準化,強調測試的可靠性(透過自動同步)和將品質責任內化到開發流程中,確立了開發者在測試中的主導地位。
  2. 抽象化與跨平台 (約 2017 年):隨著 Appium 的成熟,測試進入了抽象化階段。其目標是透過一個統一的 API 實現跨平台程式碼重用,以應對多平台開發的成本挑戰,儘管這犧牲了一定的性能和原生整合度。
  3. 整合與規模化 (約 2019 年):CI/CD 和雲端設備農場成為主流。測試從單次的手動觸發,轉變為一個持續整合可大規模擴展的自動化流程。測試基礎設施的商品化,使得任何規模的團隊都能夠實現全面的設備覆蓋和高頻率的回歸測試。
  4. 聲明式轉變 (約 2021 年):Jetpack Compose 的出現引發了 UI 開發的範式轉移,測試領域也隨之進入聲明式階段。基於語義樹的 Compose 測試,以及像 Maestro 這樣用聲明式語言定義測試流程的框架,都旨在簡化測試的創建和維護,使其更貼近人類的自然思維。
  5. 自主化與智能化 (當前):人工智慧正在引領測試進入自主化時代。AI 不再僅僅是執行預設的腳本,而是開始自主地進行測試維護(自我修復)和測試創建(AI 生成)。測試系統正從一個被動的執行者,演變為一個主動的、智能的品質保障夥伴。

6.2 現代化測試工具鏈的戰略建議

在當今複雜的測試生態系中,不存在一個「放之四海而皆準」的最佳解決方案。最佳的測試策略和工具鏈選擇,取決於團隊的具體背景、專案規模、技術棧和戰略目標。以下是針對不同類型團隊的決策框架建議:

6.3 Android 測試的未來:預測與結語

展望未來,Android 自動化測試的演進將繼續朝著更高級的抽象化和更深度的智能化方向發展。聲明式和 AI 驅動的方法將不再是前沿探索,而會逐漸成為行業標準。

我們可以預見,未來的測試將更加無代碼化 (codeless)意圖驅動 (intent-driven)。QA 專業人員的角色將繼續演變,他們的工作重心將從編寫和維護測試腳本,徹底轉向設計和監督自主化測試系統。他們將成為「品質架構師」,負責定義測試策略、訓練 AI 模型、分析測試數據所揭示的品質趨勢,並最終對應用程式的整體用戶體驗負責。

總而言之,在現代 Android 生態系統中,測試早已不再是一個孤立的、後置的驗證階段。它已經深深地融入到軟體創造的每一個環節中,成為一個持續的、智能的、與開發過程密不可分的有機組成部分。那些能夠擁抱這一變革,並戰略性地構建其測試能力和文化的團隊,將在未來高品質、高速度的軟體交付競賽中,佔據決定性的優勢。

引用的著作

  1. Mobile App Evolution: The Future for Automated Testing - Testim, 檢索日期:6月 18, 2025, https://www.testim.io/blog/the-evolution-of-mobile-applications-why-automated-testing-is-the-future/
  2. The Complete Guide to Automated Android App Testing 2025 - TestGrid, 檢索日期:6月 18, 2025, https://testgrid.io/blog/automated-android-app-testing/
  3. Test your app on Android, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing
  4. The Evolution of Automation Testing | ACCELQ, 檢索日期:6月 18, 2025, https://www.accelq.com/blog/testing-evolution/
  5. Fundamentals of testing Android apps | Test your app on Android, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing/fundamentals
  6. The Testing Pyramid: Definition, Benefits, & Implementation - TestGrid, 檢索日期:6月 18, 2025, https://testgrid.io/blog/testing-pyramid/
  7. Testing strategies | Test your app on Android | Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing/fundamentals/strategies
  8. Test Automation Pyramid Tutorial & Best Practices | Sauce Labs, 檢索日期:6月 18, 2025, https://saucelabs.com/resources/blog/mobile-automated-testing-pyramid
  9. Koin Vs Hilt - DEV Community, 檢索日期:6月 18, 2025, https://dev.to/samseptiano/koin-vs-hilt-3jek
  10. Differences Between Dagger, Hilt, Koin, and Pure Dependency Injection - Treinetic, 檢索日期:6月 18, 2025, https://treinetic.com/dagger-hilt-koin-and-pure-dependency-injection/
  11. Difference Between Dagger, Hilt, Koin and Pure Dependency Injection - GeeksforGeeks, 檢索日期:6月 18, 2025, https://www.geeksforgeeks.org/difference-between-dagger-hilt-koin-and-pure-dependency-injection/
  12. Kotlin dependency injection: Koin vs. Hilt - LogRocket Blog, 檢索日期:6月 18, 2025, https://blog.logrocket.com/kotlin-dependency-injection-koin-vs-hilt/
  13. Page Object Model (POM) - Shariq SP, 檢索日期:6月 18, 2025, https://www.shariqsp.com/mobileTesting/page-object-model.html
  14. Implementation of Page-Object-Model (POM) to Espresso (Native ..., 檢索日期:6月 18, 2025, https://www.testrisk.com/2022/02/implementation-of-page-object-model-pom_01177266742.html
  15. Chapter 7.1 - Page Object in Espresso - Test Automation University, 檢索日期:6月 18, 2025, https://testautomationu.applitools.com/espresso-mobile-testing-tutorial/chapter7.1.html
  16. Brewing Up Reliability: Espresso Test Generation for Android Apps - Iván Arcuschin Moreno, 檢索日期:6月 18, 2025, https://iarcuschin.com/publication/icst-2024/icst-2024.pdf
  17. Maestro | Ministry of Testing, 檢索日期:6月 18, 2025, https://www.ministryoftesting.com/software-testing-tools/maestro
  18. UI Testing with Espresso | CodePath Android Cliffnotes, 檢索日期:6月 18, 2025, https://guides.codepath.com/android/ui-testing-with-espresso
  19. The best mobile E2E testing frameworks in 2025: Strengths, tradeoffs, and use cases, 檢索日期:6月 18, 2025, https://www.qawolf.com/blog/the-best-mobile-e2e-testing-frameworks-in-2025-strengths-tradeoffs-and-use-cases
  20. A Complete Guide to Espresso Android Testing - Kobiton, 檢索日期:6月 18, 2025, https://kobiton.com/blog/a-complete-guide-to-espresso-android-testing/
  21. Top UI Testing Tools for Android - BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/guide/ui-testing-tools-for-android
  22. Espresso | Test your app on Android, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing/espresso
  23. Behavior UI Tests | Test your app on Android | Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing/ui-tests/behavior
  24. Big test stability | Test your app on Android - Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing/instrumented-tests/stability
  25. Proper Android UI Testing, 檢索日期:6月 18, 2025, https://android-ui-testing.github.io/Cookbook/basics/ui_testing/
  26. Using Espresso and UIAutomator with Compose in Jetpack Compose - Siberoloji, 檢索日期:6月 18, 2025, https://www.siberoloji.com/using-espresso-and-uiautomator-with-compose-in-jetpack-compose/
  27. Espresso Testing Asynchronous Operations - Tutorialspoint, 檢索日期:6月 18, 2025, https://www.tutorialspoint.com/espresso_testing/espresso_testing_asynchronous_operations.htm
  28. Blog: Espresso Idling Resources - Tudip Technologies, 檢索日期:6月 18, 2025, https://tudip.com/blog-post/espresso-idling-resources/
  29. Android Espresso | Waits with IDLING resources - YouTube, 檢索日期:6月 18, 2025, https://www.youtube.com/watch?v=u6sPrYEO1ZA
  30. BusyBee is an alternative API for IdlingResources in Espresso tests - GitHub, 檢索日期:6月 18, 2025, https://github.com/americanexpress/busybee
  31. Espresso's IdlingResource with Retrofit 2 - android - Stack Overflow, 檢索日期:6月 18, 2025, https://stackoverflow.com/questions/41539325/espressos-idlingresource-with-retrofit-2
  32. PSA: Dont Use Espresso Idling Resources like Google does - Philosophical Hacker, 檢索日期:6月 18, 2025, https://www.philosophicalhacker.com/post/psa-dont-use-esprsso-idling-resources-like-this/
  33. Robolectric strategies | Test your app on Android | Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/training/testing/local-tests/robolectric
  34. Robolectric Tests in Android: Benefits and Drawbacks - TechYourChance, 檢索日期:6月 18, 2025, https://www.techyourchance.com/robolectric-android-benefits-and-drawbacks/
  35. JUnit Tests, 檢索日期:6月 18, 2025, https://chromium.googlesource.com/chromium/src/+/66.0.3359.158/testing/android/docs/junit.md
  36. Unit tests with Mockito - Tutorial - Vogella, 檢索日期:6月 18, 2025, https://www.vogella.com/tutorials/Mockito/article.html
  37. How to do Unit Testing Using Mockito in Android - Tagline Infotech LLP, 檢索日期:6月 18, 2025, https://taglineinfotech.com/blog/unit-testing-using-mockito-android/
  38. Mockito framework site, 檢索日期:6月 18, 2025, https://site.mockito.org/
  39. Getting Started - Appium, 檢索日期:6月 18, 2025, https://appium.github.io/appium.io/docs/en/about-appium/getting-started/index.html
  40. API Documentation - Appium, 檢索日期:6月 18, 2025, https://appium.github.io/appium.io/docs/en/about-appium/api/
  41. appium/appium: Cross-platform automation framework for all kinds of apps, built on top of the W3C WebDriver protocol - GitHub, 檢索日期:6月 18, 2025, https://github.com/appium/appium
  42. Welcome - Appium Documentation, 檢索日期:6月 18, 2025, http://appium.io/
  43. Test your Compose layout | Jetpack Compose | Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/develop/ui/compose/testing
  44. Getting Started With Testing With Compose | Waldo Blog, 檢索日期:6月 18, 2025, https://www.waldo.com/blog/getting-started-with-testing-with-compose
  45. Testing Android Applications Built with Jetpack Compose - Mockingjay, 檢索日期:6月 18, 2025, https://www.mockingjay.io/blog-posts/testing-android-applications-built-with-jetpack-compose
  46. Interoperability | Jetpack Compose - Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/develop/ui/compose/testing/interoperability
  47. mobile-dev-inc/Maestro: Painless E2E Automation for ... - GitHub, 檢索日期:6月 18, 2025, https://github.com/mobile-dev-inc/Maestro
  48. Maestro Mobile UI Testing Framework: A Beginner's Guide (2024) - TestDevLab, 檢索日期:6月 18, 2025, https://www.testdevlab.com/blog/getting-started-with-maestro-mobile-ui-testing-framework
  49. 8 Major Mobile Testing Challenges & Solutions - Testsigma, 檢索日期:6月 18, 2025, https://testsigma.com/blog/8-challenges-of-mobile-app-testing-and-how-to-solve-them/
  50. 15 Challenges in Automation Testing and their Solutions - BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/guide/challenges-in-automated-testing
  51. Firebase Test Lab - Google, 檢索日期:6月 18, 2025, https://firebase.google.com/docs/test-lab
  52. Run tests with Firebase Test Lab for Android - Google Help, 檢索日期:6月 18, 2025, https://support.google.com/firebase/answer/6386654?hl=en
  53. Firebase Test Lab – Marketplace - Google Cloud Console, 檢索日期:6月 18, 2025, https://console.cloud.google.com/marketplace/product/google-cloud-platform/firebase-test-lab
  54. Test Android App & Website on Real Android Devices | BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/android-testing
  55. Interactive Mobile App Testing on 2000+ iOS & Android Devices - BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/app-live
  56. Automated App Testing On Real Mobile Devices | BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/app-automate
  57. Android CI/CD using GitHub Actions - LogRocket Blog, 檢索日期:6月 18, 2025, https://blog.logrocket.com/android-ci-cd-using-github-actions/
  58. How to Use Jenkins for Automated Testing: A Practical Guide - TestGrid, 檢索日期:6月 18, 2025, https://testgrid.io/blog/jenkins-test-automation/
  59. Basic CI Workflow For Android using GitHub Actions - GeeksforGeeks, 檢索日期:6月 18, 2025, https://www.geeksforgeeks.org/basic-ci-workflow-for-android-using-github-actions/
  60. TharunBalaji2004/android-ci-cd: DevOps CI/CD pipeline architecture for Android Apps ⚙️ (using GitHub Actions) - Unit Test, Instrumentation Test (espresso), Static Code Analysis (Sonarqube), Gradle Packaging, Signing bundle and automated deployment on Google Play Store - GitHub, 檢索日期:6月 18, 2025, https://github.com/TharunBalaji2004/android-ci-cd
  61. How to Set up Continuous Testing for Android App Development - Bugsee, 檢索日期:6月 18, 2025, https://bugsee.com/blog/how-to-set-up-continuous-testing-for-android-app-development/
  62. Android Emulator Runner · Actions · GitHub Marketplace, 檢索日期:6月 18, 2025, https://github.com/marketplace/actions/android-emulator-runner
  63. Android Emulator Runner - self hosted · Actions · GitHub Marketplace, 檢索日期:6月 18, 2025, https://github.com/marketplace/actions/android-emulator-runner-self-hosted
  64. GitLab CI/CD examples, 檢索日期:6月 18, 2025, https://docs.gitlab.com/ci/examples/
  65. Setting up GitLab CI for Android projects, 檢索日期:6月 18, 2025, https://about.gitlab.com/blog/setting-up-gitlab-ci-for-android-projects/
  66. Tutorial: Android CI/CD with GitLab, 檢索日期:6月 18, 2025, https://about.gitlab.com/blog/android-cicd-with-gitlab/
  67. Working with YAML in GitLab CI from the Android perspective, 檢索日期:6月 18, 2025, https://about.gitlab.com/blog/working-with-yaml-gitlab-ci-android/
  68. Jenkins Pipeline: Examples, Best Practices & Use Cases | BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/guide/jenkins-pipeline
  69. Testing - Jenkins, 檢索日期:6月 18, 2025, https://www.jenkins.io/doc/developer/testing/
  70. How to speed up execution of Android UI tests as part of a CI system - Stack Overflow, 檢索日期:6月 18, 2025, https://stackoverflow.com/questions/41746344/how-to-speed-up-execution-of-android-ui-tests-as-part-of-a-ci-system
  71. Get started with instrumentation tests | Firebase Test Lab - Google, 檢索日期:6月 18, 2025, https://firebase.google.com/docs/test-lab/android/instrumentation-test
  72. Strategies to Handle Flaky Tests | LambdaTest, 檢索日期:6月 18, 2025, https://www.lambdatest.com/blog/strategies-to-handle-flaky-tests/
  73. What is a Flaky Test: Causes, Detect & Fix | BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/test-reporting-and-analytics/features/test-reporting/what-is-flaky-test
  74. FlakeShovel - Detecting flaky tests for Android apps - GitHub, 檢索日期:6月 18, 2025, https://github.com/FlakeShovel/FlakeShovel
  75. Unit test reports - GitLab Docs, 檢索日期:6月 18, 2025, https://docs.gitlab.com/ci/testing/unit_test_reports/
  76. Unit test report examples - GitLab Docs, 檢索日期:6月 18, 2025, https://docs.gitlab.com/ci/testing/unit_test_report_examples/
  77. Code coverage - GitLab Docs, 檢索日期:6月 18, 2025, https://docs.gitlab.com/ci/testing/code_coverage/
  78. Android Test Report Action - GitHub Marketplace, 檢索日期:6月 18, 2025, https://github.com/marketplace/actions/android-test-report-action
  79. Publish Test Results · Actions · GitHub Marketplace, 檢索日期:6月 18, 2025, https://github.com/marketplace/actions/publish-test-results
  80. Actions · GitHub Marketplace - Test Reporter, 檢索日期:6月 18, 2025, https://github.com/marketplace/actions/test-reporter
  81. AI Test Automation Tool - Mabl, 檢索日期:6月 18, 2025, https://www.mabl.com/ai-test-automation
  82. Learn about foldables | Jetpack Compose - Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/develop/ui/compose/layouts/adaptive/foldables/learn-about-foldables
  83. How to Optimize Apps for Foldable Devices: A Developer's Guide - Alphaklick Solutions, 檢索日期:6月 18, 2025, https://www.alphaklick.com/foldable-device-app-optimization-tips/
  84. Large Screens & Foldables - droidcon, 檢索日期:6月 18, 2025, https://www.droidcon.com/2023/02/06/large-screens-foldables/
  85. Make your app fold aware | Jetpack Compose - Android Developers, 檢索日期:6月 18, 2025, https://developer.android.com/develop/ui/compose/layouts/adaptive/foldables/make-your-app-fold-aware
  86. Test against screen configuration changes with the Espresso Device API | Android Studio, 檢索日期:6月 18, 2025, https://developer.android.com/studio/test/espresso-api
  87. Developing a Jetpack Compose app for foldable smartphones - Ippon Blog, 檢索日期:6月 18, 2025, https://blog.ippon.tech/jetpack-compose-foldable-phones
  88. How AI is Enhancing Mobile Test Automation with Appium - Frugal Testing, 檢索日期:6月 18, 2025, https://www.frugaltesting.com/blog/how-ai-is-enhancing-mobile-test-automation-with-appium
  89. Self-Healing Software Systems: Lessons from Nature, Powered by AI - arXiv, 檢索日期:6月 18, 2025, https://arxiv.org/pdf/2504.20093
  90. What is Visual Regression Testing: Technique, Importance | BrowserStack, 檢索日期:6月 18, 2025, https://www.browserstack.com/percy/visual-regression-testing
  91. AI's Impact on Visual Regression Testing - HeadSpin, 檢索日期:6月 18, 2025, https://www.headspin.io/blog/ai-transforming-visual-regression-testing
  92. Argos — The open source visual testing platform, 檢索日期:6月 18, 2025, https://argos-ci.com/
  93. Solving the Top 6 Mobile Automation Challenges Fast (DevAssure Guide) - Test Guild, 檢索日期:6月 18, 2025, https://testguild.com/top-mobile-testing-challenges/
  94. Self Healing Test Automation to Fast Track High Quality Delivery, 檢索日期:6月 18, 2025, https://www.itconvergence.com/blog/self-healing-test-automation-fast-tracking-your-releases/
  95. Momentic: AI Testing Tool | Automated AI Testing, 檢索日期:6月 18, 2025, https://momentic.ai/
  96. Ai-Augmented Self-Healing Automation Frameworks - AIJMR, 檢索日期:6月 18, 2025, https://www.aijmr.com/papers/2024/6/1118.pdf
  97. Low code, AI-powered Functional and Visual Testing - AI-driven E2E automation with code-like flexibility for your most resilient tests - Testim, 檢索日期:6月 18, 2025, https://www.testim.io/blog/functional-and-visual-testing/
  98. Automated UI and Functional Testing - AI-Powered Stability - Testim.io, 檢索日期:6月 18, 2025, https://www.testim.io/
  99. AI-assisted coding | Android Studio, 檢索日期:6月 18, 2025, https://developer.android.com/studio/preview/gemini/ai-code-completion