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 tu APK de depuración sea entre un 20% y un 25% más pequeño.
  • No hay clases generadas sin usar en los informes: Las clases generadas que no usan tus pruebas no disminuyen tus números de cobertura.

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 a 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, usa JaCoCo En el dispositivo de prueba mientras se ejecutan las pruebas, con el agente de cobertura
Clases del informe Todas las clases de tu módulo Solo las clases del espacio de nombres de tu módulo que se cargan mientras se ejecutan las pruebas, de modo que los porcentajes de cobertura puedan ser más altos
Recuentos de instrucciones Instrucciones de código de bytes de Java Instrucciones de código de bytes 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 de lado 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:

  • Clases que no se cargan: Las clases que nunca se cargan mientras se ejecutan las pruebas no aparecen en el informe. Los informes de cobertura de código en el tiempo de compilación los muestran con un 0% de cobertura.
  • Informes agregados: Si tu proyecto también recopila la cobertura de las pruebas de 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 que se muestran en 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.