2010-10-19 3 views
3

Я попытался заставить Cobertura работать внутри моего скрипта муравья. Все успешно (исходный код здание, JUnit тесты, отчеты Cobertura (XML/HTML), но в HTML отчетах, охват коды всегда на 0% ...Cobertura с Ant Script: отчет о покрытии xml/html всегда показывает покрытие 0% везде

Ant Сценарий: макияж инструмент

<!-- Make instrument for Cobertura engine --> 
<target name="make-instrument"> 

    <!-- Remove the coverage data file and any old instrumentation. --> 
    <delete file="${cobertura.ser}" /> 

    <!-- Instrument the application classes, writing the instrumented classes into ${build.instrumented.dir}. --> 
    <cobertura-instrument todir="${report.cobertura.dir}"> 

     <!-- 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="${webcontent.dir}/WEB-INF/classes"> 
      <!-- Instrument all the application classes, but don't instrument the test classes. --> 
      <include name="**/*.class" /> 
      <exclude name="**/*Test.class" /> 
     </fileset> 

    </cobertura-instrument> 

</target> 

Ant Сценарий: макияж инструмент

<target name="install-cobertura" if="is-hudson-env">   
    <path id="cobertura.classpath"> 
     <fileset dir="${user.home.sharehunter.dir}/cobertura-${cobertura.rev}"> 
      <include name="**/cobertura.jar" /> 
      <include name="**/*.jar" /> 
     </fileset> 
    </path> 
    <taskdef resource="tasks.properties" classpathref="cobertura.classpath" /> 
</target> 

Ant Сценарий: JUnit

<target name="run-tests" depends="make-instrument"> 

    <path id="classpath.test"> 
     <path path="${webcontent.dir}/WEB-INF/classes" /> 
     <pathelement location="${webcontent.dir}/WEB-INF/classes" /> 
     <fileset dir="${lib.dir}" includes="**/*.jar" /> 
     <path location="${webcontent.dir}/WEB-INF/classes" /> 
     <path location="${webcontent.dir}/WEB-INF" /> 
     <path location="${webcontent.dir}" /> 
    </path> 

    <junit fork="yes" failureProperty="test.failed"> 

     <classpath refid="classpath.test" /> 

     <classpath location="${user.home.dir}/junit-${junit.rev}.jar" /> 

     <!-- Specify the name of the coverage data file to use. 
       The value specified below is the default. --> 
     <sysproperty key="net.sourceforge.cobertura.datafile" file="${cobertura.ser}" /> 

     <!-- Note the classpath order: instrumented classes are before the original (uninstrumented) classes. --> 
     <classpath location="${report.cobertura.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" /> 

     <!-- Generate xml files for each junit tests runs --> 
     <formatter type="xml" /> 
     <batchtest todir="${report.junit.dir}"> 
      <fileset dir="${webcontent.dir}/WEB-INF/classes"> 
       <include name="**/*Test.class" /> 
      </fileset> 
     </batchtest> 

    </junit> 

    <!-- Generate Cobertura xml file containing the coverage data --> 
    <cobertura-report format="xml" srcdir="${src.main.java.dir}" destdir="${report.cobertura.dir}" datafile="${cobertura.ser}" /> 

    <!-- Generate Cobertura html file report containing the coverage data --> 
    <cobertura-report format="html" srcdir="${src.main.java.dir}" destdir="${report.cobertura.dir}" datafile="${cobertura.ser}" /> 

</target> 

ответ

1

Хорошо, я нашел проблему. Чтобы быть уверенным, есть это:

<!-- 
    Note the classpath order: instrumented classes are before the 
    original (uninstrumented) classes. This is important. 
--> 
<classpath location="${instrumented.dir}" /> 
<classpath location="${classes.dir}" /> 

Инструментальные классы должны пред первоначальными (uninstrumented) классов.

+0

Человек, это ужасная вещь, я здесь более 3 часов, пытаясь заставить эту вещь работать. –

1

Я пробовал аналогичный путь. Я также использовал инструментальный код перед фактическим исходным кодом, но я получаю 0% в файле отчета.

<macrodef name="coberturaTestMacro"> 
     <attribute name="moduleName" /> 
     <attribute name="classpath.module" /> 
     <attribute name="classpath.junit" /> 
     <attribute name="failOnCoverageFall" /> 
     <attribute name="fileCoberturaData"/> 
     <sequential> 

      <path id="classpathCobertura"> 
       <fileset dir="${homeCobertura}"> 
        <include name="cobertura.jar" /> 
        <include name="lib/**/*.jar" /> 
       </fileset> 
      </path> 
      <taskdef classpathref="classpathCobertura" resource="tasks.properties" /> 
      <property name="cob.instrumented.dir" value="target/cobertura/instrumented" /> 

      <delete dir="target/cobertura" /> 

      <cobertura-instrument todir="${cob.instrumented.dir}" datafile="@{fileCoberturaData}" > 
       <fileset dir="target/classes"> 
        <include name="**/*.class" /> 
       </fileset> 
      </cobertura-instrument> 

      <delete dir="target/reports/test" /> 
      <mkdir dir="target/cobertura/reports" /> 
      <junit printsummary="false" failureproperty="junit.failure" 
         maxmemory="512m" fork="true" forkmode="perTest"> 
       <jvmarg value="-Djava.awt.headless=true" /> 
       <classpath location="${homeCobertura}/cobertura.jar" /> 
       <classpath location="${cob.instrumented.dir}" /> 
       <classpath> 
        <path refid="@{classpath.module}" /> 
        <path refid="@{classpath.junit}" /> 
       </classpath> 
       <classpath path="target/test-classes" /> 
       <batchtest todir="target/cobertura/reports/"> 
        <fileset dir="src/test/java"> 
         <include name="**/*Test.java" /> 
        </fileset> 
       </batchtest> 
      </junit> 

      <cobertura-report srcdir="src/main/java" destdir="target/cobertura/reports/" /> 

      <echo message="${line.separator}" /> 
      <echo message="COVERAGE: @{moduleName} module..." /> 
      <echo message="${line.separator}" /> 

      <if> 
       <available file="target/cobertura/@{moduleName}-cobertura.properties" /> 
       <then> 
        <var name="total.line-rate" file="target/cobertura/@{moduleName}-cobertura.properties" /> 
        <cobertura-check haltonfailure="@{failOnCoverageFall}" 
         datafile="@{fileCoberturaData}" totallinerate="${total.line-rate}" /> 
       </then> 
      </if> 

      <delete file="${dirBuild}/coverage-summary.properties" /> 
      <cobertura-report datafile="@{fileCoberturaData}" destdir="target/cobertura/" format="summaryXml" /> 
      <var name="total.line-rate" file="target/cobertura/coverage-summary.properties" /> 
      <echo message="Total line coverage: ${total.line-rate}%" /> 

      <propertyfile file="target/cobertura//@{moduleName}-cobertura.properties"> 
       <entry key="total.line-rate" value="${total.line-rate}" type="int" /> 
      </propertyfile> 

     </sequential> 
    </macrodef> 

Удивительно, что в сгенерированном отчете говорится, что общий охват 2%, но итоговый файл говорит о покрытии 0%. Где старая задача cobertura показывает покрытие 8%. Я полностью спутать :(

+0

Cobertura должен предоставить пример кода в git, используя это, так много сообщений с таким количеством вопросов. Я все еще не могу сделать эту работу всеми файлами, показывающими N/A –

4

Это то, что Cobertura FAQ говорит

Когда я генерировать отчеты покрытия, почему они всегда показывают 0% охват везде?

Cobertura, вероятно, использует неправильный .ser файл, когда генерируя отчеты.Коберрура генерирует файл .ser, содержащий основную информацию о каждом классе. По мере выполнения ваших тестов Cobertura добавляет дополнительную информацию к этому же файлу данных. Если инструментальные классы не могут найти файл данных при запуске, они создадут новый o северо-восток Важно, чтобы вы использовали один и тот же файл cobertura.ser при настройке, запуске и создании отчетов.

Лучший способ сделать это - указать расположение файла данных при выполнении ваших тестов. Вы должны передать sysproperty -Dnet.sourceforge.cobertura.datafile=${basedir}/cobertura.ser в задачу JUnit.

Другая распространенная проблема заключается в том, что файл cobertura.ser удален, но ранее используемые классы также не удаляются. Каждый раз, когда вы удаляете файл данных о покрытиях, вы также должны удалять все инструментальные классы.

0

Возможно, это не применимо ко всем, но у меня была аналогичная проблема, где покрытие было 0 для всех классов. В моем случае было 2 номера

1) он читал неправильную версию jdk 1.8 от PATH. Я обновил PATH, чтобы читать 1.6 jdk.
2) Первоначально он использовал версию 1.8 cobertura. Я запустил сборку и создавал отчет о покрытии, но все классы всегда были 0%.Я обновил цель JAVAC включить debug="true" debuglevel="vars,lines,source" ссылки: cobertura 0 coverage

Затем побежал строить снова и увидел, что произошла ошибка при выполнении тестов и проследила, что вернуться к вопросу с версией 1.8 Cobertura.

Так, я модернизировал

  1. Cobertura 1.9.4
  2. ассемблер 3.1 из 2.2.1
  3. ASM-дерево 3,1

других зависимостей
1. Jakarta-оро 2,0 .8
2. log4j-1.2.9

После этого снова выполнялась задача, и отчеты были в порядке.