Android Gradle 플러그인 (AGP)은 기기 내 적용 범위 에이전트를 사용하여 계측 테스트의 코드 적용 범위 보고서를 만들 수 있습니다. 기본적으로 AGP는 앱을 빌드할 때 JaCoCo를 사용하여 앱의 클래스를 계측합니다. 즉, 테스트에서 실행되는 앱의 부분을 기록하는 코드를 추가합니다. 온디바이스 적용 범위 에이전트를 사용하면 AGP가 이 추가 코드 없이 앱을 빌드하고 에이전트는 테스트가 실행되는 동안 테스트 기기에서 앱의 클래스를 계측합니다. 이 페이지에서는 기기 내 코드 적용 범위를 사용 설정하고 보고서를 생성하는 방법을 설명합니다.
빌드 시간 코드 적용 범위와 비교하여 기기 내 코드 적용 범위는 다음과 같은 이점을 제공합니다.
- 더 빠른 빌드: AGP는 앱의 클래스 및 종속 항목에서 JaCoCo 계측 단계를 실행하지 않으므로 빌드 시간을 10~20% 줄일 수 있습니다.
- 더 작은 디버그 APK: AGP는 앱 클래스에 적용 범위 추적 코드를 추가하지 않으므로 디버그 APK를 20~25% 더 작게 만들 수 있습니다.
- 보고서에 사용되지 않는 생성된 클래스 없음: 테스트에서 사용하지 않는 생성된 클래스는 적용 범위 수치를 낮추지 않습니다.
실제 빌드 시간 및 APK 크기 개선은 프로젝트에 따라 다릅니다.
기본 요건
기기 내 코드 적용 범위를 사용하려면 프로젝트와 테스트 기기가 다음 요구사항을 충족해야 합니다.
- AGP 9.6.0-alpha01 이상
- Android 9 (API 수준 28) 이상을 실행하는 기기 또는 에뮬레이터
- 테스트하는 변형의 디버그 가능한 빌드 유형(예: 기본
debug빌드 유형) 에이전트는 디버그 가능한 앱에만 연결할 수 있습니다. AndroidJUnitRunner또는 이를 확장하는 맞춤 테스트 실행기로 실행되는 계측 테스트
기기 내 코드 적용 범위 사용 설정
기기 내 코드 적용 범위는 빌드 시간 코드 적용 범위와 동일한 enableAndroidTestCoverage 속성을 사용합니다. 노출 범위 보고서를 가져오려는 각 변형의 모듈 수준 빌드 파일에서 enableAndroidTestCoverage를 true로 설정합니다.
Kotlin
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage = true
}
}
}
Groovy
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage true
}
}
}
그런 다음 프로젝트의 gradle.properties 파일에서 기기 내 적용 범위 에이전트 및 보고서 집계를 사용 설정합니다.
android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true
기기 내 코드 적용 범위는 통합 코드 적용 범위 보고서와 동일한 렌더기로 HTML 보고서를 생성하므로 두 속성이 모두 필요합니다.
기기 내 코드 적용 범위 보고서 생성
계측 테스트를 실행하고 범위 보고서를 생성하려면 기기를 연결하거나 에뮬레이터를 시작한 후 다음 작업을 실행합니다.
| 보장 범위 | 명령어 | 보고서 위치 |
|---|---|---|
| 변형 1개 | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
빌드 시간 코드 적용 범위와의 차이점
기기 내 적용 범위 보고서와 빌드 시간 적용 범위 보고서는 동일한 테스트에 대해 서로 다른 결과를 표시할 수 있습니다. 두 보고서를 비교하거나 적용 범위 기준점을 한 보고서에서 다른 보고서로 이동할 때는 다음 차이점에 유의하세요.
| 영역 | 빌드 시간 코드 적용 범위 | 온디바이스 코드 적용 범위 |
|---|---|---|
| 클래스가 계측되는 경우 | AGP가 JaCoCo를 사용하여 앱을 빌드할 때 | 테스트가 실행되는 동안 테스트 기기에서 적용 범위 에이전트를 사용합니다. |
| 보고서의 클래스 | 모듈의 모든 클래스 | 테스트가 실행되는 동안 로드되는 모듈 네임스페이스의 클래스만 포함되므로 커버리지 비율이 더 높을 수 있습니다. |
| 명령어 수 | Java 바이트 코드 명령어 | DEX 바이트 코드 명령어 |
| 분기 수 | Java 바이트 코드의 분기 | DEX 바이트 코드의 브랜치입니다. D8은 조건을 여러 분기로 컴파일할 수 있으며 각 도구는 컴파일러에서 생성된 여러 분기를 제외하므로 개수가 다를 수 있습니다. |
| 카운터 | 명령어, 분기, 줄, 복잡성, 메서드, 클래스 | 명령어, 브랜치, 줄, 메서드, 클래스 복잡성 카운터는 아직 지원되지 않습니다. |
| 테스트 기기 | 앱에서 지원하는 모든 API 수준 | Android 9(API 수준 28) 이상 |
| 원시 적용 범위 데이터 | 파일 .ec개 |
coverage_metadata.pb 및 coverage_hits.pb 파일 |
빌드 시간 코드 적용 범위로 다시 전환하려면 android.experimental.androidTest.coverage.useOnDeviceAgent=false를 설정하거나 속성을 삭제합니다. 빌드 파일이나 실행하는 작업을 변경할 필요가 없습니다.
알려진 문제
기기 내 코드 적용 범위에는 다음과 같은 알려진 문제가 있습니다.
- 로드되지 않는 클래스: 테스트가 실행되는 동안 로드되지 않는 클래스는 보고서에 표시되지 않습니다. 빌드 시간 코드 적용 범위 보고서에는 적용 범위가 0% 로 표시됩니다.
- 집계된 보고서: 프로젝트에서 단위 테스트와 같은 호스트 테스트의 적용 범위도 수집하는 경우
testAllSuites및testAllSuitesWithDependencies작업에서 생성하는 집계된 적용 범위 보고서는 이러한 테스트의 자바 바이트 코드 수와 에이전트의 DEX 바이트 코드 수를 결합합니다. 둘 사이의 차이점으로 인해 집계된 명령어 및 분기 수는 빌드 시간 코드 적용 범위 보고서의 수와 다를 수 있습니다.
Issue Tracker를 통해 다른 의견과 문제를 신고합니다.