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

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

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

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

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

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

建立 Gradle 管理的裝置

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

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"
        }
      }
    }
  }
}

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

gradlew device-nameBuildVariantAndroidTest

定義裝置群組

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

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

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)
      }
    }
  }
}

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

gradlew group-nameGroupBuildVariantAndroidTest

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

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

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

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

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"
        }
      }
    }
  }
}

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

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

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

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

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

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


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

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

啟用測試資料分割

Gradle 管理的裝置支援測試資料分割,可讓您將測試套件分割於多個平行執行的平行虛擬裝置執行個體 (稱為「資料分割」)。使用測試資料分割可以協助降低整體測試執行時間,但會增加額外運算資源。

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

android.experimental.androidTest.numManagedDeviceShards=<number_of_shards>

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

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