Cómo ver informes de cobertura de código (con el agente integrado en el dispositivo)

El complemento de Android para Gradle (AGP) puede crear informes de cobertura de código para tus pruebas de instrumentación con un agente de cobertura integrado en el dispositivo. De forma predeterminada, el AGP instrumenta las clases de tu app con JaCoCo cuando la compila, lo que significa que agrega código que registra qué partes de tu app ejecutan las pruebas. Con el agente de cobertura integrado en el dispositivo, el AGP compila tu app sin este código adicional, y el agente instrumenta las clases de tu app en el dispositivo de prueba mientras se ejecutan las pruebas. En esta página, se describe cómo habilitar la cobertura de código integrada en el dispositivo y generar informes.

En comparación con la cobertura de código en el tiempo de compilación, la cobertura de código integrado en el dispositivo ofrece los siguientes beneficios:

  • Compilaciones más rápidas: El AGP no ejecuta el paso de instrumentación de JaCoCo en las clases de tu app ni en sus dependencias, lo que puede reducir los tiempos de compilación entre un 10% y un 20%.
  • APKs de depuración más pequeños: El AGP no agrega código de seguimiento de cobertura a las clases de tu app, lo que puede hacer que el APK de depuración sea entre un 20% y un 25% más pequeño.

Las mejoras reales en el tiempo de compilación y el tamaño del APK dependen de tu proyecto.

Requisitos previos

Para usar la cobertura de código integrada en el dispositivo, asegúrate de que tu proyecto y tus dispositivos de prueba cumplan con los siguientes requisitos:

  • AGP 9.6.0-alpha01 o una versión posterior
  • Un dispositivo o emulador que ejecute Android 9 (nivel de API 28) o una versión posterior
  • Un tipo de compilación depurable para la variante que pruebes, como el tipo de compilación debug predeterminado El agente solo se puede conectar a apps depurables.
  • Pruebas de instrumentación que se ejecutan con AndroidJUnitRunner o un ejecutor de pruebas personalizado que lo extiende

Habilita la cobertura de código integrada en el dispositivo

La cobertura de código integrada en el dispositivo usa la misma propiedad enableAndroidTestCoverage que la cobertura de código en el momento de la compilación. Establece enableAndroidTestCoverage en true en los archivos de compilación de nivel de módulo para cada variante de la que quieras obtener informes de cobertura:

Kotlin

android {
    // ...
    buildTypes {
        debug {
            // Enable coverage for instrumentation tests
            enableAndroidTestCoverage = true
        }
    }
}

Groovy

android {
    // ...
    buildTypes {
        debug {
            // Enable coverage for instrumentation tests
            enableAndroidTestCoverage true
        }
    }
}

Luego, habilita el agente de cobertura integrado en el dispositivo y la agregación de informes en el archivo gradle.properties de tu proyecto:

android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true

La cobertura de código integrada en el dispositivo genera su informe HTML con el mismo renderizador que los informes de cobertura de código unificados, por lo que requiere ambas propiedades.

Genera informes de cobertura de código integrado en el dispositivo

Para ejecutar tus pruebas de instrumentación y generar informes de cobertura, conecta un dispositivo o inicia un emulador y, luego, ejecuta la siguiente tarea:

Alcance de la cobertura Comando Ubicación desde la que se informó
Una variante ./gradlew :module-name:createVariantNameAndroidTestCoverageReport path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html

Diferencias con la cobertura de código en el momento de la compilación

Los informes de cobertura integrados en el dispositivo y en el tiempo de compilación pueden mostrar resultados diferentes para las mismas pruebas. Ten en cuenta las siguientes diferencias cuando compares los dos informes o cuando muevas los umbrales de cobertura de uno a otro:

Área Cobertura de código en el momento de la compilación Cobertura de código integrada en el dispositivo
Cuándo se instrumentan las clases Cuando el AGP compila tu app con JaCoCo, En el dispositivo de prueba mientras se ejecutan las pruebas, con el agente de cobertura
Clases del informe Todas las clases compiladas, excepto el código anotado como generado, como las fábricas de Dagger Clases con un archivo de origen en las carpetas de origen de tu módulo, incluidas las fábricas de Dagger
Recuentos de instrucciones Instrucciones de código de bytes de Java Instrucciones de código de bytes de DEX
Recuentos de ramas Ramas en el código de bytes de Java Son las ramas en el código de bytes DEX. D8 puede compilar condiciones en diferentes ramas, y cada herramienta deja fuera diferentes ramas generadas por el compilador, por lo que los recuentos pueden diferir.
Contadores Instrucciones, ramas, líneas, complejidad, métodos y clases Instrucciones, ramas, líneas, métodos y clases. Aún no se admiten los contadores de complejidad.
Dispositivos de prueba Todos los niveles de API que admite tu app Android 9 (nivel de API 28) y versiones posteriores
Datos de cobertura sin procesar .ec archivos coverage_metadata.pb y coverage_hits.pb archivos

Para volver a la cobertura de código en el momento de la compilación, establece android.experimental.androidTest.coverage.useOnDeviceAgent=false o quita la propiedad. No es necesario que cambies los archivos de compilación ni las tareas que ejecutas.

Problemas conocidos

La cobertura de código integrada en el dispositivo tiene los siguientes problemas conocidos:

  • Código generado: Los informes integrados en el dispositivo incluyen código generado, como fábricas de Dagger, que los informes de tiempo de compilación suelen omitir. Si tus pruebas no ejecutan este código, se considera que no está cubierto.
  • Informes agregados: Si tu proyecto también recopila la cobertura de las pruebas del host, como las pruebas de unidades, el informe de cobertura agregado que crean las tareas testAllSuites y testAllSuitesWithDependencies combina los recuentos de código de bytes de Java de esas pruebas con los recuentos de código de bytes de DEX del agente. Debido a las diferencias entre ambos, las cantidades agregadas de instrucciones y ramas pueden diferir de las cantidades de los informes de cobertura de código en el momento de la compilación.

Informa cualquier otro comentario o problema a través de la Herramienta de seguimiento de errores.