【问题标题】:Gradle jacoco code coverage - Then publish/show in JenkinsGradle jacoco 代码覆盖率 - 然后在 Jenkins 中发布/显示
【发布时间】:2013-08-09 00:18:37
【问题描述】:

我正在尝试为 Java 应用程序项目设置代码覆盖率。

项目名称:NewApp

项目结构:

  • src/java/**(源代码)
  • src/java-test(单元测试 - Jnuit)
  • test/it-test(集成测试)
  • test/at-tests(验收测试)
  • tomcat/*(包含tomcat启动/停止脚本)
  • xx/.. 等普通应用程序所需的文件夹。

Gradle 版本:1.6

环境:Linux

我有一个正在运行的 gradle 构建脚本,它从构建工件存储库(ex 的工件/maven)获取应用程序 (NewApp) 依赖项(即应用程序用于构建过程的服务 jar),并构建应用程序。

现在,我想为我的 NewApp 应用程序项目使用 JaCoCo 插件获得代码覆盖率。

我按照 Gradle/Jacoco 的文档进行操作,但它似乎没有为 jacoco 等创建任何报告/...文件夹,我可以在其中找到 Jacoco 覆盖报告所做的工作。

我的问题: 1.为了使用单元测试(Junit)获得代码覆盖率,我假设我所要做的就是以下,它不需要我在运行单元测试(测试任务即“gradle test”)之前启动/停止tomcat来获得代码覆盖/通过使用单元测试。请建议/纠正。代码(仅用于 Gradle jacoco 单元测试部分) - 我使用的是:

apply plugin: 'jacoco'

test {
      include 'src/java-test/**'
}

jacocoTestReport {
    group = "reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled true
        html.enabled true
        csv.enabled false
    }
    //classDirectories = fileTree(dir: 'build/classes/main', include: 'com/thc/**')
    //sourceDirectories = fileTree(dir: 'scr/java', include: 'com/thc/**')
    additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}

对于集成测试:

task integrationTest(type: Test) {
        include 'test/java/**'
}

由于 jacocoTestReport 依赖于测试任务,因此它们将首先被调用,然后最终 jacocoTestReport 将报告它发现的代码覆盖率。

  1. 为了获得集成测试的代码覆盖率,我假设我必须先启动 tomcat(即在运行/调用集成测试的测试目标之前),然后调用“gradle integrationTest”或“gradle test”任务,然后停止 tomcat——获取代码覆盖率报告。从其他博客文章中,我还发现应该在 tomcat 启动之前设置 JAVA_OPTS 变量来分配 jacoco 代理。

例如:设置 JAVA_OPTS 变量,例如:

export JACOCO="-Xms256m -Xmx512m -XX:MaxPermSize=1024m -javaagent:/production/jenkinsAKS/jobs/NewApp/workspace/jacoco-0.6.3.201306030806/lib/jacocoagent.jar=destfile=/production/jenkinsAKS/jobs/NewApp/workspace/jacoco/jacoco.exec,append=true,includes=*"
export JAVA_OPTS="$JAVA_OPTS $JACOCO"
  1. 刚接触 Gradle/groovy - 如果涉及启动/停止 tomcat,我不确定我应该在 build.gradle(构建脚本)中编写什么代码才能使上述集成/单元测试正常工作。如果有人可以提供示例脚本来执行此操作,我会尝试。

  2. 当我在 Jenkins 中发布 Jacoco 代码覆盖率时(使用 Jenkins 发布后构建操作发布 Jacoco 报告),我现在没有得到任何代码覆盖率。 Jenkins 构建仪表板显示代码覆盖率为 0%(即条形显示全为红色,实际代码覆盖率无绿色)。

需要您的建议才能对此有所了解。

【问题讨论】:

    标签: unit-testing tomcat gradle code-coverage jacoco


    【解决方案1】:
    1. 问题:我假设您的单元测试不依赖于 tomcat。在这种情况下,你是对的,你不能提前启动 Tomcat。

      要创建您需要执行的覆盖率报告

      gradle jacocoTestReport
      

      没有jacocoTestReport gradle 不会触发 jacoco 生成报告。

      另外一件事,关于你的 sn-p。我假设您已将默认主源集更改为source/java。在这种情况下,您不必设置additionalSourceDirs。

    2. 集成测试:是的,你需要先启动 tomcat,或者至少你必须确保 tomcat 正在运行。你应该看看 Gradle 1.7。它有一个新的任务排序规则,称为finalizedBy

      有了这个,你可以做类似的事情

      task integrationtests(type: Test) {
        dependsOn startTomcat
        finalizedBy stopTomcat
      }
      

      其中 start/stopTomcat 是自定义任务。如果您必须留在 Gradle 1.6 上,则必须构建 dependsOn 链:

      stopTomcat -dependsOn-> integrationtests -dependsOn-> startTomcat
      

      我认为博客文章是正确的,我对此没有任何经验。

    3. 启动/停止 Tomcat :你可以这样做

      task startTomcat() << {
        def tomcatStartScript = "${project.rootDir}/tomcat/startScript"
        tomcatStartScript.execute()
      }
      

      停止脚本可以用类似的方式编写。 (一些来自 Groovy 文档:Executing)

    4. Jenkins & Jacoco : 执行jacocoTestReport时应该修复@

    【讨论】:

    • 我会试试这个。除此之外,我还需要确保我们有测试(特别是集成测试),否则报告仍然会在少数情况下显示 0%。因此,应该有单元/集成测试,我将确保它们存在于项目中。非常感谢皮特的解释。
    • 因为我没有使用 cargo / gradle 构建/提供的 tomcat 插件,并且希望驻留在我的源代码中的“tomcat”文件夹在服务器上启动实例,所以我使用这个链接来启动/停止 tomcat,但它启动带有/不带 & 的 tomcat(在后台运行)只是挂起,我从来没有达到 intergrationTest 任务。如果我手动终止运行 tomcat 的实例,那么它会继续,测试失败(因为 tomcat 被终止/不可用)并且 stopTomcat_local 任务也失败。我创建了以下依赖结构:stopTomcatLocal --> 依赖于 integrationTest --> 依赖于 startTomcatLocal
    【解决方案2】:

    搞定了。

    Gradle 1.7 - 下载包含二进制文件/src 和文档的 .zip。 - 转到文件夹:如果您在 C:\gradle-1.7 解压缩上述 .zip C:\gradle-1.7\samples\testing\jacoco\quickstart

    • 运行: gradle build jacocoTestReport

    • 您将在构建后看到一个新文件夹“build”。 – 如果只调用构建任务,则使用 classdumps 和 .exec 创建文件夹 jacoco。 – 文件夹 jacoco 和 jacocoHtml 被创建 – 如果两者都构建 jacocoTestReport 被调用

    玩得开心。

    我还看到最好包括:

    build.gradle 中的以下部分

    /////
     tasks.withType(Compile) {
     options.debug = true
     options.compilerArgs = ["-g"]
     }
     ////
    

    【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多