2016-09-17 122 views
1

我有以下build.xml的Cobertura与Ant脚本的JUnit测试用例失败

<?xml version="1.0" encoding="UTF-8"? 
<project name="Sample" default="coverage" basedir="."> 

    <property file="build.properties" /> 

    <path id="cobertura.classpath"> 
     <fileset dir="lib"> 
      <include name="**/*.jar" /> 
     </fileset> 
    </path> 

    <taskdef classpathref="cobertura.classpath" resource="tasks.properties"/> 

    <target name="init"> 
     <mkdir dir="${classes.dir}" /> 
     <mkdir dir="${instrumented.dir}" /> 
     <mkdir dir="${reports.xml.dir}" /> 
     <mkdir dir="${reports.html.dir}" /> 
     <mkdir dir="${coverage.xml.dir}" /> 
     <mkdir dir="${coverage.summaryxml.dir}" /> 
     <mkdir dir="${coverage.html.dir}" /> 
    </target> 

    <target name="compile" depends="init"> 
     <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes" includeantruntime="false"> 
      <classpath refid="cobertura.classpath" /> 
     </javac> 

    </target> 

    <target name="instrument" depends="init,compile"> 
      <!-- 
     Remove the coverage data file and any old instrumentation. 
     --> 
      <delete file="cobertura.ser" /> 
      <delete dir="${instrumented.dir}" /> 
      <!-- 
     Instrument the application classes, writing the 
     instrumented classes into ${build.instrumented.dir}. 
     --> 
      <cobertura-instrument todir="${instrumented.dir}" datafile="cobertura.ser"> 
       <!-- 
     The following line causes instrument to ignore any 
     source line containing a reference to log4j, for the 
     purposes of coverage reporting. 
     --> 
       <ignore regex="org.apache.log4j.*" /> 
       <fileset dir="${classes.dir}"> 
        <!-- 
     Instrument all the application classes, but 
     don't instrument the test classes. 
     --> 
        <include name="**/*.class" /> 
        <exclude name="**/*Test.class" /> 
       </fileset> 
      </cobertura-instrument> 
     </target> 

    <target name="test" depends="init,compile"> 
     <echo>${basedir}\cobertura.ser</echo> 
     <junit fork="yes" dir="test" showoutput="yes" printsummary="yes" reloading="false"> 

      <sysproperty key="net.sourceforge.cobertura.datafile" 
        file="${basedir}\cobertura.ser" /> 
      <!-- 
        Note the classpath order: instrumented classes are before the 
        original (uninstrumented) classes. This is important. 
      --> 
      <classpath location="${instrumented.dir}" /> 
      <classpath location="${classes.dir}" /> 

      <!-- 
        The instrumented classes reference classes used by the 
        Cobertura runtime, so Cobertura and its dependencies 
        must be on your classpath. 
      --> 
      <classpath refid="cobertura.classpath" /> 

      <formatter type="xml" /> 
      <test name="${testcase}" todir="${reports.xml.dir}" if="testcase" /> 
      <batchtest todir="${reports.xml.dir}" unless="testcase"> 
       <fileset dir="test"> 
        <include name="**/*Test.java" /> 
       </fileset> 
      </batchtest> 
     </junit> 

     <!-- JUnit Report in HTML --> 
     <junitreport todir="${reports.xml.dir}"> 
      <fileset dir="${reports.xml.dir}"> 
       <include name="TEST-*.xml" /> 
      </fileset> 
      <report format="frames" todir="${reports.html.dir}" /> 
     </junitreport> 

    </target> 

    <target name="coverage-check"> 
     <cobertura-check branchrate="34" totallinerate="100" /> 
    </target> 

    <target name="coverage-report"> 
     <!-- 
       Generate an XML file containing the coverage data using 
       the "srcdir" attribute. 
     --> 
     <cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" /> 
    </target> 

    <target name="summary-coverage-report"> 
     <!-- 
       Generate an summary XML file containing the coverage data using 
       the "srcdir" attribute. 
     --> 
     <cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.dir}" format="summaryXml" /> 
    </target> 

    <target name="alternate-coverage-report"> 
     <!-- 
       Generate a series of HTML files containing the coverage 
       data in a user-readable form using nested source filesets. 
     --> 
     <cobertura-report destdir="${coverage.html.dir}"> 
      <fileset dir="${src.dir}"> 
       <include name="**/*.java"/> 
      </fileset> 
     </cobertura-report> 
    </target> 

    <target name="clean" description="Remove all files created by the build/test process."> 
     <delete dir="${classes.dir}" /> 
     <delete dir="${instrumented.dir}" /> 
     <delete dir="${reports.dir}" /> 
     <delete file="cobertura.log" /> 
     <delete file="cobertura.ser" /> 
    </target> 

    <target name="coverage" depends="compile,instrument,test,coverage-report,summary-coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/> 
</project> 

但我当我运行构建,我得到0%的覆盖率。

直到instrument目标我相信一切都很美好。但是当构建运行Test目标测试失败。不知道为什么会这样。如果我在ant之外运行测试成功。

任何建议,我可以看看解决这个问题?

我得到以下错误,当我运行test目标

test: 
    [junit] Running org.jtaddeus.playground.LogicTest 
    [junit] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.141 sec 
    [junit] Test org.jtaddeus.playground.LogicTest FAILED 
    [junit] Running org.jtaddeus.playground.ValidatorTest 
    [junit] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.14 sec 
    [junit] Test org.jtaddeus.playground.ValidatorTest FAILED 
+0

只是要确定:您没有使用PowerMock?这有时会导致你的覆盖率统计数字。 – GhostCat

+0

我没有使用PowerMock。我还想知道为什么我的测试案例失败了。我相信如果我的测试用例在构建时没有问题地执行,那么覆盖范围也可能出现在报告中。 – Geek

回答

0

终于让我找到一个解决方案(未回答)

跟踪JUnit的报告,我发现它的东西做使用JUnit依赖后。

我刚刚从构建路径中删除了JUnit-4库和添加的Junit-4.7.jar到构建路径而你知道它的工作..

如果任何人解释我为什么出现这种情况,我会很谢天谢地了。

如果我再次使用Junit-4.11.jar同样的失败。报告中的Junit错误说error message="org/hamcrest/SelfDescribing" type="java.lang.NoClassDefFoundError">java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing