Gradle jacoco代码覆盖 - 然后在Jenkins中发布/显示

时间:2013-08-07 14:44:42

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

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

项目名称:NewApp

项目结构:

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

Gradle版本:1.6

环境:Linux

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

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

我按照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 - to获取代码覆盖率报告。在其他博客文章中,我还发现应该在tomcat启动之前设置JAVA_OPTS变量来分配jacoco代理。
  2. for ex:设置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的新手 - 我不确定在build.gradle(构建脚本)中应该编写什么代码,以便在涉及tomcat的启动/停止时进行上述Integration / Unit测试。如果有人可以提供示例脚本来执行此操作,我会尝试。

    2. 我现在没有获得任何代码覆盖,当我在Jenkins中发布Jacoco代码覆盖率时(使用Jenkins post build action发布Jacoco报告)。 Jenkins构建仪表板显示0%代码覆盖率(即显示所有红色的条形图,实际代码覆盖率不显示绿色)。

    3. 需要你的建议才能对此有所了解。

2 个答案:

答案 0 :(得分:0)

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

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

    gradle jacocoTestReport
    
    没有jacocoTestReport gradle的

    不会触发jacoco生成报告。

    关于你的代码片段还有一件事。我假设您已将默认主要源集更改为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 doc:Executing

  4. 詹金斯&amp; Jacoco:执行jacocoTestReport

  5. 时应该修复

答案 1 :(得分:0)

搞定了。

Gradle 1.7   - 下载包含二进制文件/ src和文档的.zip。   - 转到文件夹:如果你在C:\ gradle-1.7解压缩上面的.zip  C:\ gradle这个-1.7 \样品\测试\ jacoco \快速启动

  • 执行命令 gradle build jacocoTestReport

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

玩得开心。

我还看到最好包括:

build.gradle中的以下部分

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