Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android test code coverage with JaCoCo Gradle plugin

I'm new to Gradle and Android testing but I've already converted my Android project to build with Gradle.

Now I'm trying to perform test coverage of an Android project with Gradle's JaCoCo plugin.

I've added the following to my build.gradle file:

apply plugin: 'jacoco' 

And when I run "gradle jacocoTestReport" the following error:

Task 'jacocoTestReport' not found in root project '<project name>'. 

From the documentation I'm supposed to also apply plugin 'java' but it conflicts with plugin 'android'.

Is there a way around this?

Thanks in advance.

like image 382
Henrique Rocha Avatar asked Aug 21 '13 13:08

Henrique Rocha


People also ask

How do I check code coverage with JaCoCo?

To get code coverage reports in a Maven project, we first need to set up the JaCoCo Maven plugin for that project. By integrating the JaCoCo plugin, the results of the code coverage analysis can be reviewed as an HTML report. The current version of the JaCoCo-Maven plugin can be downloaded from the MVN Repository.


1 Answers

Here is how I'm using Jacoco:

buildscript {   repositories {     mavenLocal()     mavenCentral()   }   dependencies {     classpath 'com.android.tools.build:gradle:0.12.+'     classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'   } }  apply plugin: 'com.android.application' apply plugin: 'robolectric' apply plugin: 'jacoco'  android {   compileSdkVersion 20   buildToolsVersion "20.0.0"    defaultConfig {     applicationId "YOUR_PACKAGE_NAME"     minSdkVersion 10     targetSdkVersion 20     testHandleProfiling true     testFunctionalTest true   }   buildTypes {     debug {       testCoverageEnabled false     }     release {       runProguard false       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'     }   }   jacoco {     version "0.7.1.201405082137"   }   packagingOptions {     exclude 'META-INF/DEPENDENCIES.txt'     exclude 'META-INF/LICENSE.txt'     exclude 'META-INF/NOTICE.txt'     exclude 'META-INF/NOTICE'     exclude 'META-INF/LICENSE'     exclude 'META-INF/DEPENDENCIES'     exclude 'META-INF/notice.txt'     exclude 'META-INF/license.txt'     exclude 'META-INF/dependencies.txt'     exclude 'META-INF/LGPL2.1'     exclude 'META-INF/services/javax.annotation.processing.Processor'     exclude 'LICENSE.txt'   } }  robolectric {   include '**/*Test.class'   exclude '**/espresso/**/*.class'    maxHeapSize "2048m" }  jacoco {   toolVersion "0.7.1.201405082137" }  // Define coverage source. // If you have rs/aidl etc... add them here. def coverageSourceDirs = [     'src/main/java', ]  task jacocoTestReport(type: JacocoReport, dependsOn: "connectedDebugAndroidTest") {   group = "Reporting"   description = "Generate Jacoco coverage reports after running tests."   reports {     xml.enabled = true     html.enabled = true   }   classDirectories = fileTree(       dir: './build/intermediates/classes/debug',       excludes: ['**/R*.class',                  '**/*$InjectAdapter.class',                  '**/*$ModuleAdapter.class',                  '**/*$ViewInjector*.class'       ])   sourceDirectories = files(coverageSourceDirs)   executionData = files("$buildDir/jacoco/testDebug.exec")   // Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174.   // We iterate through the compiled .class tree and rename $$ to $.   doFirst {     new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->       if (file.name.contains('$$')) {         file.renameTo(file.path.replace('$$', '$'))       }     }   } }   dependencies {   androidTestCompile('junit:junit:4.11') {     exclude module: 'hamcrest-core'   }   androidTestCompile('org.robolectric:robolectric:2.3') {     exclude module: 'classworlds'     exclude module: 'maven-artifact'     exclude module: 'maven-artifact-manager'     exclude module: 'maven-error-diagnostics'     exclude module: 'maven-model'     exclude module: 'maven-plugin-registry'     exclude module: 'maven-profile'     exclude module: 'maven-project'     exclude module: 'maven-settings'     exclude module: 'nekohtml'     exclude module: 'plexus-container-default'     exclude module: 'plexus-interpolation'     exclude module: 'plexus-utils'     exclude module: 'wagon-file'     exclude module: 'wagon-http-lightweight'     exclude module: 'wagon-http-shared'     exclude module: 'wagon-provider-api'     exclude group: 'com.android.support', module: 'support-v4'   } } 

The above code also contains a workaround for https://code.google.com/p/android/issues/detail?id=69174.

More details: http://chrisjenx.com/gradle-robolectric-jacoco-dagger/

like image 52
Hieu Rocker Avatar answered Oct 12 '22 09:10

Hieu Rocker