Отчеты Junit показывают только последний запущенный класс при выполнении с помощью build.xml

Я могу заставить build.xml сообщать обо всех моих классах, определенных целями, если я вызываю test-all, но если я хочу запустить только несколько целей, мой отчет Junit показывает только последний запущенный класс.

Для дальнейшего объяснения у меня есть две цели в моем файле build.xml: «runAll» и «runTest». Когда я выполняю цель runAll, все мои классы отображаются в отчете Junit. Когда я запускаю несколько целей с помощью runTest, в моих отчетах junit отображается только последний запущенный класс.

ЭТО РАБОТАЕТ И СООБЩАЕТ О ВСЕХ КЛАССАХ:
ant test-all

ЭТО НЕ ОТЧЕТ, И ТОЛЬКО ОТЧЕТ О ПОСЛЕДНЕМ КЛАССЕ:
ant testClass1 testClass2 testClass3

вот фрагмент того, что я запускаю в своей сборке xml для runAll (этот работает):

<target name="runAll" depends="clean,compile, compileTests">
    <taskdef resource="festjunittasks" classpathref="classpath" />

    <mkdir dir="${report.dir}"/>
    <mkdir dir="${results.dir}"/>
    <mkdir dir="${htmlresults.dir}"/>
    <!-- <mkdir dir="${iphone.dir}"/> -->

      <junit forkmode="perTest" printsummary="yes" haltonfailure="no" haltonerror="no" maxmemory="4096m">



        <classpath>
            <path refid="classpath"/>
        </classpath>

        <formatter classname="org.fest.swing.junit.ant.ScreenshotOnFailureResultFormatter" extension=".xml" />

        <batchtest fork="yes" todir="${results.dir}">
            <fileset dir="${testclasses.dir}" includes="**/*Test*.class" />
        </batchtest>
    </junit>

    <festreport todir="${report.dir}">
        <classpath refid="classpath" />
        <fileset dir="${results.dir}">
          <include name="TEST-*.xml" />
        </fileset>
        <report format="frames" todir="${htmlresults.dir}/html" />
      </festreport>
    <copy todir="${history.dir}">
        <fileset dir="${html.dir}"/>
        </copy>


</target >

Вот фрагмент моего runTest (он сообщает только о последнем запущенном классе):

<target name="runTest" depends="clean,compile, compileTests">
    <taskdef resource="festjunittasks" classpathref="classpath" />
    <mkdir dir="${report.dir}"/>
    <mkdir dir="${results.dir}"/>
    <mkdir dir="${htmlresults.dir}"/>
    <!-- <mkdir dir="${iphone.dir}"/> -->

    <junit forkmode="perTest" printsummary="yes" haltonfailure="no" haltonerror="no" maxmemory="4096m">

        <classpath>
            <path refid="classpath"/>
        </classpath>

        <formatter classname="org.fest.swing.junit.ant.ScreenshotOnFailureResultFormatter" extension=".xml" />

        <batchtest fork="yes" todir="${results.dir}">
            <fileset dir="${testclasses.dir}" includes="**/${test.to.run}" />
        </batchtest>
    </junit>

    <festreport todir="${report.dir}">
        <classpath refid="classpath" />
        <fileset dir="${results.dir}">
          <include name="TEST-*.xml" />
        </fileset>
        <report format="frames" todir="${htmlresults.dir}/html" />
    </festreport>
    <copy todir="${history.dir}">
        <fileset dir="${html.dir}"/>
    </copy>

</target >

заранее спасибо


person Laser Hawk    schedule 05.06.2011    source источник


Ответы (2)


Похоже, что runTest вызывается в цикле внутри вашей сборки. Если это так, можете ли вы изменить его, чтобы создать один набор файлов со всеми тестами, которые вы хотите запустить, и запустить их одновременно? Это самый простой способ, потому что junitreport (и, предположительно, festreport) ожидают вывод xml за один запуск.

Если вы не можете запустить тесты вместе, альтернативой является запуск XML-преобразования для объединения выходных данных XML перед отчетом. Однако создание одного набора файлов должно быть проще.

person Jeanne Boyarsky    schedule 06.06.2011

Проблема, с которой вы столкнулись, заключается в том, что когда вы запускаете свой первый тестовый класс и junit создает отчет в формате html, junit обычно помещает следующие файлы html в каталог по вашему выбору, в вашем случае это будет «${htmlresults.dir}/html». :

/com
all-tests.html
allclasses-frame.html
alltests-errors.html
alltests-fails.html
index.html
overview-frame.html
overview-summary.html
stylesheet.css

Когда вы запускаете второй тест, для второго класса создаются те же самые имена html-файлов, которые сохраняются в том же каталоге ('${htmlresults.dir}/html'). Что происходит, так это то, что файлы html для первого класса перезаписываются именами файлов html второго класса, поскольку имена файлов html постоянны. Глядя на фрагмент build.xml, самое простое, что вы можете сделать, это перейти к цели runTest и заменить узел festreport на этот:

НОВЫЙ УЗЕЛ festreoprt для цели runTest

<festreport todir="${report.dir}"> 
<classpath refid="classpath" />
<fileset dir="${results.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${htmlresults.dir}/html/${test.to.run}" />
</festreport>

СТАРЫЙ УЗЕЛ festreoprt для цели runTest

<festreport todir="${report.dir}">
<classpath refid="classpath" />
<fileset dir="${results.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${htmlresults.dir}/html" />
</festreport>

Изменение, которое я сделал, очень простое.

Все, что я сделал, это сказал junit target testRun создать папку, названную в честь только что запущенного класса,

обозначается как "${htmlresults.dir}/html/${test.to.run}".

После создания этой папки файлы отчетов в формате html сохраняются в папке с указанным именем класса. Когда будет выполнена следующая последовательная цель, junit запустит цель, создаст новую папку с именем в честь класса, который выполняется, а затем сохранит файлы html в папке класса.

После этого вы никогда не столкнетесь с проблемой перезаписи html-файла.

person Ray    schedule 06.06.2011
comment
Разве это не создает отдельный отчет для каждого теста, а не объединяет все результаты в один отчет? - person Jeanne Boyarsky; 07.06.2011