2014-04-29 151 views
9

我正在嘗試將jacoco集成到我們的ant構建中,並使用一個簡單的測試項目對其進行評估。Jacoco - 零覆蓋率

編譯和其他輸出看起來很有希望,但是當我查看覆蓋時,它始終爲零。

package alg; 

public class SpecialAlgorithm { 
    public SpecialAlgorithm() {} 

    public int uncoveredMethod(int i) { 
     return i * i; 
    } 

    public int sum(int i, int j) { 
     return i + j; 
    } 
} 

測試用例:

package alg; 

import static org.junit.Assert.assertEquals; 
import org.junit.Test; 
import alg.SpecialAlgorithm; 

public class SpecialAlgorithmTest { 
    @Test 
    public void testSum() { 
     SpecialAlgorithm alg = new SpecialAlgorithm(); 
     int sum = alg.sum(1, 2); 
     assertEquals(3, sum); 
    } 
} 

Ant腳本:

<project xmlns:jacoco="antlib:org.jacoco.ant" name="Code Coverage with JaCoCo" 
    default="rebuild"> 
    <property name="src.dir" location="../java" /> 
    <property name="test.dir" location="../../test/java" /> 
    <property name="result.dir" location="c:/temp/jacoco/target" /> 
    <property name="result.classes.dir" location="${result.dir}/classes" /> 
    <property name="result.report.dir" location="${result.dir}/site/jacoco" /> 
    <property name="result.exec.file" location="${result.dir}/jacoco.exec" /> 
    <!-- Step 1: Import JaCoCo Ant tasks --> 
    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> 
     <classpath path="../../../lib/jacocoant.jar" /> 
    </taskdef> 
    <target name="clean"> 
     <delete dir="${result.dir}" /> 
     <mkdir dir="${result.dir}" /> 
     <mkdir dir="${result.dir}/site/jacoco/" /> 
    </target> 
    <target name="compile" depends="clean"> 
     <mkdir dir="${result.classes.dir}" /> 
     <javac srcdir="${src.dir}" destdir="${result.classes.dir}" 
      debug="true" includeantruntime="false"> 
      <classpath> 
       <pathelement location="${result.classes.dir}" /> 
      </classpath> 
     </javac> 
    </target> 
    <target name="test" depends="compile"> 
     <taskdef name="junit" 
      classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"> 
      <classpath> 
       <pathelement location="../../../lib/junit.jar" /> 
       <pathelement location="../../../bin" /> 
       <pathelement location="${result.classes.dir}" /> 
      </classpath> 
     </taskdef> 

     <jacoco:coverage destfile="${result.dir}/jacoco.exec" 
      xmlns:jacoco="antlib:org.jacoco.ant"> 
      <junit fork="yes" forkmode="once" dir="." failureProperty="test.failed"> 
       <classpath> 
        <pathelement location="../../../lib/junit.jar" /> 
        <pathelement location="../../../bin" /> 
        <pathelement location="${result.classes.dir}" /> 
       </classpath> 

       <formatter type="xml" /> 
       <batchtest todir="${result.report.dir}"> 
        <fileset dir="${test.dir}"/> 
       </batchtest> 
      </junit> 
     </jacoco:coverage> 
     <!-- Step 3: Create coverage report --> 
     <jacoco:report> 
      <!-- This task needs the collected execution data and ... --> 
      <executiondata> 
       <file file="${result.exec.file}" /> 
      </executiondata> 
      <!-- the class files and optional source files ... --> 
      <structure name="JaCoCo Ant Example"> 
       <classfiles> 
        <fileset dir="../../../bin" /> 
       </classfiles> 
       <sourcefiles encoding="UTF-8"> 
        <fileset dir="${src.dir}" /> 
       </sourcefiles> 
      </structure> 
      <!-- to produce reports in different formats. --> 
      <html destdir="${result.report.dir}" /> 
      <csv destfile="${result.report.dir}/report.csv" /> 
      <xml destfile="${result.report.dir}/report.xml" /> 
     </jacoco:report> 
    </target> 
    <target name="rebuild" depends="test" /> 
</project> 

UPDATE:在升級到新版本後,我得到一個警告,這可能表明我的錯誤是什麼。

控制檯輸出:

Buildfile: JacocoEvaluation\src\main\resources\coverage.xml 
clean: 
    [delete] Deleting directory c:\temp\jacoco\target 
    [mkdir] Created dir: c:\temp\jacoco\target 
    [mkdir] Created dir: c:\temp\jacoco\target\site\jacoco 
compile: 
    [mkdir] Created dir: c:\temp\jacoco\target\classes 
    [javac] Compiling 1 source file to c:\temp\jacoco\target\classes 
test: 
[jacoco:coverage] Enhancing junit with coverage 
[jacoco:report] Loading execution data file c:\temp\jacoco\target\jacoco.exec 
[jacoco:report] Writing bundle 'JaCoCo Ant Example' with 1 classes 
[jacoco:report] Classes in bundle 'JaCoCo Ant Example' do no match with execution data. For report generation the same class files must be used as at runtime. 
[jacoco:report] Execution data for class alg/SpecialAlgorithm does not match. 
rebuild: 
BUILD SUCCESSFUL 
Total time: 1 second 

的目錄結構(像行家):

主/ JAVA /類來測試 測試/ JAVA /測試用例

任何想法,我做錯了?該插件工作正常。

更新:現在有效。我在報告結構中引用了錯誤的目錄。新版本的jacoco打印出警告,幫助發現問題。

+0

您正在將''的結果輸出到'$ {result.dir}/jacoco.exec',然後''正在查看'$ {result.exec.file }在編寫報告時。這兩個變量指向同一個地方嗎? (你沒有足夠的螞蟻腳本來告訴我。)你應該考慮使用一個變量來減少這種不匹配的風險。 – dcsohl

+0

我確信這與https://issues.jenkins-ci.org/browse/JENKINS-22716有關;我在Jenkins安裝中遇到同樣的問題。 – Bombe

+0

沒有詹金斯參與atm。我嘗試了路由到jacoco.exec的錯誤路徑,然後構建失敗。所以文件被找到了。我在一分鐘後發佈整個腳本。多謝你們! – mkuff

回答

3

我在報告結構中引用了錯誤的目錄。新版本的jacoco打印出警告,幫助發現問題。在原始文章中更正了我的腳本。也許它有助於某人。

1

這很奇怪。就我而言,我使用Java JDK 1.8.0_45來「gradle clean build」和「gradle jacocoTestReport」。得到了與Oscar上面提到的Gradle相同的錯誤。

jacocoXX.exec文件位於正確的位置。

當JDK是1.8.0_45時運行「gradle clean build」,然後運行JDK 1.7.0_40中的「gradle jacocoTestReport」 - 它的工作方式類似於魅力。

另外一個解決辦法是:如果你想使用JDK 1.8.0_45(即Java8)兩個構建和jacocoTestReport任務,然後調用這樣的:gradle這個-x compileJava -x測試-x類-x testClasses jacocoTestReport(那麼錯誤不會來)。

相關問題