Как изменить сценарий Ant с покрытием кода EMMA, чтобы он мог находить данные о покрытии во время выполнения?

У меня есть следующий скрипт:

<?xml version="1.0" encoding="UTF-8"?>

<taskdef resource="emma_ant.properties">
    <classpath>            
        <pathelement location="lib/emma.jar" />
        <pathelement location="lib/emma_ant.jar" />
    </classpath>
</taskdef>

<target name="compile">
    <mkdir dir="build"/> <!-- vytvori adresar build -->
    <mkdir dir="build/classes"/>
    <mkdir dir="build/test"/>
    <javac destdir="build/classes" srcdir="src" debug="true" /> <!-- prelozi zdrojove kody -->
    <javac destdir="build/test" srcdir="test"> <!-- prelozi testy -->
        <classpath> <!-- pro prelozeni testu je potreba junit a prelozena aplikace -->
            <pathelement location="lib/junit-4.5.jar" />
            <pathelement location="build/classes" />
        </classpath>
    </javac>
</target>

<target name="build" depends="compile">
    <jar destfile="tetris.jar" basedir="build/classes"> <!-- zabali aplikaci do jaru -->
        <manifest>
            <attribute name="Main-Class" value="tetris.Main"/>
            <attribute name="Class-Path" value="lib/mysql-connector-java-5.1.6-bin.jar lib/derbyclient.jar"/>
        </manifest>
    </jar>
</target>

<target name="jar" depends="build"></target>

<target name="run" depends="compile">
    <java classname="tetris.Main" classpath="build/classes">  <!-- spusti aplikaci -->
        <classpath>
            <pathelement location="lib/mysql-connector-java-5.1.6-bin.jar" />
            <pathelement location="lib/derbyclient.jar" />
        </classpath>
    </java>
</target>

<target name="instrument" depends="compile">
    <mkdir dir="build/instrumented"/>

    <emma verbosity="verbose"> <!-- vytvori tridy upravene pro sledovani coverage -->
        <instr instrpath="build/classes"
                destdir="build/instrumented"
                metadatafile="build/metadata.emma"
                merge="true" />
    </emma>
</target>

<target name="test" depends="instrument">
    <mkdir dir="reports" />
    <mkdir dir="reports/junit" />

    <junit printsummary="yes" haltonfailure="no" fork="true"> <!-- pusti JUnit testy -->
        <classpath>
            <pathelement location="build/test" />
            <pathelement location="build/classes" />
            <pathelement location="build/instrumented" />
            <pathelement location="lib/junit-4.5.jar" />
            <pathelement location="lib/emma.jar" />
            <pathelement location="lib/emma_ant.jar" />
        </classpath>

        <formatter usefile="false" type="brief" />
        <formatter type="plain"/>

        <batchtest fork="yes" todir="reports/junit"> <!-- reporty budou v adresari reports/junit -->
            <fileset dir="test">
                <include name="**/TetrisSuite.java"/>
            </fileset>
        </batchtest>
        <jvmarg value="-Demma.coverage.out.file=build/coverage.emma"/>
        <jvmarg value="-Demma.coverage.out.merge=true" />
    </junit>

    <emma enabled="true" verbosity="verbose"> <!-- vygeneruje report emmy -->
        <report sourcepath="src">
            <fileset dir="build" includes="*.emma" />

            <html outfile="reports/coverage.html" />
        </report>
    </emma>
</target>

<target name="clean">
    <delete dir="build"/> <!-- smaze adresar build -->
    <delete dir="reports"/>
    <delete file="tetris.jar"/>
</target>

Он выводит это сообщение:

processing input file [...NetBeansProjects/Tetris3/build/metadata.emma] ...
  loaded 25 metadata entries
1 file(s) read and merged in 5 ms
nothing to do: no runtime coverage data found in any of the data files

Что не так и как это исправить?


person Jakub Stejskal    schedule 23.02.2010    source источник
comment
@Corvus - я добавил еще несколько мыслей - может быть, вы ничего не запускали, например, если нет тестов junit с именем TetrisSuite.   -  person martin clayton    schedule 25.02.2010


Ответы (1)


Похоже, ты собираешь неинструментальные классы.

Возможно, это связано с тем, что classpath в вашей junit задаче имеет скомпилированные классы (build/classes) впереди инструментированных (build/instrumented). Может быть, изменить их в этом пути к классам?

ИЗМЕНИТЬ

Я скачал emma и настроил базовый проект с одним исходным классом и одним тестовым классом. Я попытался запустить его, используя сборку, указанную в вопросе. Единственное изменение, которое я сделал, это обернуть тело в <project> с test в качестве цели по умолчанию. При запуске я получил сообщение, похожее на вопрос:

[report] processing input file [/Users/mjc/stack_overflow/emma/build/metadata.emma] ...
[report]   loaded 1 metadata entries
[report] 1 file(s) read and merged in 6 ms
[report] nothing to do: no runtime coverage data found in any of the data files

Затем я установил путь к классам junit, чтобы поставить классы с инструментами впереди ванили:

<classpath>
    <pathelement location="build/test" />
    <pathelement location="build/instrumented" />
    <pathelement location="build/classes" />
    <pathelement location="lib/junit.jar" />
    <pathelement location="lib/emma.jar" />
    <pathelement location="lib/emma_ant.jar" />
</classpath>

И повторил:

[report] processing input file [/Users/mjc/stack_overflow/emma/build/coverage.emma] ...
[report]   loaded 1 coverage data entries
[report] processing input file [/Users/mjc/stack_overflow/emma/build/metadata.emma] ...
[report]   loaded 1 metadata entries
[report] 2 file(s) read and merged in 4 ms
[report]   merged metadata contains 1 entries
[report]   merged coverage data contains 1 entries
[report] writing [html] report to [/Users/mjc/stack_overflow/emma/reports/coverage.html] ...
[report]   report: processing package [default package] ...

Похоже, это исправило это для меня. У меня был один тест, который выполнялся:

[junit] Running SoTest
[junit] Testsuite: SoTest
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.081 sec
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.081 sec
[junit] 
[junit] ------------- Standard Output ---------------
[junit] EMMA: collecting runtime coverage data ...
[junit] ------------- ---------------- ---------------

Если вы не видите таких строк в выводе ant, возможно, у вас нет тестов, соответствующих шаблону **/TetrisSuite.java?

person martin clayton    schedule 23.02.2010
comment
Вы имеете в виду вот так? ‹junit printsummary=yes haltonfailure=no fork=true› ‹classpath› ‹pathelement location=build/test /› ‹pathelement location=build/instrumented /› ‹pathelement location=build/classes /› Похоже, это не работает. . - person Jakub Stejskal; 24.02.2010
comment
@Corvus - почему это не сработало? Ты сначала сделал чистку? - person martin clayton; 24.02.2010
comment
Я сделал очистку, и он по-прежнему ничего не делает: данные о покрытии во время выполнения не найдены ни в одном из файлов данных. - person Jakub Stejskal; 24.02.2010
comment
Я обнаружил, что это явно проблема Netbeans... когда я запускаю скрипт в командной строке, он работает нормально... порядок элементов пути не имеет значения... - person Jakub Stejskal; 25.02.2010
comment
Отличный совет, который привел меня на правильный путь — если вы не видите сообщение EMMA: сбор данных о покрытии во время выполнения..., вы делаете это неправильно. - person ashes999; 01.02.2011