2015-01-22 7 views
15

Ich habe versucht, Jacoco Testabdeckung für einige Zeit ruhig jetzt laufen. Ich habe in diesen Themen berichteten mehrere mögliche Lösungen versucht:Jacoco Code Abdeckung in Android Studio mit Aromen

Android test code coverage with JaCoCo Gradle plugin

How do I get a jacoco coverage report using Android gradle plugin 0.10.0 or higher?

Im die Tests in einem emulatated Gerät läuft genymotion verwenden. Hier ist, was ich build.gradle hinzugefügt:

apply plugin: 'jacoco' 

android{  
    jacoco { 
     version "0.7.1.201405082137" 
    }   
    buildTypes{ 
     debug{ 
        testCoverageEnabled = true 
     } 
    } 
} 

jacoco { 
    toolVersion "0.7.1.201405082137" 
} 

es auszuführen verwende ich so etwas wie

./gradlew clean 
./gradlew createFLAVOR_NAMEDebugCoverageReport 

Die entsprechende generierten Dateien/Ordner sind:

/build/intermediates/coverage-instrumented-classes 
/build/intermediates/jacoco 
/build/outputs/code-coverage/connected/flavors/MyFlavor/coverage.ec 

Allerdings gibt ist nichts @ build/reports/jacoco/test/html/index.html oder irgendein HTML-Seite/Code Coverage Report @/Build/Ausgaben.

Ich habe auch versucht, eine spezielle Aufgabe zu erstellen Berichterstattung Bericht zu erstellen:

def coverageSourceDirs = [ 
    'src/main/java', 
] 

task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTestFLAVOR_NAMEDebug") { 
    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/connectedAndroidTestMyFlavorDebug.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('$$', '$')) 
      } 
     } 
    } 
} 

Dann ./gradlew sauber und ./gradlew jacocoTestReport. Die Ausgabe ist die gleiche wie oben, also keine HTML-Seite mit Deckungsbericht oder eine andere Coverage-Datei.

Ich verwende derzeit Android Studio v1.0.2 mit der neuesten Version. Ich bin ziemlich neu zu groß, so ist es möglich, dass ich etwas Grundlegendes hier vermisse.

Dank

+2

https://github.com/bumptech/glide/blob/master/library/build.gradle Sampl mit Ihrem Werkzeug. –

+0

mögliches Duplikat von [Wie bekomme ich Code-Coverage mit Android Studio?] (Http://stackoverflow.com/questions/18683022/how-to-get-code-coverage-using-android-studio) – 030

Antwort

8

Nach den ganzen Tag verbringen dieses Problem Jagd fand ich heraus, was das Problem ist. Im Gegensatz zu den Beispielen, die ich gesehen habe, ist die Datei, die vom testDebug-Build generiert wird, nicht die .exec-Datei @$ buildDir/jacoco/testDebug.exec.

Mit meinem gradle und Studio-Version der Datei erzeugt wird, ist ein .ec @build/Ausgänge/code-coverage/verknüpften/Aromen/myFlavor/coverage.ec

ich nicht alle relevanten Informationen gefunden haben ähnliche dazu. Es kann jedoch eine kürzlich erfolgte Änderung sein, indem ich eine benutzerdefinierte JacocoReport-Aufgabe erstelle und die Variable executionData entsprechend ändere, um das Problem zu lösen. Hier ist meine Umsetzung:

task jacocoTestReport(type: JacocoReport) { 

    def coverageSourceDirs = [ 
     'src/main/java' 
    ] 

    group = "Reporting" 
    description = "Generates Jacoco coverage reports" 
    reports { 
     xml{ 
      enabled = true 
      destination "${buildDir}/reports/jacoco/jacoco.xml" 
     } 
     csv.enabled false 
     html{ 
      enabled true 
      destination "${buildDir}/jacocoHtml" 
     } 
    } 

    classDirectories = fileTree(
      dir: 'build/intermediates/classes', 
      excludes: ['**/R.class', 
        '**/R$*.class', 
        '**/BuildConfig.*', 
        '**/Manifest*.*', 
        '**/*Activity*.*', 
        '**/*Fragment*.*' 
      ] 
) 

    sourceDirectories = files(coverageSourceDirs) 
    additionalSourceDirs = files(coverageSourceDirs) 
    executionData = files('build/outputs/code-coverage/connected/flavors/smartcompanion/coverage.ec') 
} 
+1

Mit all diesen Hinweisen habe immer noch eine Codeabdeckung von 0% in den Testberichten, obwohl ich eine Aktivität testen lasse. Aber meine Berichte befinden sich in '' {buildDir}/reports/coverage/debug'' und nicht in '' {buildDir}/reports/jacoco/jacoco.xml'' oder '' {buildDir}/jacocoHtml'' . Ich habe bereits viel Zeit für die Integration von Jacoco Code Coverage in meine Instrumentation Tests aufgewendet und viele Beschreibungen in Posts verwendet. Aber es läuft immer noch nicht richtig. Was seltsam ist, ist dass meine '' coverage.ec'' Datei leer ist. – unlimited101

+0

Sollte dieser Auszug alle Fragmente und Aktivitäten ausschließen? Es könnte Code geben, der dort getestet werden muss. – Theo

0

Testbericht Abdeckung Jacoco mit Android Flavors mit:

Betrachten wir Sie Aromen namens "frei" und "bezahlt"

  • Schritt 1 haben: Erstellen Sie die Datei jacoco.gradle in Ihrem Projektmodul-Verzeichnis (standardmäßig app), wo build.gradle vorhanden ist, sollte es neben build.gradle-Datei sein. Verzeichnisstruktur wie unten gezeigt

    app> jacoco.gradle

  • Schritt 2: Fügen Sie unter Code in der Datei, die wir in Schritt 1 erstellt, der Code hat selbsterklärend Kommentare

apply plugin: 'jacoco' 
 

 
jacoco { 
 
    toolVersion = "0.7.5.201505241946" 
 
} 
 
project.afterEvaluate { 
 
    // Grab all build types and product flavors 
 
    def buildTypes = android.buildTypes.collect { type -> 
 
     type.name 
 
    } 
 
    def productFlavors = android.productFlavors.collect { flavor -> 
 
     flavor.name 
 
    } 
 
    // When no product flavors defined, use empty 
 
    if (!productFlavors) productFlavors.add('') 
 

 
    //iterate over the flavors 
 

 
    productFlavors.each { 
 

 
     productFlavorName -> 
 
//iterate over build types like debug,release,prod etc. 
 
     buildTypes.each { 
 

 
      buildTypeName -> 
 
       //sourceName — e.g. freeDebug ,sourcePath — e.g. free/debug 
 
      def sourceName, sourcePath 
 
      if (!productFlavorName) { 
 
       sourceName = sourcePath = "${buildTypeName}" 
 
      } else { 
 
       sourceName = "${productFlavorName}${buildTypeName.capitalize()}" 
 
       sourcePath = "${productFlavorName}/${buildTypeName}" 
 
      } 
 
       // testTaskName —  e.g. testFreeDebugtest task that the coverage task depends on, 
 
      def testTaskName = "test${sourceName.capitalize()}UnitTest" 
 
      // Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest' 
 
      task "${testTaskName}Coverage" (type:JacocoReport, dependsOn: "$testTaskName") { 
 
       group = "Reporting" 
 
       description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build." 
 
       classDirectories = fileTree(
 
         dir: "${project.buildDir}/intermediates/classes/${sourcePath}", 
 
         excludes: [ 
 
           '**/R.class', 
 
           '**/R$*.class', 
 
           '**/*$ViewInjector*.*', 
 
           '**/*$ViewBinder*.*', 
 
           '**/BuildConfig.*', 
 
           '**/Manifest*.*' 
 
         ] 
 
       ) 
 
       def coverageSourceDirs = [ 
 
         "src/main/java", 
 
         "src/$productFlavorName/java", 
 
         "src/$buildTypeName/java" 
 
       ] 
 
       additionalSourceDirs = files(coverageSourceDirs) 
 
       sourceDirectories = files(coverageSourceDirs) 
 
       executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec") 
 
       reports { 
 
        //enables and disable the type of file you need 
 
        xml.enabled = false 
 
        html.enabled = true 
 
       } 
 
      } 
 
     } 
 
    } 
 
}

    zu verstehen
  • Schritt 3: Führen Sie die Befehle unter und aus roid Studio Terminal die Anwendung

    zu bauen ./gradlew montieren reinigen

  • Schritt 4: auf Build sucessfull, unter Befehl ausführen den Testbericht (ändern Sie die Zeichenfolge „testFreeDebugUnitTestCoverage“, um Ihren besonderen Geschmack zu erzeugen/build-Typ für bezahlte Version Befehl Beispiel wird ./gradlew testPaidDebugUnitTestCoverage)

    ./gradlew testFreeDebugUnitTestCoverage

  • Schritt 5 sein:

Es sollte Erfolgsmeldung im Terminal geben, gehen Sie jetzt in das Verzeichnis

>app > build > reports >jacoco >${testName} >look for html or xml file report file 
  • Schritt 6: Jetzt können Sie öffnen und die HTML-Testabdeckung Datei in Browser anzeigen

Best of Luck !!!