2015-03-18 12 views
21

Ich versuche, Jacoco Code Coverage Report zu generieren. Ich habe AndroidTestCase für meine Testklassen verwendet.Jacoco Code Coverage in android Studio

Ich habe mit testCoverageEnabled wahr und unter Verwendung von Standard-Android--Studio Standard jacoco gefunden, ./gradlew connectedCheck oder createDebugCoverageReport schaffen den Prozentsatz der erfolgreichen/Testfälle scheitern, aber keine Deckung Bericht.

Dann habe ich jacoco {toolVersion "0.7.1.201405082137"} und Aufgabe jacocoTestReport (Typ: JacocoReport, dependsOn: "testDebug") versucht. Ich habe versucht, den dependsOn-Wert mit verschiedenen Aufgaben zu ändern. Der Bericht zeigt eine Testabdeckung von 0 (Null), was unmöglich ist, da mindestens die Hälfte aller Klassen getestet wird.

Ich habe verschiedene angenommene Antwort von Stapelüberlauf in den letzten paar Tagen gefolgt. Das Ergebnis ist negativ.

Meine gradle Datei:

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

Antwort

12

Ich sehe, dass Sie bereits funktioniert haben, es gibt jedoch eine einfachere Methode zum Abrufen von Komponententestdaten. Ich habe kürzlich darüber nachgedacht, ich habe sogar einen vollständigen Artikel geschrieben earlier today.

In meiner Situation wollte ich keinen zusätzlichen Gradle-Task erstellen, da ich wollte, dass der Bericht als Teil des bestehenden Workflows generiert wird. Ich wollte auch nicht das Jacoco-Plugin explizit hinzufügen, wie Google already dups die Jacoco Ant-Aufgaben für die Coverage-Berichte für Instrumentation Tests.

Neben den Eigenschaften android.jacoco.version und buildTypes.debug.testCoverageEnabled Einstellung, habe ich die folgenden auf die testDebug JVM Argumente Ausführungsdaten zu generieren:

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 
} 

Das die Einheit Testausführungsdaten an die Berichterstattung Datei von connectedAndroidTest erzeugt anhängt, Ihr Bericht bezieht sich also sowohl auf Instrumentationstests als auch auf Komponententests und nicht auf jede einzelne Variante.

Beachten Sie, dass die Coverage-Datei überschreibt, berücksichtigen Sie dies beim Erstellen Ihres Berichts. Wenn die Aufgabe keine Änderungen aufweist und Sie createDebugCoverageReport ausführen, wird nur die Abdeckung des Instrumentation-Tests angezeigt. Ändern Sie also Ihre Komponententests. Der Linux-Befehl touch kann hier nützlich sein, obwohl ich es noch nicht versucht habe.

+0

Bezug nehmend nur, was scheint die kanonische Methode zu sein, um jede Art von Abdeckung Bericht erzeugt zu bekommen, siehe [diese] (http://Stackoverflow.com/q/23795595/269300) SO Frage - für jeden, der hat Probleme, "createDebugCoverageReport" zu erhalten. –

+1

Ich habe diese akzeptierte Antwort bereits gesehen. Ich denke. Sie sind sowohl für Instrumentierungstests als auch für Komponententests geeignet. Ich muss mir die (testDebug.jvMArgs) ansehen. Vielen Dank für die Erläuterung einiger nützlicher Informationen. – user1365169

+0

Dies scheint nicht beide Berichte für mich zusammenzuführen. Es umfasst nur die Abdeckung von Android-Tests, nicht Unit-Tests. Ich benutze verschiedene Geschmacksrichtungen, aber ich habe "project.afterEvaluate" entsprechend geändert. Irgendeine Idee? –

1

ich vollständig entfernt android Studio, android sdk, gradle. Dann installiere alles neu. Heute habe ich Android Studio, Android SDK, Gradle vollständig entfernt. Dann installiere alles neu. Danach habe ich einfach in die App build.gradle eingefügt.

debug { 
    testCoverageEnabled true 
} 

Dann laufe ich ./gradlew connectedChec. Alles funktioniert perfekt. Android Studio Standard Jacoco funktioniert gut für mich. Ich denke, es ist auch möglich, eine jacocoTestReport Aufgabe zu erstellen und Code Coverage zu erstellen. Ich weiß nicht, warum Gradle und Android Studio vorher nicht funktionierte.

38

Gradle verfügt bereits über eine integrierte Unterstützung für die Erstellung von Testberichterstattungsberichten, und wir müssen keine zusätzlichen Konfigurationen erstellen oder Plugins hinzufügen, um Testberichtsberichte zu generieren.Grundsätzlich ist das einzige, was wir tun müssen, ist testCoverageEnabled Parameter true in build.gradle Datei wie folgt festzulegen:

android { 
    buildTypes { 
     debug { 
     testCoverageEnabled = true 
     } 
    } 
} 

Als nächstes können wir die folgende Gradle Aufgabe von CLI ausführen:

./gradlew createDebugCoverageReport 

Auf Windows wir können es wie folgt aus:

gradlew.bat createDebugCoverageReport 

Aufgabe wird Code unseres Projekts in /src/main/java/ analysieren direkten ory- und Unit-Tests im Verzeichnis /src/androidTest/java/. Nachdem diese Aufgabe ausgeführt wird, können wir die Testabdeckung Bericht im folgenden Verzeichnis des Moduls finden:

/build/outputs/reports/coverage/debug/ 

Wenn wir index.html Datei öffnen, können wir einen visuellen Bericht von Testabdeckung sehen, die in einem Web angezeigt werden können Browser.

Es sieht aus wie auf dem Bild unten.

enter image description here

Ich habe einen Artikel über die Testabdeckung Bericht in Android-Anwendung geschrieben und veröffentlicht sie vor einiger Zeit auf meinem Blog. Wenn Sie in diesem Thema interessiert sind, können Sie es lesen:

http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

Update (Einheit Testabdeckung für Robolectric Tests)

Wenn Sie möchten, dass die Testabdeckung Bericht von Unit-Tests erstellen geschrieben mit Robolectric und Testabdeckung Bericht generieren mit Jacoco, Travis CI und Codecov.io, einen Blick auf die neuen artic nehmen Sie bitte le auf meinem Blog:

http://blog.wittchen.biz.pl/test-coverage-report-with-travis-ci-for-robolectric-tests-on-android/

+6

Das einzige Problem, das ich sehe, ist, dass/src/androidTest/java nicht der Standard ist, wenn Sie JUnit in Android Studio verwenden./src/test/java ist das Verzeichnis. Irgendeine Ahnung, wie man dieses Verzeichnis überschreibt? –

+0

In meinem Fall hatte ich alle Tests in '/ src/androidTest/java' und der Testbericht wurde noch korrekt erstellt. Ich habe nicht überprüft, wie es funktioniert, wenn Sie alle Tests auf "/ src/test/java" oder einen Teil der Tests (plain java) in ein Verzeichnis und einen anderen Teil (Android) in das andere Verzeichnis stellen. –

+0

Aber wir müssen verstehen, Android Studio selbst jacoco verwendet, um die Testberichte zu generieren. – dsharew