Мой проект имеет несколько модулей, каждый из которых имеет свой собственный скрипт сборки с целью, называемой "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>
Любые идеи приветствуются. Благодаря :)
Попробовав придумать всевозможные "трюки", чтобы заставить это работать, я наконец нашел способ, которым я доволен. Я определил для каждого модуля 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 тест завершился неудачно. Надеюсь, это поможет кому-то :)