Cobertura de Código Jacoco en Android Studio
android-studio test-coverage (4)
Estoy tratando de generar el informe de cobertura de código Jacoco. He usado AndroidTestCase para mis clases de prueba.
Descubrí que el uso de testCoverageEnabled es verdadero y el uso predeterminado de android -studio default jacoco, ./gradlew connectedCheck o createDebugCoverageReport crean el porcentaje de casos de prueba exitosos / fallidos, pero ningún informe de cobertura.
Luego probé jacoco {toolVersion "0.7.1.201405082137"}, y task jacocoTestReport (escriba: JacocoReport, MustOn: "testDebug"). He intentado cambiar el valor de Dependencia en varias tareas. El informe muestra 0 (cero) cobertura de prueba, lo cual es imposible porque al menos la mitad de todas las clases se evalúan.
He seguido varias respuestas aceptadas de desbordamiento de pila en los últimos días. El resultado es negativo.
Mi archivo de gradle:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath ''com.android.tools.build:gradle:1.0.0''
}
}
apply plugin: ''com.android.application''
apply plugin: ''jacoco''
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "test.gradle.com.myapplicationtestgradle"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(
''proguard-android.txt''), ''proguard-rules.pro''
}
debug {
testCoverageEnabled true
}
}
jacoco {
version "0.7.1.201405082137"
}
packagingOptions {
exclude ''LICENSE.txt''
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
// exclude auto-generated classes and tests
def fileFilter = [''**/R.class'', ''**/R$*.class'',
''**/BuildConfig.*'', ''**/Manifest*.*'',
''android/**/*.*'']
def debugTree = fileTree(dir:
"${project.buildDir}/intermediates/classes/debug",
excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = fileTree(dir: project.projectDir, includes:
[''**/*.exec'', ''**/*.ec''])
reports {
xml.enabled = true
xml.destination = "${buildDir}/jacocoTestReport.xml"
csv.enabled = false
html.enabled = true
html.destination = "${buildDir}/reports/jacoco"
}
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
androidTestCompile(''junit:junit:4.11'') {
exclude module: ''hamcrest-core''
}
}
Gradle ya tiene soporte incorporado para generar informes de cobertura de prueba y no necesitamos crear configuraciones adicionales ni agregar complementos para generar el informe de cobertura de prueba. Básicamente, lo único que debemos 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 de unidad colocadas 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 un informe visual de la cobertura de prueba, que se puede ver en un navegador web.
Se ve como en la imagen de abajo.
He escrito un artículo sobre el informe de cobertura de prueba en la aplicación de Android y lo publiqué en mi blog hace algún tiempo. Si está interesado en ese tema, puede leerlo en:
- https://web.archive.org/web/20171210224809/http://blog.wittchen.biz.pl/test-coverage-report-for-android-application (blog antiguo, con comentarios del usuario)
- http://wittchen.io/2015/06/03/test-coverage-in-android-applications/ (Nuevo blog, sin comentarios de usuarios)
Actualización (cobertura de prueba unitaria para pruebas robolectricas)
Si desea crear un informe de cobertura de prueba a partir de pruebas de unidad escritas con Robolectric y generar un informe de cobertura de prueba con Jacoco , Travis CI y Codecov.io , eche un vistazo al nuevo artículo en mi blog:
He eliminado por completo Android Studio, Android SDK, Gradle. Luego reinstala todo. Hoy lo hice completamente eliminado Android Studio, Android SDK, Gradle. Luego reinstala todo. Después de eso, acabo de agregar dentro de la aplicación build.gradle.
debug {
testCoverageEnabled true
}
Luego ejecuto ./gradlew connectedChec. Todo funciona perfectamente. El estudio de Android predeterminado Jacoco funciona bien para mí. Creo que también es posible crear una tarea de informe de prueba de jacoco y luego crear una cobertura de código. No sé por qué Gradle y Android Studio no funcionaban anteriormente.
He investigado la forma correcta de obtener el informe de cobertura de código combinado con Jacoco. Puede consultarlo aquí: https://gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba
Usé AndroidStudio 2.2.2 con Gradle 3.2 y Android Gradle Plugin 2.2.2
Veo que ya lo tienes funcionando, sin embargo, hay un método más simple para obtener los datos de ejecución de la prueba unitaria. Recientemente estuve investigando esto también, de hecho hice un informe completo el día de hoy .
En mi situación, no quería crear una tarea de Gradle adicional, ya que quería que el informe se generara como parte del flujo de trabajo existente. Tampoco quise agregar explícitamente el complemento Jacoco, ya que Google ya ha realizado las tareas de Ant. Jacoco para los informes de cobertura de las pruebas de instrumentación.
Además de configurar las propiedades android.jacoco.version
y buildTypes.debug.testCoverageEnabled
, agregué lo siguiente a los argumentos de la JVM testDebug
para generar datos de ejecución:
project.afterEvaluate {
def append = "append=true"
def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec"
testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile"
createDebugCoverageReport.dependsOn testDebug
}
Esto agrega los datos de ejecución de la prueba de unidad al archivo de cobertura generado por connectedAndroidTest
, por lo que su informe refleja las pruebas de instrumentación y las pruebas de unidad, en lugar de cada variante de forma individual.
Tenga en cuenta que connectedAndroidTest
sobrescribe el archivo de cobertura, tenga esto en cuenta al crear su informe. Si la tarea testDebug
no tiene ningún cambio, y ejecuta createDebugCoverageReport
, solo reflejará la cobertura de su prueba de instrumentación. Entonces, haz un cambio en tus Pruebas Unitarias. El comando touch
Linux puede ser útil aquí, aunque todavía no lo he intentado.