2016-06-25 18 views
7

Ich versuche, Code Coverage auf meinen Robolectric Tests in Android mit Jacoco zu bekommen, aber es weigert sich einfach meine Robolectric Tests zu bestätigen, wenn ich die Berichte erstelle.Android - Jacoco Code Coverage ignoriert Robolectric Tests

Meine jacoco.gradle Datei ist wie folgt:

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 
      } 
     } 
    } 
} 

Mit diesem Setup ich Coverage Berichte erhalten können, aber ich bekomme 0% Deckung trotz Robolectric Tests mit in "src/test/java".

Wenn ich hinzufügen, in dem folgenden Code in diese Datei:

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

bekomme ich folgende Fehlermeldung, wenn Gradle zu synchronisieren versucht:

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

Ich weiß, dass ich muß Gradle 2,13 bis mit diesem Wert includeNoLocationClasses so in graddle-wrapper.properties ich habe folgendes:

#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 

Ich bin mir ziemlich sicher, dass ich Gradle 2.13 Version mit Android-Plugin 1.5

In meiner apps Gradle Datei Ich habe folgendes leite:

//... 

apply from: 'jacoco.gradle' 

//.. 

testOptions { 
    unitTests.returnDefaultValues = true 
} 

//... 

debug { 
    testCoverageEnabled true 
} 

Und der Befehl, den ich die Abdeckung laufen verwenden ist:

./gradlew createDebugCoverageReport

Also frage ich mich, warum bekomme ich den IncludeNoLocationClasses Fehler trotz der Verwendung der richtigen Gradle-Version? Und da mache ich vielleicht etwas falsch, wo Jacoco die Robolectric-Tests in src/test.java nicht aufnimmt?

+0

ich, dass dieser Code bemerkt jetzt veraltet ist (in gradle-android-Plugin 3.x): android { testOptions { unitTests.all { jacoco { includeNoLocationClasses = true } } } } – Alix

+0

Donal, ein wenig Hilfe. Während ich versuche, configure auszuführen, erwähnte ich, dass ich es verstehe. ** "Fehler: Die unbekannte Eigenschaft 'android' konnte für das Stammprojekt 'MyProject' vom Typ org.gradle.api.Project nicht gefunden werden." ** Irgendeine Idee warum !! – CoDe

+0

Sorry @CoDe Ich kann mich nicht erinnern, und der Code, an dem ich gerade arbeitete, wurde zurückgestellt. Wenn ich mich erinnern kann, werde ich es Sie wissen lassen. –

Antwort

6

Ich sehe Sie build.gradle nicht vollständig, aber die Flagge haben, in Sie müssen:

  1. Verwenden gradle2.13+
  2. Verwenden jacoco0.7.6.201602180812

Sie‘ Stellen Sie sicher, dass Sie Gradle richtige Version verwenden. Also, ich denke, das Problem ist nur bei der Verwendung falscher jacoco.

Erwähnung jacoco {toolVersion = "0.7.6.201602180812"} hat keinen Einfluss Gradle DSL. Sie sollten neuere jacoco Plugin hinzufügen:

buildscript { 
    repositories { 
     jcenter() 
    } 

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

Und Sie sollten Plugin anwenden, die Sie bereits tun:

apply from: 'jacoco' 

Nach einer solchen configuraiton Sie nicht mehr jacoco {toolVersion = "..."} brauchen.

Hinweis: in Betracht ziehen, auf neuere Android Gradle Plugin zu aktualisieren, 2.2.x ist bereits stabil. jacoco hat auch neuere Version bereits 0.7.7.201606060606

Noch eine Anmerkung: Wenn Sie Erstausstellung im Android Studio sehen, dass Sie Wrapper standardmäßig verwenden und überprüfen, ob Sie spitzen Wrapper Gradle 2.13

+0

Danke, ich habe nicht standardmäßig den Gradle 2.13 Wrapper benutzt, das hat den Jacoco Fehler entfernt, aber wenn ich den Befehl benutze um die Testabdeckung zu bekommen, nimmt Jacoco immer noch nicht meine Robolectric Tests auf und meldet 0% Abdeckung trotz vorhandener Tests für die Klassen. –

+0

Kannst du es mit '--debug' oder' --info' ausführen? Es kann überspringen, wenn es keine Exec-Datei finden kann. Also überprüfe deine Pfade sorgfältig –

+0

Wenn ich --info zum Befehl hinzufüge, sehe ich das - Ausführen der Aufgabe ': app: connectedDebugAndroidTest' (aktuelle Prüfung dauerte 0.0 Sekunden) wegen: Aufgabe hat keine Ausgaben deklariert. Keine Tests gefunden, nichts zu tun. Aber ich denke, die "verbunden" bedeutet, dass es in androidTest für Instrumentierungstests sucht? Ich habe noch keine von denen, nur Robolectric-Komponententests in app/src/test/java, jeder Test wird mit meinem TestRunner ausgeführt, der RobolectricGradleTestRunner erweitert und jeder Test mit @Test annotiert ist - es muss einen Grund geben, warum Jacoco den nicht aufhebt Tests? –

Verwandte Themen