2014-04-29 152 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(那么错误不会来)。

相关问题