¿Cómo obtengo un informe de cobertura de jacoco con Android gradle plugin 0.10.0 o superior?
unit-testing android-gradle (5)
Creé un complemento de código abierto para eso.
Root build.gradle
apply plugin: "com.vanniktech.android.junit.jacoco"
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ''com.vanniktech:gradle-android-junit-jacoco-plugin:0.3.0''
}
}
Entonces simplemente ejecuta
./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
Ejecutará las pruebas JUnit y luego le dará la salida de Jacoco en formato xml y html en el directorio de compilación correspondiente para el tipo de compilación de depuración.
Estoy tratando de obtener un informe de cobertura de prueba usando el complemento Gradle Android 0.10.2. Pero aún no puedo obtener un informe de cobertura después de ejecutar algunas pruebas. (connectedAndroidTest).
mi build.gradle de mi módulo principal es:
apply plugin: ''android''
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
testCoverageEnabled true
}
release {
runProguard false
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.txt''
}
}
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
compile ''com.android.support:appcompat-v7:19.+''
}
y la sección de buildscript del build gradle del proyecto es:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:0.10.+''
}
}
Una vez que ejecuto un gradlew connectedAndroidTest
desde la terminal, puedo encontrar la carpeta de coverage-instrumented-classes
y la carpeta de code-coverage
dentro de la carpeta de build
. Pero no puedo encontrar la carpeta de coverage
en la carpeta de reports
. (Solo que puedo ver es la carpeta androidTests
)
¿Hay algo que falta para obtener un informe de cobertura de Jacobo?
Durante los cientos de veces que busqué la respuesta para obtener un informe de cobertura, finalmente encontré una respuesta exacta de lo que quería.
Desde la publicación de este blog , descubrí que gradlew createDebugCoverageReport
crea el informe de cobertura de jacoco.
Además, desde el código fuente del complemento gradle, el complemento usa jacoco 0.6.2.201302030002 de manera predeterminada. (por lo tanto, no se requiere la definición de la versión de jacoco si va a utilizar una versión predeterminada)
En resumen, los pasos ESENCIALES para obtener un informe de cobertura de jacoco
con el complemento gradle de Android son:
- Android gradle plugin versión 0.10.0 o superior (normalmente en
build.gradle
su proyecto) - agregue
testCoverageEnabled true
al tipo de compilación que desea (es decir,debug
) - ejecutar
$ gradlew createDebugCoverageReport
ogradlew connectedCheck
para obtener un informe de cobertura dejacoco
.
Puede encontrar su informe de cobertura en build/reports/coverage/{buildType}
. (es decir, build/reports/coverage/debug
para la compilación de depuración)
(Agregar un caso de sabores múltiples del comentario de @ odiggity)
Si su proyecto utiliza una configuración de sabores múltiples, use create{flavorName}CoverageReport
lugar. El informe de cobertura se generará en build/reports/coverage/{flavorName}/{buildType}
.
Ejemplo para flavor krInternal con tipo de compilación de depuración :
- Comando:
./gradlew createKrInternalDebugCoverageReport
- El informe se genara en:
build/reports/coverage/krInternal/debug
Propina :
Como solo puede obtener un informe de cobertura con el emulator
y el device with root permission
, obtendrá el siguiente error después de ejecutar un comando en el dispositivo normal (no rooteado):
05:48:33 E/Device: Error during Sync: Permission denied
java.io.IOException: com.android.ddmlib.SyncException: Permission denied
at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:114)
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:158)
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:42)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Caused by: com.android.ddmlib.SyncException: Permission denied
at com.android.ddmlib.SyncService.doPullFile(SyncService.java:511)
at com.android.ddmlib.SyncService.pullFile(SyncService.java:320)
at com.android.ddmlib.Device.pullFile(Device.java:849)
at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:107)
... 10 more
:myDirections:connectedAndroidTest FAILED
FAILURE: Build failed with an exception.
Gradle ya cuenta con soporte integrado para generar informes de cobertura de prueba y no necesitamos crear configuraciones adicionales ni agregar ningún complemento para generar un informe de cobertura de prueba. Básicamente, lo único que tenemos que hacer es establecer el parámetro testCoverageEnabled
en true
en el archivo build.gradle
la siguiente manera:
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
A continuación, podemos ejecutar la siguiente tarea de Gradle desde CLI:
./gradlew createDebugCoverageReport
En Windows, podemos ejecutarlo así:
gradlew.bat createDebugCoverageReport
La tarea analizará el código de nuestro proyecto en el directorio /src/main/java/
y las pruebas unitarias ubicadas en el directorio /src/androidTest/java/
. Después de ejecutar esta tarea, podemos encontrar el informe de cobertura de prueba en el siguiente directorio del módulo:
/build/outputs/reports/coverage/debug/
Cuando abrimos el archivo index.html
, podemos ver el informe visual de la cobertura de la prueba, que se puede ver en un navegador web.
Se ve como en la imagen de abajo.
artículo sobre informe de cobertura de prueba en la aplicación de Android http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/
Si desea usar una versión diferente a la predeterminada, agregue
jacoco {
version = ''0.7.3.201502191951''
}
dentro de la etiqueta de android
en build.gradle
su aplicación.
Una forma de encontrar el último número de versión: busque "org.jacoco: jacoco" en JCenter .
Tengo que agregar una respuesta en lugar de un comentario ya que mi reputación es inferior a 50 ...
Lo que quiero complementar es:
Google lanzó nuevas herramientas de compilación para solucionar el desagradable problema "VerifyError" ( link ).
Intente cambiar su configuración en gradle para usar las últimas herramientas de compilación si encuentra el problema "VerifyError". Por ejemplo,
android {
......
buildToolsVersion ''21.1.1''
.....
}
Dado que las herramientas de compilación 21.0.0 tienen errores, utilice una versión mayor que 21.0.0. Yo uso 21.1.1.