2016-06-25 75 views
7

Cercando di ottenere la copertura del codice sui miei test Robolectric in Android utilizzando Jacoco, ma semplicemente rifiuta di riconoscere i miei test Robolectric durante la creazione dei report.Android - La copertura del codice Jacoco ignora i test di Robolectric

Il mio file jacoco.gradle è la seguente:

apply plugin: 'jacoco' 

jacoco { 
    toolVersion = "0.7.6.201602180812" 
} 

project.afterEvaluate { 

    android.applicationVariants.all { variant -> 
     def name = variant.name 
     def testTaskName = "test${name.capitalize()}UnitTest" 

     tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") { 
      group = "Reporting" 
      description = "Generate Jacoco coverage reports for the ${name.capitalize()} build." 

      classDirectories = fileTree(
        dir: "${project.buildDir}/intermediates/classes/${name}", 
        excludes: ['**/R.class', 
           '**/R$*.class', 
           '**/*$ViewInjector*.*', 
           '**/*$ViewBinder*.*', 
           '**/BuildConfig.*', 
           '**/Manifest*.*'] 
      ) 

      sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs)) 
      executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec") 

      reports { 
       xml.enabled = true 
       html.enabled = true 
      } 
     } 
    } 
} 

Con questa impostazione posso ottenere i rapporti di copertura, ma io ottenere una copertura 0% pur avendo le prove Robolectric in "src/test/java".

Se posso aggiungere nel codice seguente al file:

android { 
    testOptions { 
     unitTests.all { 
      jacoco { 
       includeNoLocationClasses = true 
      } 
     } 
    } 
} 

ottengo il seguente errore quando Gradle cerca di sincronizzare:

Error:No such property: includeNoLocationClasses for class: org.gradle.testing.jacoco.plugins.JacocoTaskExtension_Decorated

so che ho bisogno di avere Gradle 2.13 a utilizzare questo valore includeNoLocationClasses così in graddle-wrapper.properties ho il seguente:

#Wed Apr 10 15:27:10 PDT 2013 
distributionBase=GRADLE_USER_HOME 
distributionPath=wrapper/dists 
zipStoreBase=GRADLE_USER_HOME 
zipStorePath=wrapper/dists 
distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-2.13-20160228000026+0000-all.zip 

Sono abbastanza certo Sto facendo funzionare Gradle 2.13 con la versione plug-in Android 1.5

Nelle mie applicazioni di file Gradle Ho il seguente:

//... 

apply from: 'jacoco.gradle' 

//.. 

testOptions { 
    unitTests.returnDefaultValues = true 
} 

//... 

debug { 
    testCoverageEnabled true 
} 

E il comando che uso per eseguire la copertura è:

./gradlew createDebugCoverageReport

Quindi mi chiedo perché ottengo l'errore includeNoLocationClasses nonostante utilizzi la versione Gradle corretta? E al di fuori di questo forse sto facendo qualcosa di sbagliato dove Jacoco non sta raccogliendo i test di Robolectric in src/test.java?

+0

ho notato che questo codice è ora deprecato (in Gradle-android-plugin 3.x): Android {{ testOptions unitTests.all {{ jacoco includeNoLocationClasses = true }} }} – Alix

+0

Donal, un piccolo aiuto. Mentre sto cercando di eseguire il configure che hai detto che sto ricevendo. ** "Errore: impossibile ottenere la proprietà sconosciuta 'android' per il progetto root 'MyProject' di tipo org.gradle.api.Project." ** Qualche idea sul perché !! – CoDe

+0

Mi dispiace @CoDe Non riesco a ricordare, e il codice su cui stavo lavorando per questo è stato accantonato. Se riesco a ricordare ti farò sapere. –

risposta

6

io non vederti build.gradle completamente, ma di avere quella bandiera in devi:

  1. Usa Gradle2.13+
  2. Usa jacoco0.7.6.201602180812

You' assicurati di utilizzare la versione corretta gradle. Quindi, penso, il problema è solo nell'usare jacoco.

La menzione di jacoco {toolVersion = "0.7.6.201602180812"} non influenza gradino DSL. Si dovrebbe aggiungere più recente jacoco plugin:

buildscript { 
    repositories { 
     jcenter() 
    } 

    dependencies { 
     classpath 'org.jacoco:org.jacoco.core:...' 
    } 
} 

E si dovrebbe applicare plug-in, che si sta già facendo:

apply from: 'jacoco' 

Dopo tale configuraiton non hai bisogno di più jacoco {toolVersion = "..."}.

Nota: considerare l'aggiornamento al più recente plug-in Android gradazione, 2.2.x è già stabile. jacoco ha anche la versione più recente già 0.7.7.201606060606

più Una nota: se si vede di emissione iniziale in Android Studio, verificare che si utilizza involucro di default e verificare di involucro appuntito per Gradle 2.13

+0

Grazie, per impostazione predefinita non stavo usando il wrapper Gradle 2.13, cambiando quello rimosso l'errore Jacoco, tuttavia quando eseguo il comando per ottenere la copertura di prova Jacoco non sta ancora raccogliendo i miei test Robolectric e sta segnalando una copertura dello 0% nonostante i test esistenti per le classi. –

+0

Puoi eseguirlo con '--debug' o' --info'? Potrebbe saltare se non riesce a trovare il file exec. Quindi controlla attentamente i tuoi percorsi –

+0

Quando aggiungo --info al comando che sto vedendo - Esecuzione task: app: connectedDebugAndroidTest '(il controllo aggiornato ha richiesto 0.0 secondi) a causa di: L'attività non ha dichiarato alcun output. Nessun test trovato, niente da fare. Ma penso che il "connesso" significhi che sta guardando in AndroidTest per i test di strumentazione? Non ne ho ancora nessuno, solo i test unitari di Robolectric in app/src/test/java, ogni test viene eseguito con il mio TestRunner che estende RobolectricGradleTestRunner e ogni test annotato con @Test - ci deve essere qualche ragione per cui Jacoco non sta raccogliendo il test? –