코드 적용 범위 보고서 보기 (기기 내 에이전트 사용)

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를 통해 다른 의견과 문제를 신고합니다.