Cobertura с Ant Script: отчет о покрытии в формате xml / html всегда показывает 0% охват везде - PullRequest
3 голосов
/ 19 октября 2010

Я пытался заставить Кобертуру работать в моем скрипте муравья. Все успешно (создание исходного кода, тесты junit, отчеты cobertura (xml / html), но в отчетах html охват кода всегда равен 0% ...

Скрипт Ant: make-tool

<!-- 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: make-tool

<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>

Ответы [ 4 ]

4 голосов
/ 08 мая 2012

Это то, что Часто задаваемые вопросы по Cobertura Говорит

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

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

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

1 голос
/ 20 октября 2011

Я пробовал аналогичным образом.Я также использовал инструментированный код перед фактическим исходным кодом, но я получаю 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% покрытия.Я в полном замешательстве: (

1 голос
/ 19 октября 2010

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

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

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

0 голосов
/ 15 ноября 2016

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

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

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

Итак, я обновил

  1. Кобертура 1.9.4
  2. asm 3.1 из 2.2.1
  3. asm-tree 3.1

другие зависимости
1. Джакарта-Оро 2.0.8
2. log4j-1.2.9

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

...