JaCoCo doesn't work with Robolectric tests

前端 未结 5 632
Happy的楠姐
Happy的楠姐 2021-01-01 12:38

I wanted to generate code coverage reports on my JUnit tests in my android project so I added the JaCoCo gradle plugin. This is my project level build.gradle fi

5条回答
  •  星月不相逢
    2021-01-01 13:05

    I had the same issue. I changed the jacoco plugin version and added includenolocationclasses property. Here is the working jacoco.gradle file (I am using gradle wrapper 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
                    }
                }
            }
        }
    }
    

提交回复
热议问题