Неудача тестов на 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 и ждут, чтобы быть объединены обратно в главный репозиторий, поэтому вскоре должен появиться другой релиз.