2013-08-07 107 views
1

我正在尝试为Java应用程序项目设置代码覆盖率。Gradle jacoco代码覆盖率 - 然后在Jenkins中发布/显示

项目名称:NEWAPP

项目结构:

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

摇篮版本:1.6

环境:Linux的

我有一个从构建获取应用程序(NEWAPP)的依赖关系(即服务的应用程序的构建过程中使用广口瓶)运行gradle这个构建脚本工件库(artifactory/maven for ex),并构建应用程序。

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

我遵循每个Gradle/Jacoco的文档,但似乎没有为jacoco等创建任何报告/ ...文件夹,我可以在其中找到Jacoco覆盖报告所做的事情。

我的问题: 1.为了获得使用单元测试(Junit)的代码覆盖率,我假设我所要做的只是以下内容,它不会要求我在运行单元测试之前启动/停止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这个测试”任务,然后停止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. 作为新摇篮/ Groovy的 - 我不知道我应该写的build.gradle(编译脚本)内码是什么如果涉及到tomcat的启动/停止,则可以使上述集成/单元测试工作。如果有人可以提供一个示例脚本来做到这一点,我会尝试。

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

需要您的建议,以获得一些牵引。

回答

0

得到它工作时是固定的。

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

  • 运行: gradle这个构建jacocoTestReport

  • 构建后您会看到一个新的文件夹“build”。 - 如果只有构建任务被调用,文件夹jacoco会获得classdumps和.exec的创建。 - 文件夹jacoco和jacocoHtml被创建 - 如果双方建立jacocoTestReport被称为

乐趣。

我也看到,这是更好地包括:

中的build.gradle以下部分

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

其他良好的链接:http://forums.gradle.org/gradle/topics/gradle_1_6_jacoco_in_multi_module_build –

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 
    } 
    

    地方开始/ stopTomcat是定制tasks.If你必须留在摇篮1.6,你必须建立一个dependsOn链:

    stopTomcat -dependsOn-> integrationtests -dependsOn-> startTomcat 
    

    我假设博客文章是正确的,我没有任何经验。

  3. 开始/ Tomcat的回采:你能做到这一点的方式是这样

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

    停止脚本可以在一个类似的方式来写。 (在一些在Groovy DOC:Executing

  4. 詹金斯& Jacoco:应在执行jacocoTestReport

+0

我给这是一个尝试。除此之外,我还需要确保我们有测试(特别是集成测试),否则报告仍然会显示为0%。因此,应该有单元/集成测试,我会确保它们存在于项目中。非常感谢皮特的解释。 –

+0

因为我没有使用货物/ gradle构建/提供的tomcat插件,并且想要驻留在我的源代码中的“tomcat”文件夹在服务器上启动实例,我使用此链接来启动/停止tomcat,但它用/不用&(在后台运行)启动tomcat只是挂起,我从来没有达到一体化测试任务。如果我手动终止运行的tomcat实例,那么它会继续,测试失败(因为tomcat被杀死/不可用)并且stopTomcat_local任务也会失败。我创建了以下依赖项结构:stopTomcatLocal - >取决于integrationTest - >取决于startTomcatLocal –

+0

http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html –

相关问题