Сценарий Ant для запуска модульных тестов из нескольких модулей и сбоя сборки в случае сбоя теста

1

Мой проект имеет несколько модулей, каждый из которых имеет свой собственный скрипт сборки с целью, называемой "unit-tests" (которая запускает модульные тесты). Я создал скрипт Ant, который вызывает в модулях целевые объекты unit-tests, запускает все тесты и после этого генерирует junitreport из результата выполненных тестов (который сохраняется в xml файлах). Пока что так хорошо, но теперь я хочу, чтобы не удалось построить сборку, если хотя бы один тест потерпел неудачу.

Мой скрипт теперь выглядит примерно так, и мне нужен какой-то способ выяснить, не сработало ли тестирование модуля. (Я знаю о failureproperty в задаче junit но я не знаю, как передать это вызывающему скрипту)

    ....
<target name="run-unit-tests" depends="init-output">
  <ant antfile="${module1}/build.xml" inheritAll="false" target="${junit-target}" />
  <ant antfile="${module2}/build.xml" inheritAll="false" target="${junit-target}" />
    ....
</target>

<target name="default" depends="run-unit-tests">
    <junitreport todir="${junit.report.dir}" tofile="TEST-UnitTestSuites.xml">
        <fileset dir="${junit.output.dir}">
            <include name="**/TEST-*.xml" />
        </fileset>
    </junitreport>

   //---->fail the build if at least one unit tests has failed
</target>

Любые идеи приветствуются. Благодаря :)

Теги:
unit-testing
junit
ant
continuous-integration

1 ответ

1
Лучший ответ

Попробовав придумать всевозможные "трюки", чтобы заставить это работать, я наконец нашел способ, которым я доволен. Я определил для каждого модуля build.xml файл цель:

<junit failureproperty="testsFailed" showoutput="true">         
        ...
        <formatter type="xml" />
</junit>
<fail if="${testsFailed}" message="Some of the unit tests failed." />
<!-- the fail task throws an exception if ${testsFailed} is true -->

Это выполняет модульные тесты в модуле, и если какой-либо тест не прошел, он генерирует исключение. Он также регистрирует выход junit в XML файле. В файле build.xml у меня есть что-то вроде этого:

<target name="run-unit-tests" >
    <run-tests location="${module1.location}" />
    <run-tests location="${module2.location}" />
</target>

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Writes the results of the unit tests in a junit report        -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<target name="unit-tests" depends="run-unit-tests">
    <junitreport todir="${junit.report.dir}" tofile="TEST-UnitTestSuites.xml">
        <fileset dir="${junit.output.dir}">
            <include name="**/TEST-*.xml" />
        </fileset>
    </junitreport>
    <fail if="${testsFailed2}" message="Some of the unit tests failed." />
</target>

<macrodef name="run-tests">
    <attribute name="location" />
    <sequential>
        <trycatch>
            <try>
                <echo message="@{location}" />
                <if>
                    <available file="@{location}/build.xml" />
                    <then>
                        <ant antfile="@{location}/build.xml" inheritAll="false" target="${junit-target}" />
                    </then>
                </if>
            </try>
            <catch>
                <property name="testsFailed2" value="true" />
            </catch>
        </trycatch>
    </sequential>
</macrodef>

Если тесты в модуле терпят неудачу, исключение поймано и устанавливает свойство testsFailed2 все тесты запускаются, а выходы junit сохраняются в одной папке. Цель unit-tests создает один отчет xml из всех результатов тестов (этот отчет может использоваться для непрерывных сборок интеграции), и скрипт ant будет неудачным, если какой-либо unit тест завершился неудачно. Надеюсь, это поможет кому-то :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню