2016-03-01 19 views
16

JaCoCo gradleプラグインを追加したので、アンドロイドプロジェクトのJUnitテストでコードカバレッジレポートを生成したかったのです。それは./gradlew jacocoFullReportを実行して、素晴らしい作品RobolectricテストでJaCoCoが動作しない

apply plugin: 'jacoco' 

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.0.0-beta6' 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
     maven { url "https://oss.sonatype.org/content/repositories/snapshots" } 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

subprojects { prj -> 
    apply plugin: 'jacoco' 

    jacoco { 
     toolVersion '0.7.6.201602180812' 
    } 

    task jacocoReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') { 
     group = 'Reporting' 
     description = 'Generate Jacoco coverage reports after running tests.' 

     reports { 
      xml { 
       enabled = true 
       destination "${prj.buildDir}/reports/jacoco/jacoco.xml" 
      } 
      html { 
       enabled = true 
       destination "${prj.buildDir}/reports/jacoco" 
      } 
     } 

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

     sourceDirectories = files('src/main/java') 
     executionData = files('build/jacoco/testDebugUnitTest.exec') 

     doFirst { 
      files('build/intermediates/classes/debug').getFiles().each { file -> 
       if (file.name.contains('$$')) { 
        file.renameTo(file.path.replace('$$', '$')) 
       } 
      } 
     } 
    } 
} 

jacoco { 
    toolVersion '0.7.6.201602180812' 
} 

task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') { 
    group = 'Reporting' 
    description = 'Generates an aggregate report from all subprojects' 

    //noinspection GrUnresolvedAccess 
    dependsOn(subprojects.jacocoReport) 

    additionalSourceDirs = project.files(subprojects.jacocoReport.sourceDirectories) 
    sourceDirectories = project.files(subprojects.jacocoReport.sourceDirectories) 
    classDirectories = project.files(subprojects.jacocoReport.classDirectories) 
    executionData = project.files(subprojects.jacocoReport.executionData) 

    reports { 
     xml { 
      enabled = true 
      destination "${buildDir}/reports/jacoco/full/jacoco.xml" 
     } 
     html { 
      enabled = true 
      destination "${buildDir}/reports/jacoco/full" 
     } 
    } 

    doFirst { 
     //noinspection GroovyAssignabilityCheck 
     executionData = files(executionData.findAll { it.exists() }) 
    } 
} 

:これは私のプロジェクトレベルbuild.gradleファイルです。しかし残念ながら、RobolectricTestRunnerで実行されるテストでは、カバレッジは報告されません(テストで明示的に呼び出される命令は、カバーされていると報告されていません)。 @RunWith注釈なしでテストするか、MockitoJUnitTestRunnerで実行しても問題はありません。

この問題を解決する助けとなることがあります。

更新1:私はRobolectricGradleTestRunnerを使用する必要があることに気付きました。しかし、それは役に立たなかった。

+0

私はこれは間違いなく可能であることを言いたいが、私はそれを修正する方法は考えてきません。私は古い仕事でRobolectricのコードカバレッジを取得することができましたが、それは1年前です。もうコードにアクセスできなくなりました。申し訳ありませんが私はより多くの助けになることはできません! –

+0

'testCoverageEnabled'以降のバージョンではJacocoを使用していますので、プラグインを適用する必要はありません。プラグインなしで試してみてください。 –

+0

@NikolaDespotoski私は、testCoverageEnabledをtrueに設定することは、接続されたデバイスを必要とするアンドロイド計測テストでのみ機能すると考えています。それがRobolectricを使って回避しようとしているのです。 – Longi

答えて

14

可能な回避策で問題が知られている - の回避策はもう必要ありませんhttps://github.com/jacoco/jacoco/pull/288

それとも0.7.1.201405082137

UPDATE

jacocoバージョンをダウングレードします。 gradleバージョン2.13jacocoバージョン0.7.6.201602180812を使用する必要があります。

更新ルートbuild.gradle

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

task wrapper(type: Wrapper) { 
    gradleVersion = '2.13' 
} 

実行./gradlew wrapper

更新プロジェクトbuild.gradle

apply plugin: 'jacoco' 

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

残念ながら、回避策は私にとってはうまくいかないようです。 – Longi

+0

この場合、あなたにとってプリンシパルでない場合は、jacocoのバージョンを「0.7.1.201405082137」に下げます。あなたがjenkinsの最新のjacocoプラグインを使用すると、それはまだ問題になるかもしれません。また、それをバージョン1.8にダウングレードしてください –

+0

ダウングレードジャココはやりました。私はtravis-ciを使用しており、問題はありません。 – Longi

3

私は、同じ問題に直面していたが、今では、このリンクに従うことによって私のために解決されます

号リンク:この問題のhttps://github.com/robolectric/robolectric/issues/2230

ソリューションは、ここで言及されています

https://github.com/dampcake/Robolectric-JaCoCo-Sample/commit/f9884b96ba5e456cddb3d4d2df277065bb26f1d3

+0

Eugen Martynovは同じことを提案しました。しかし、それは私にとってはうまくいかなかった。 – Longi

1

を、私は同じ問題を持っていました。 jacocoプラグインのバージョンを変更し、includenolocationclassesプロパティを追加しました。ここで働いてjacoco.gradleファイルが(私はGradleのラッパー2.14.1を使用しています)です:

apply plugin: 'jacoco' 

jacoco { 
    toolVersion = "0.7.6.201602180812" 
} 

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

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 } 
    println(buildTypes) 
    println(productFlavors) 
    // When no product flavors defined, use empty 
    if (!productFlavors) productFlavors.add('') 

    productFlavors.each { productFlavorName -> 
     buildTypes.each { buildTypeName -> 
      def sourceName, sourcePath 
      if (!productFlavorName) { 
       sourceName = sourcePath = "${buildTypeName}" 
      } else { 
       sourceName = "${productFlavorName}${buildTypeName.capitalize()}" 
       sourcePath = "${productFlavorName}/${buildTypeName}" 
      } 
      def testTaskName = "test${sourceName.capitalize()}UnitTest" 
      println("SourceName:${sourceName}") 
      println("SourcePath:${sourcePath}") 
      println("testTaskName:${testTaskName}") 
      // 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") 
       println("${project.buildDir}/jacoco/${testTaskName}.exec") 
       reports { 
        xml.enabled = true 
        html.enabled = true 
       } 
      } 
     } 
    } 
} 
関連する問題