2012-10-10 29 views
1

我有一個關於cobertura與Ant腳本連接的問題。我已經閱讀StackOverflow的這兩篇文章: SONAR - Measure Code Coverage using CoberturaBamboo + sonar.dynamicAnalysis=reuseReports = 0% Rules ComplianceCobertura + Junit

而且,我已經搜索在互聯網上爲我的問題的解決方案。 現在我希望你能幫助我。

初始狀態: 我有一個Ant腳本來編譯一個庫,然後是一個測試目標。現在我添加了cobertura。一段時間後,我知道了類和ser文件存儲。報告也生成,但沒有報道。 但現在問題是JUnit測試不起作用。以下錯誤消息可以在XML中找到:

<testcase classname="com.***.***.***.***.***Test" name="test16" time="0.0"> 
<error message="com/***/***/***/***/***Rule" type="java.lang.NoClassDefFoundError">java.lang.NoClassDefFoundError: com/***/***/***/***/***Rule 
at com.***.***.***.***.***Test.setUp(Unknown Source) 
at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) 
at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424) 
at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138) 

我目前使用Ant腳本以下代碼:

<project name="MainLIB" default="vbuild" basedir="./"> 
<path id="path.additionaltasks"> 
    <fileset dir="../BUILD/antlib"> 
     <include name="cobertura.jar" /> 
     <include name="log4j-1.2.9.jar" /> 
     <include name="asm-3.0.jar" /> 
     <include name="asm-tree-3.0.jar" /> 
     <include name="jakarta-oro-2.0.8.jar" /> 
    </fileset> 
</path> 
<taskdef resource="tasks.properties" classpathref="path.additionaltasks" /> 

<path id="path.LIB"> 
    <fileset dir="lib" includes="**/**.jar" /> 
</path> 

<path id="path.UNITTEST"> 
    <path refid="path.LIB" /> 
    <pathelement path="build/cobertura/classes" /> 
    <pathelement path="build/classes" /> 
    <pathelement path="build/test-classes" /> 
</path> 

<property name="dir.build" value="build" /> 
<property name="dir.build.classes" value="${dir.build}/classes" /> 
<property name="dir.build.cobertura" value="${dir.build}/cobertura" /> 
<property name="dir.build.cobertura.classes" value="${dir.build.cobertura}/classes" /> 
<property name="dir.build.test.classes" value="${dir.build}/test-classes" /> 
<property name="dir.build.test.report" value="${dir.build}/test-reports" /> 
<property name="dir.build.dist" value="${dir.build}/dist" /> 

<target name="vbuild" depends="build,test" description="Build and run tests" /> 

<target name="build" description="Compile classes and create .jar file in build/dist"> 

    <delete dir="${dir.build}" /> 
    <mkdir dir="${dir.build.classes}" /> 

    <javac srcdir="src" classpathref="path.LIB" verbose="false" destdir="${dir.build.classes}" includeantruntime="false" includejavaruntime="false" debug="true"> 
    </javac> 

    <mkdir dir="${dir.build.dist}" /> 

    <jar jarfile="${dir.build.dist}/${jar.name}.jar" basedir="${dir.build.classes}"> 
    </jar> 
</target> 

<target name="test" description="Compile and Run jUnit Tests"> 

    <mkdir dir="${dir.build.test.classes}" /> 
    <mkdir dir="${dir.build.test.report}" /> 

    <javac srcdir="test" classpathref="path.UNITTEST" verbose="false" destdir="${dir.build.test.classes}" includeantruntime="false" includejavaruntime="false"> 
    </javac> 

    <delete dir="${dir.build.cobertura}" /> 
    <mkdir dir="${dir.build.cobertura}" /> 
    <mkdir dir="${dir.build.cobertura.classes}" /> 
    <cobertura-instrument todir="${dir.build.cobertura.classes}" datafile="${dir.build.cobertura}/cobertura.ser"> 
     <fileset dir="${dir.build.classes}" /> 

    </cobertura-instrument> 

    <junit printsummary="yes"> 
     <classpath> 
      <!--<pathelement path="build/cobertura/classes" />--> 
      <path refid="path.UNITTEST" /> 

     </classpath> 
     <formatter type="xml" /> 

     <batchtest todir="${dir.build.test.report}"> 
      <fileset dir="${dir.build.test.classes}"> 
       <include name="**/*Test.class" /> 
      </fileset> 
     </batchtest> 
    </junit> 

    <cobertura-report format="xml" datafile="${dir.build.cobertura}/cobertura.ser" destdir="${dir.build.cobertura}/" /> 
    <cobertura-report format="html" datafile="${dir.build.cobertura}/cobertura.ser" destdir="${dir.build.cobertura}/" /> 
</target> 

的問題是,在類位於build/cobertura/classes目錄中。我想不通,爲什麼JUnit中,找不到類

+0

在JUnit類路徑缺少的Cobertura LIB文件。這些是執行儀器化測試所必需的。但是你的錯誤似乎表明你的classpath缺少更多東西。 – oers

+0

謝謝,是它 現在它的工作:D – user1734614

回答

0

你的classpath:

<classpath> 
     <!--<pathelement path="build/cobertura/classes" />--> 
     <path refid="path.UNITTEST" /> 

    </classpath> 

包含:

<path id="path.LIB"> 
    <fileset dir="lib" includes="**/**.jar" /> 
</path> 

<path id="path.UNITTEST"> 
    <path refid="path.LIB" /> 
    <pathelement path="build/cobertura/classes" /> 
    <pathelement path="build/classes" /> 
    <pathelement path="build/test-classes" /> 
</path> 

但它也需要的Cobertura罐子,你參考path.additionaltasks。 Cobertura使用字節碼操縱來處理類文件。這些文件仍然需要cobertura.jar依賴才能工作。
要修復它添加path.additionaltasks JUnit的:

<classpath> 
     <!--<pathelement path="build/cobertura/classes" />--> 
     <path refid="path.UNITTEST" /> 
     <path refid="path.additionaltasks" /> 
    </classpath>