2013-08-07 82 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 –

相關問題