wake-up-neo.com

Jacoco Code Coverage in Android studio

Ich versuche, einen Jacoco-Bericht zur Codeabdeckung zu erstellen. Ich habe AndroidTestCase für meine Testklassen verwendet.

Ich habe festgestellt, dass mit testCoverageEnabled true und mit default Android -studio default jacoco, ./gradlew connectedCheck oder createDebugCoverageReport den Prozentsatz der erfolgreichen/fehlgeschlagenen Testfälle erstellen, aber keinen Bericht über die Abdeckung.

Dann habe ich es mit jacoco {toolVersion "0.7.1.201405082137"} und der Aufgabe jacocoTestReport (Typ: JacocoReport, dependOn: "testDebug") versucht. Ich habe versucht, den dependOn-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 in den letzten Tagen verschiedene akzeptierte Antworten zum Stapelüberlauf verfolgt. 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'
    }
}
22
user1365169

Ich sehe, dass Sie es bereits zum Laufen gebracht haben, es gibt jedoch eine einfachere Methode zum Abrufen von Unit-Test-Ausführungsdaten. Ich habe kürzlich auch darüber nachgedacht und tatsächlich einen vollständigen Bericht verfasst heute früher .

In meiner Situation wollte ich keine zusätzliche Gradle-Aufgabe erstellen, da der Bericht als Teil des vorhandenen Workflows generiert werden soll. Ich wollte das Jacoco-Plugin auch nicht explizit hinzufügen, da Google bereits verdoppelt die Jacoco Ant-Tasks für die Abdeckungsberichte für Instrumentationstests.

Zusätzlich zum Festlegen der Eigenschaften Android.jacoco.version und buildTypes.debug.testCoverageEnabled Habe ich den JVM-Argumenten testDebug Folgendes hinzugefügt, um 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
}

Dadurch werden die Unit-Test-Ausführungsdaten an die von connectedAndroidTest generierte Coverage-Datei angehängt, sodass Ihr Bericht sowohl Instrumentationstests als auch Unit-Tests und nicht jede Variante einzeln wiedergibt.

Beachten Sie, dass connectedAndroidTest die Coverage-Datei überschreibt. Berücksichtigen Sie dies beim Erstellen Ihres Berichts. Wenn die Aufgabe testDebug keine Änderungen enthält und Sie createDebugCoverageReport ausführen, wird nur die Abdeckung Ihres Instrumentationstests angezeigt. Nehmen Sie also eine Änderung an Ihren Komponententests vor. Der Linux-Befehl touch kann hier nützlich sein, obwohl ich es noch nicht ausprobiert habe.

12
Patrick McLaren

Gradle verfügt bereits über eine integrierte Unterstützung für das Generieren von Testabdeckungsberichten. Es müssen keine zusätzlichen Konfigurationen erstellt oder Plug-ins hinzugefügt werden, um Testabdeckungsberichte zu generieren. Grundsätzlich müssen wir den Parameter testCoverageEnabled wie folgt auf true in der Datei build.gradle Setzen:

Android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}

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

./gradlew createDebugCoverageReport

Unter Windows können wir es folgendermaßen ausführen:

gradlew.bat createDebugCoverageReport

Die Aufgabe analysiert den Code unseres Projekts im Verzeichnis /src/main/Java/ Und die Komponententests im Verzeichnis /src/androidTest/Java/. Nach Ausführung dieser Aufgabe finden wir den Testabdeckungsbericht im folgenden Verzeichnis des Moduls:

/build/outputs/reports/coverage/debug/

Wenn wir die Datei index.html Öffnen, sehen wir einen visuellen Bericht über die Testabdeckung, der in einem Webbrowser angezeigt werden kann.

Es sieht aus wie auf dem Bild unten.

enter image description here

Ich habe in Android application einen Artikel über Testberichte verfasst und ihn vor einiger Zeit in meinem Blog veröffentlicht. Wenn Sie an diesem Thema interessiert sind, können Sie ihn unter folgender Adresse lesen:

Update (Unit Test Coverage für Robolectric Tests)

Wenn Sie Testabdeckungsberichte aus mit Robolectric geschriebenen Komponententests erstellen und Testabdeckungsberichte mit Jacoco , Travis CI und Codecov.io , schauen Sie sich bitte den neuen Artikel auf meinem Blog an:

43
piotr.wittchen

Ich habe Android studio, Android sdk, gradle. Dann alles neu installieren. Heute habe ich Android studio, Android sdk, gradle. Dann alles neu installieren. Danach habe ich gerade in der App build.gradle hinzugefügt.

debug {
    testCoverageEnabled true
}

Dann starte ich ./gradlew connectedChec. Alles funktioniert einwandfrei. Android Studio Standard Jacoco funktioniert gut für mich. Ich denke, es ist auch möglich, eine jacocoTestReport-Aufgabe zu erstellen und dann Code-Coverage zu erstellen. Ich weiß nicht, warum gradle und Android Studio hat vorher nicht funktioniert.

2
user1365169

ich habe nachgeforscht, wie ich mit Jacoco einen Bericht zur Codeabdeckung erhalten kann. Sie können ihn hier überprüfen: https://Gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba

Ich habe AndroidStudio 2.2.2 mit Gradle 3.2 und Android Gradle Plugin 2.2.2

1
ultraon