Неудача тестов на Android JUnit, не нарушая мой Ant script, как я ожидаю?
Не удалось выполнить тесты JUnit, не разбивая мой Ant script, как я ожидаю?
Мой сервер непрерывной интеграции выполняет Ant script, который вызывает что-то вроде:
/tests/ ant run-tests
Мои тесты JUnit запускаются, но с ошибками:
выполнения тестов: [echo] run-tests-helper. [echo] Запуск тестов... [ВЫПЛНЫ] [exec] com.zedray.stuff.FooBarTest:.... [exec] com.zedray.stuff.FooBarTest:..... INSTRUMENTATION_RESULT: shortMsg = Некоторая ошибка в вашем коде. [exec] INSTRUMENTATION_RESULT: longMsg = java.security.InvalidParameterException: некоторая ошибка в вашем коде [exec] INSTRUMENTATION_CODE: 0
Ошибки в порядке, но моя сборка script продолжает работать (в конечном итоге, опубликовать мое сломанное приложение для моих тестеров - плохо!). Я бы ожидал, что для instrimentaiton выйдет ошибка сборки, поэтому мой сервер непрерывной интеграции (TeamCity в этом случае) понимает, что что-то пошло не так и сообщает о сбое сборки. "Failonerror" уже установлен в соответствующем макродеде, поэтому я не уверен, что еще я могу сделать?
/tests/build.xml
Выполнение тестов...
Любые идеи/предложения о том, как исправить это?
Отношения
Марк
Ответы
Ответ 1
ant Задача JUnit по умолчанию запускает все тесты. Для этого есть два решения.
Самое простое решение - установить для свойства haltonerror
значение true, и сборка завершится с ошибкой при первом сбое теста.
Чуть более активное участие (и мое предпочтение) заключается в установке failureProperty
, чтобы все тесты выполнялись. Это позволяет узнать, сколько тестов терпит неудачу, а не только первый тест, который терпит неудачу. Для этого требуется больше ant, потому что вам нужно добавить строку после таких тестов junit:
<fail message="tests failed" if="failureProperty"/>
Ответ 2
Я сделал это по-другому, потому что я использую цель ant test
, которая находится в файле Android build.xml
. Эта цель выводится на стандартный вывод, поэтому я захватил stndout в файл, а затем запросил файл, используя этот результат, чтобы выполнить свою задачу.
<target name="run-acceptance-tests" depends="clean, debug, install" >
<property name="log.file" value="acceptance_tests_standard_out.txt" />
<!-- because we don't have control over the 'test' target (to check for passes an fails) this prints to standard out
we capture standard out into a file and query this to see if we have any test failures, using this to pass/fail our task -->
<record name="${log.file}" action="start" />
<antcall target="test" />
<record name="${log.file}" action="stop" />
<!-- do other stuff -->
<loadfile property="tests.output" srcFile="${log.file}" />
<echo>Checking for failures</echo>
<fail message="acceptance tests failed!" >
<condition>
<contains string="${tests.output}" substring="FAILURES" />
</condition>
</fail>
<echo>acceptance tests passed!</echo>
</target>
Ответ 3
У меня была такая же проблема, и я ввел настройку цели "run-tests" в моем собственном файле build.xml, как это, и нет необходимости менять исходный файл sdk test_rules.xml для Android.
<target name="run-tests" depends="-install-tested-project, install"
description="Runs tests from the package defined in test.package property">
<echo>Running tests ...</echo>
<exec executable="${adb}" failonerror="true" outputproperty="tests.output">
<arg value="shell" />
<arg value="am" />
<arg value="instrument" />
<arg value="-w" />
<arg value="-e" />
<arg value="coverage" />
<arg value="@{emma.enabled}" />
<arg value="${manifest.package}/${test.runner}" />
</exec>
<echo message="${tests.output}"/>
<fail message="Tests failed!!!">
<condition>
<contains string="${tests.output}" substring="FAILURES" />
</condition>
</fail>
</target>
Ответ 4
Также искал какое-то стандартное решение для этого. Интересно, как развиваются андроидские парни, или они не используют teamcity и непрерывную интеграцию? слышал, что у hudson есть плагин для Android, но мне не нравится hudson. в любом случае здесь быстрое и грязное решение
заменить содержимое в android-sdk-windows\tools\ ant\test_rules.xml с помощью:
<attribute name="emma.enabled" default="false" />
<element name="extra-instrument-args" optional="yes" />
<sequential>
<echo>Running tests ...</echo>
<exec executable="${adb}" failonerror="true" outputproperty="tests.output">
<arg line="${adb.device.arg}" />
<arg value="shell" />
<arg value="am" />
<arg value="instrument" />
<arg value="-w" />
<arg value="-e" />
<arg value="coverage" />
<arg value="@{emma.enabled}" />
<extra-instrument-args />
<arg value="${manifest.package}/${test.runner}" />
</exec>
<echo message="${tests.output}"/>
<fail message="Tests failed!!!">
<condition>
<contains string="${tests.output}" substring="FAILURES" />
</condition>
</fail>
</sequential>
есть два недостатка
1) вы не видите тестовый результат, пока тесты выполняются до тех пор, пока они не сработают (и выход будет искажен каким-то образом)
2) его лучше переопределить этот макрос в вашем проекте
Ответ 5
другой вариант, разумеется, должен быть в канаве Ant в пользу Maven или Gradle. Оба имеют подключаемые модули Android, которые должным образом выходят из строя, когда есть ошибки тестирования.
Maven:
http://code.google.com/p/maven-android-plugin/
Gradle:
http://code.google.com/p/gradle-android-plugin/
текущие контрольные тесты только что добавлены в подключаемый модуль Gradle Android и ждут, чтобы быть объединены обратно в главный репозиторий, поэтому вскоре должен появиться другой релиз.