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이라는 기기 그룹에 추가된 2개의 관리 기기를 보여줍니다.

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 관리 기기는 계측 테스트를 실행할 때 CPU 및 메모리 리소스를 줄이도록 최적화된 자동 테스트 기기(ATD)라는 새로운 유형의 에뮬레이터 기기를 지원합니다. 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-Intents를 사용하면 발신 인텐트를 일치시키고 유효성을 검사하거나 실제 인텐트 응답 대신 스텁 응답을 제공할 수도 있습니다.

설정 앱 및 서비스:
  • CarrierConfig
  • EmergencyInfo
  • OneTimeInitializer
  • PhotoTable(화면 보호기)
  • 프로비저닝
  • 설정 앱
  • StorageManager
  • 전화 통신 APN 구성
  • WallpaperCropper
  • WallpaperPicker
이러한 앱은 최종 사용자가 플랫폼 설정을 변경하거나 기기를 설정하거나 기기 저장용량을 관리할 수 있는 GUI를 제공합니다. 이러한 앱은 일반적으로 앱 수준 자동 테스트의 범위를 벗어납니다.


참고: 설정 제공자는 ATD 이미지에서 계속 사용할 수 있습니다.

SystemUI 자동 테스트는 다른 앱 또는 플랫폼은 올바르게 작동한다고 가정하고 자체 앱의 로직에 집중해야 합니다.
AOSP 앱 및 서비스:
  • Browser2
  • 캘린더
  • Camera2
  • 연락처
  • 다이얼러
  • DeskClock
  • Gallery2
  • LatinIME
  • Launcher3QuickStep
  • 음악
  • QuickSearchBox
  • SettingsIntelligence
이러한 앱과 서비스는 일반적으로 앱 코드의 자동 테스트의 범위를 벗어납니다.

테스트 샤딩 사용 설정

Gradle 관리 기기는 테스트 샤딩을 지원합니다. 테스트 샤딩을 사용하면 테스트 모음을 샤드라고 하는 동시에 실행되는 여러 개의 동일한 가상 기기 인스턴스에 분할할 수 있습니다. 테스트 샤딩을 사용하면 추가 컴퓨팅 리소스를 사용하는 대신 총 테스트 실행 시간을 줄일 수 있습니다.

주어진 테스트 실행에서 사용할 샤드의 개수를 설정하려면 gradle.properties 파일에서 다음을 설정합니다.

android.experimental.androidTest.numManagedDeviceShards=<number_of_shards>

이 옵션을 사용하여 테스트를 실행하면 Gradle 관리 기기가 테스트 실행의 각 기기 프로필에 지정된 개수의 샤드를 프로비저닝합니다. 예를 들어 테스트를 3개의 기기로 이루어진 그룹에 배포하고 numManagedDeviceShards를 2로 설정하면 Gradle 관리 기기가 테스트 실행을 위해 총 6개의 가상 기기를 프로비저닝합니다.

테스트가 완료되면 Gradle이 테스트 실행에 사용된 각 샤드별로 .proto 파일에 테스트 결과를 출력합니다.