【问题标题】:Gradle Exclude pre-built jars and classes while building JaCoCo jacocoTestReport in JenkinsGradle 在 Jenkins 中构建 JaCoCo jacocoTestReport 时排除预构建的 jar 和类
【发布时间】:2018-07-01 14:27:19
【问题描述】:

我有一个基于 Gradle 的项目构建。 现在我向它添加了很多单元测试,并尝试将其集成到 Jenkins 中,以便在构建项目时运行它们,并生成代码覆盖率报告(这就是 JaCoCo 发挥作用的地方)。

我在 build.gradle 中有以下配置:

apply plugin: 'java'
apply plugin: 'application'
apply plugin: "jacoco"

buildDir "out"

repositories {
    maven {
        url "https://internal.corporate.repo.com/"
    }

    flatDir{
        dirs 'resources/lib'
    }

}

sourceSets {
    main {
        java {
            srcDir 'src/'
        }
        resources {
            srcDir 'resources/'
        }
    }
}

jacoco {
    toolVersion = "0.7.5.201505241946"
}

dependencies {
    compile 'org.apache.ant:ant-launcher:1.9.7'
    compile 'org.jdom:jdom:2.0.2'
    compile 'joda-time:joda-time:2.9.3'
    compile 'com.sun.mail:javax.mail:1.5.5'
    compile 'org.json:json:20160212'
    compile 'org.apache.wink:wink-client:1.4'
    compile 'org.apache.wink:wink-common:1.4'
    compile 'org.apache.wink:wink-json-provider:1.4'
    compile 'javax.ws.rs:javax.ws.rs-api:2.0.1' 
    compile 'org.apache.commons:commons-lang3:3.4'
    compile 'com.google.code.gson:gson:2.6.2'
    compile 'org.apache.ant:ant:1.9.7'
    compile 'org.slf4j:slf4j-api:1.7.25'
    compile 'org.apache.logging.log4j:log4j-api:2.9.0'
    compile 'org.apache.logging.log4j:log4j-core:2.9.0'
    compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.9.1'
    compile 'javax.activation:activation:1.1.1'
    compile 'com.opencsv:opencsv:3.7'
    compile 'junit:junit:4+'
    compile name:'ant-soatest'  
    compile name:'ant-junit'
    compile 'commons-cli:commons-cli:1.3.1'
    compile 'org.apache.ant:ant-junit4:1.9.7'
    compile 'commons-io:commons-io:2.5'
    compile 'com.oracle.jdbc:ojdbc7:12.1.0.2'

    compile 'org.apache.commons:commons-configuration2:2.1.1'
    compile 'commons-beanutils:commons-beanutils:1.9.3'
    compile 'com.sun.jersey:jersey-client:1.8'
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.5'
    compile 'jaxen:jaxen:1.1.6'

}

 jacocoTestReport {
    reports {
        xml.enabled true
        csv.enabled true
        html.destination file("${buildDir}/jacocoHtml")
    }
}

test {
    jacoco {
        excludes = ['**/*.class']
    }
    testLogging.showStandardStreams = true 
 }

所以我有两个问题:

  1. 运行测试任务时,输出的test.exec 显示0% 的覆盖率,而我将其导入Eclipse 中的Coverage 选项卡。尽管我知道测试已经运行,但 Gradle 测试结果显示 3 个成功的测试,这就是我继续第二次尝试实际获得覆盖率结果的原因
  2. jacocoTestReport 任务 - 此任务当前出现以下错误:

14:18:03.517 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46) 14:18:03.517 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 原因:: 创建报告时出错

接着是:

14:18:03.520 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 原因: java.io.IOException:分析类时出错 /bld/workspace/some/DEV/really/long/obscure/pathname/appname/out/resources/main/testscripts/Cucumber/target/RenamedCommonDependencies.jar@oracle/jdbc/proxy/oracle$1jdbc$1replay$1driver$1NonTxnReplayableArray $2java$1sql$1Array$$$Proxy.class.

最后是:

原因:java.lang.IllegalStateException: Can't add different class 同名: oracle/jdbc/proxy/oracle$1jdbc$1replay$1driver$1NonTxnReplayableArray$2java$1sql$1Array$$$Proxy 14:18:03.521 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.jacoco.core.analysis.CoverageBuilder.visitCoverage(CoverageBuilder.java:106)

我已经尝试了所有我能想到的,最后看Exclude package from jacoco code coverage for AndroidJaCoCo gradle plugin exclude 我尝试使用/bld/workspace/some/DEV/really/long/obscure/pathname/appname/out/resources/main/testscripts/Cucumber/target/RenamedCommonDependencies.jar 将排除路径更改为绝对路径,但同样的错误

请帮助.. 我浪费了 99% 的开发时间来处理配置,只有 1% 的时间在编写代码... :(

【问题讨论】:

    标签: java jenkins gradle jacoco


    【解决方案1】:

    我认为任务设置不正确应该是这样的

    apply plugin: "application"
    apply plugin: "jacoco"
    
    mainClassName = "org.gradle.MyMain"
    
    jacoco {
        applyTo run
    }
    
    task applicationCodeCoverageReport(type:JacocoReport){
        executionData run
        sourceSets sourceSets.main
    }
    

    你把你的类名放在主类的什么地方,因为你不需要所有系统库的代码覆盖.. 你可以在这里看到一个例子: https://github.com/codecov/example-gradle

    示例和信息可以在这里找到: https://docs.gradle.org/current/userguide/jacoco_plugin.html#sec:configuring_the_jacoco_plugin

    然而, 我认为您赌错了工具... 查看http://pitest.org/

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2017-03-09
      • 2023-03-03
      • 2019-04-11
      相关资源
      最近更新 更多