提问者:小点点

gradle任务Jacoco报告生成空的html报告文件(未指定类文件)


我想使用Jacoco生成我所有测试的代码覆盖率报告(androidTest UnitTest)。

因此,我实现了一个分步脚本(jaoco. gradle)来创建一个任务,该任务允许我生成一个合并两个代码覆盖率报告的报告。

我的问题是html生成的文件是空的(在app\build\jaocoReport\index. html中):

未指定类文件。JaCoCo0.8.3.201901230119

我执行'testIntegrationDebugUnitTest'任务:

>

  • androidTest代码覆盖率报告已在app/build/报告/覆盖/集成/debug/index. html上创建,没问题。

    一个'ec'文件已在app\build\输出\code_coverage\集成DebugAndroidTest\连接\Pixel_2_API_24(AVD)-7.0-coverage.ec

    你知道我的问题来自哪里吗?这是我的代码:

    Jacoco. gradle:

    apply plugin: 'jacoco'
    
    jacoco {
        toolVersion = "$jacocoVersion"
        reportsDir = file("$buildDir/jacocoReport")
    }
    
    project.afterEvaluate {
    
        android.applicationVariants.all { variant ->
            def variantName = variant.name
            def testTaskName = "test${variantName.capitalize()}UnitTest"
            def androidTestCoverageTaskName = "create${variantName.capitalize()}CoverageReport"
    
            tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: ["$testTaskName", "$androidTestCoverageTaskName"]) {
                group = "Reporting"
                description = "Generate Jacoco coverage reports for the ${variantName.capitalize()} build."
    
                reports {
                    xml.enabled = false
                    html.enabled = true
                    html.destination "$buildDir/jacocoReport"
                }
    
                def excludes = ['**/R*.class',
                                '**/*$InjectAdapter.class',
                                '**/*$ModuleAdapter.class',
                                '**/*$ViewInjector*.class'
                ]
    
                def debugTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug", excludes: excludes)
                def mainSrc = "$project.projectDir/src/main/java"
    
                sourceDirectories = files([mainSrc])
                classDirectories = files([debugTree])
                executionData = fileTree(dir: project.buildDir, includes: [
                        "jacoco/${testTaskName}.exec", "outputs/code_coverage/${variantName}AndroidTest/connected/**/*.ec"
                ])
            }
        }
    }
    

    gradle项目:

    buildscript {
        ext.kotlin_version = '1.3.21'
        ext.jacocoVersion = '0.8.3'
    
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.3.2'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            classpath 'io.realm:realm-gradle-plugin:5.8.0'
            classpath 'com.google.gms:google-services:4.2.0'
            classpath 'io.fabric.tools:gradle:1.28.0'
            classpath "org.jacoco:org.jacoco.core:$jacocoVersion"
        }
    }
    
    task installGradle(type: Wrapper) {
        group = "*********"
        gradleVersion = '4.10.1'
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    app gradle:

    apply plugin: 'com.android.application'
    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    apply plugin: 'kotlin-kapt'
    apply plugin: 'realm-android'
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'io.fabric'
    apply from: '../scripts/jacoco.gradle'
    
    android.applicationVariants.all { variant ->
        if (variant.name == 'demoDebug' || variant.name == 'evalDebug' || variant.name == 'stagingDebug') {
            project.tasks.getByName('process' + variant.name.capitalize() + 'GoogleServices').enabled = false
            project.tasks.getByName('fabricGenerateResources' + variant.name.capitalize()).enabled = false
        }
    }
    
    android {
    
        compileSdkVersion 28
        defaultConfig {
            applicationId "***********"
            minSdkVersion 23
            targetSdkVersion 28
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        buildTypes {
            debug {
                testCoverageEnabled true
            }
        }
    }
    
    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'com.android.support:support-v4:28.0.0'
        implementation 'com.android.support:recyclerview-v7:28.0.0'
        implementation 'com.android.support:design:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        implementation 'android.arch.lifecycle:extensions:1.1.1'
        implementation 'com.google.firebase:firebase-core:16.0.8'
        implementation 'com.crashlytics.sdk.android:crashlytics:2.9.9'
    
        testImplementation 'junit:junit:4.12'
        testImplementation 'org.mockito:mockito-core:2.25.1'
        testImplementation 'android.arch.core:core-testing:1.1.1'
    
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
        androidTestImplementation 'org.mockito:mockito-android:2.25.1'
        androidTestImplementation 'android.arch.core:core-testing:1.1.1'
    }
    

  • 共2个答案

    匿名用户

    这是一个常见的问题,您需要将demgTree属性更改为:

    //java compiled classes
    def javaTree = fileTree(dir: "$project.buildDir/intermediates/javac/debug/classes", excludes: fileFilter)
    //kotlin compiled classes
    def kotlinTree = fileTree(dir: "$project.buildDir/tmp/kotlin-classes/debug", excludes: fileFilter)
    //...etc...
    classDirectories.from = files([javaTree, kotlinTree])
    

    debug可以是任何变体,如果您知道自己在做什么,您可以使用$VariantName代替它

    匿名用户

    您是否使用maven配置Jacoco插件,如果为true,请检查配置的路径tag.It应该是目标/类目录的类路径,而不是包路径。

    相关问题