使用 Gradle 管理的裝置調整測試

Gradle 管理的裝置可提升自動檢測設備測試的一致性、效能和穩定性。這項功能適用於 API 級別 27 及以上級別,可讓您在專案的 Gradle 檔案中設定虛擬測試裝置。建構系統在執行自動化測試時,會使用這些設定對這些裝置進行完全管理,即建立、部署及拆卸這些裝置。

這項功能不僅可讓 Gradle 查看正在執行的測試,也能查看裝置的生命週期,進而以下列方式改善測試體驗的品質:

  • 處理裝置相關問題,確保測試順利執行
  • 利用模擬器快照減少裝置啟動時間和記憶體用量,並在測試之間將裝置還原至清空狀態
  • 快取測試結果並僅重新執行可能提供不同結果的測試
  • 為本機和遠端測試提供一致的測試環境

此外,Gradle 管理的裝置引入了一種稱為自動測試裝置 (ATD) 的新型模擬器裝置,該裝置經過最佳化,可在執行檢測設備測試時提升效能。結合測試資料分割的支援服務,您可以嘗試將測試套件分割至多個 ATD 執行個體,縮短整體測試執行時間。

建立 Gradle 管理的裝置

您可以指定虛擬裝置,讓 Gradle 在模組層級 build.gradle 檔案中測試應用程式。以下程式碼範例會建立搭載 API 級別 30 的 Pixel 2 做為 Gradle 管理的裝置。

Groovy

android {
  testOptions {
    managedDevices {
      devices {
        pixel2api30 (com.android.build.api.dsl.ManagedVirtualDevice) {
          // Use device profiles you typically see in Android Studio.
          device = "Pixel 2"
          // Use only API levels 27 and higher.
          apiLevel = 30
          // To include Google services, use "google".
          systemImageSource = "aosp"
        }
      }
    }
  }
}

Kotlin

android {
  testOptions {
    managedDevices {
      devices {
        maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel2api30").apply {
          // Use device profiles you typically see in Android Studio.
          device = "Pixel 2"
          // Use only API levels 27 and higher.
          apiLevel = 30
          // To include Google services, use "google".
          systemImageSource = "aosp"
        }
      }
    }
  }
}

如要使用您設定的 Gradle 管理裝置執行測試,請使用下列指令。device-name 是您在 Gradle 建構指令碼 (例如 pixel2api30) 中設定的裝置名稱,而 BuildVariant 是要測試的應用程式建構變化版本。

gradlew device-nameBuildVariantAndroidTest

定義裝置群組

為協助您針對多種裝置設定 (例如不同的 API 級別和板型規格) 調整測試,您可以定義多個 Gradle 管理的裝置,並將其新增至已命名群組。然後,Gradle 可以同時為群組中的所有裝置執行測試。

以下範例顯示兩個新增至 phoneAndTablet 裝置群組的受管理的裝置。

Groovy

testOptions {
  managedDevices {
    devices {
      pixel2api29 (com.android.build.api.dsl.ManagedVirtualDevice) { ... }
      nexus9api30 (com.android.build.api.dsl.ManagedVirtualDevice) { ... }
    }
    groups {
      phoneAndTablet {
        targetDevices.add(devices.pixel2api29)
        targetDevices.add(devices.nexus9api30)
      }
    }
  }
}

Kotlin

testOptions {
  managedDevices {
    devices {
      maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel2api29").apply { ... }
      maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("nexus9api30").apply { ... }
    }
    groups {
      maybeCreate("phoneAndTablet").apply {
        targetDevices.add(devices["pixel2api29"])
        targetDevices.add(devices["nexus9api30"])
      }
    }
  }
}

如要使用一組 Gradle 管理的裝置執行測試,請使用下列指令:

gradlew group-nameGroupBuildVariantAndroidTest

使用自動化測試裝置執行測試

Gradle 管理的裝置支援一種新型的模擬器裝置,稱為「自動化測試裝置」(ATD),經過最佳化處理後,此裝置可在執行檢測設備測試時減少耗用的 CPU 和記憶體資源。ATD 可透過下列幾種方式改善執行階段效能:

  • 移除預先安裝的應用程式,這類應用程式通常不適合用來測試
  • 停用通常不適合用來測試應用程式的特定背景服務
  • 停用硬體轉譯功能

開始之前,請務必將 Android Emulator 更新至最新的可用版本。然後在 build.gradle 中定義 Gradle 管理的裝置時指定「-atd」映像檔,如下所示:

Groovy

android {
  testOptions {
    managedDevices {
      devices {
        pixel2api30 (com.android.build.api.dsl.ManagedVirtualDevice) {
          // Use device profiles you typically see in Android Studio.
          device = "Pixel 2"
          // ATDs currently support only API level 30.
          apiLevel = 30
          // You can also specify "google-atd" if you require Google Play Services.
          systemImageSource = "aosp-atd"
        }
      }
    }
  }
}

Kotlin

android {
  testOptions {
    managedDevices {
      devices {
        maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel2api30").apply {
          // Use device profiles you typically see in Android Studio.
          device = "Pixel 2"
          // ATDs currently support only API level 30.
          apiLevel = 30
          // You can also specify "google-atd" if you require Google Play Services.
          systemImageSource = "aosp-atd"
        }
      }
    }
  }
}

您也可以建立裝置群組,就像使用其他 Gradle 管理的裝置一樣。如要進一步發揮效能的改進,您也可以使用 ATD 搭配測試資料分割,以縮短測試套件的總測試執行時間。

已從 ATD 映像檔中移除哪些內容?

除了在無頭模式下運作之外,ATD 也會透過移除/停用通常不適合用於測試應用程式程式碼的應用程式和服務,將效能最佳化。下表概略說明我們在 ATD 映像檔中移除或停用的元件,以及這些元件可能並不實用的原因。

ATD 映像檔已移除的內容 執行自動化測試時,您為何不需要使用這項功能
Google 產品應用程式:
  • 郵件
  • 地圖
  • Chrome
  • 訊息
  • Play 商店和其他項目
您的自動化測試應著重在自家應用程式的邏輯,並假設其他應用程式或平台可正常運作。

透過 Espresso-Intent,您可以比對並驗證傳出意圖,甚至提供虛設常式回應,以取代實際意圖回應。

設定應用程式和服務:
  • CarrierConfig
  • EmergencyInfo
  • OneTimeInitializer
  • PhotoTable (螢幕保護程式)
  • 佈建
  • 「設定」應用程式
  • StorageManager
  • Telephony APN 設定
  • WallpaperCropper
  • WallpaperPicker
這類應用程式會顯示 GUI,讓使用者變更平台設定、設定裝置或管理裝置儲存空間。這通常不在應用程式等級自動化測試的範圍內。


注意事項: ATD 映像檔仍會提供設定提供者

SystemUI 您的自動化測試應著重在自家應用程式的邏輯,並假設其他應用程式或平台可正常運作。
AOSP 應用程式和服務:
  • Browser2
  • 日曆活動
  • 相機2
  • 聯絡人
  • 撥號
  • DeskClock
  • Gallery2
  • LatinIME
  • Launcher3QuickStep
  • 音樂
  • QuickSearchBox
  • SettingsIntelligence
這些應用程式和服務通常不在應用程式程式碼的自動測試範圍內。

啟用測試資料分割

Gradle 管理的裝置支援測試資料分割,可讓您將測試套件分割至多個相同的虛擬裝置執行個體,這些稱為「資料分割」的執行個體會平行執行。使用測試資料分割有助於縮短整體測試執行時間,但代價是會增加額外運算資源。

如要設定用於特定測試執行作業的資料分割數量,請在 gradle.properties 檔案中設定以下內容:

android.experimental.androidTest.numManagedDeviceShards=<number_of_shards>

使用這個選項執行測試時,Gradle 管理的裝置會根據您在測試執行作業中為每個裝置設定檔指定的數量佈建資料分割。舉例來說,如果您將測試內容部署至三個裝置群組,並將 numManagedDeviceShards 設為兩個裝置,Gradle 管理的裝置就會佈建共計六個虛擬裝置進行測試。

測試完成後,Gradle 會在 .proto 檔案中輸出測試結果,以用於測試執行作業中使用的每個資料分割。