Не пройдя тесты Android JUnit, не сломав мой скрипт Ant, как я ожидаю? - PullRequest
11 голосов
/ 02 июня 2010

Не пройдя тесты JUnit, не сломав мой скрипт Ant, как я ожидал?

Мой сервер непрерывной интеграции запускает скрипт Ant, который вызывает что-то вроде: / тесты / муравейник-тесты

Мои тесты JUnit запускаются, но с ошибками: выполнения тестов: [эхо] run-tests-helper. [эхо] Запуск тестов ... [ВЫПЛНЫ] [exec] com.zedray.stuff.FooBarTest: .... [exec] com.zedray.stuff.FooBarTest: ..... INSTRUMENTATION_RESULT: shortMsg = Некоторая ошибка в вашем коде. [exec] INSTRUMENTATION_RESULT: longMsg = java.security.InvalidParameterException: некоторая ошибка в вашем коде [exec] INSTRUMENTATION_CODE: 0

С ошибками все в порядке, но мой скрипт сборки продолжает работать (в конце концов, публикация моего сломанного приложения моим тестерам - плохо!). Я ожидаю, что для этого экземпляра будет возникать ошибка сборки, поэтому мой сервер непрерывной интеграции (в данном случае TeamCity) понимает, что что-то пошло не так, и сообщает о сбое сборки. "Failonerror" уже задан в соответствующем макросе, поэтому я не уверен, что еще я могу сделать?

/tests/build.xml

Запуск тестов ...

Любые идеи / предложения о том, как это исправить?

С уважением Mark

Ответы [ 5 ]

12 голосов
/ 25 сентября 2012

Я сделал это по-другому, потому что я использую цель 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>
4 голосов
/ 20 апреля 2011

У меня была такая же проблема, и я решил настроить цель «run-tests» в моем собственном build.xml, как это, и нет необходимости менять исходный android sdk test_rules.xml

<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>
3 голосов
/ 23 января 2011

Также искал какое-то стандартное решение для этого. Интересно, как развиваются ребята из Android, или они не используют teamcity и постоянную интеграцию? Слышал, у Хадсона есть какой-то плагин для Android, но я не люблю Хадсон. в любом случае вот быстрое и грязное решение

заменить содержимое в 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) лучше переопределить этот макрос в вашем проекте

2 голосов
/ 09 марта 2011

другой вариант, конечно, состоит в том, чтобы бросить муравья в пользу Maven или Gradle. Оба имеют плагины Android, которые корректно завершают сборку при неудачных тестах.

Maven: http://code.google.com/p/maven-android-plugin/

Gradle: http://code.google.com/p/gradle-android-plugin/

запущенные инструментальные тесты были только что добавлены в плагин Gradle Android и ожидают слияния обратно в главный репозиторий, так что скоро должен быть еще один выпуск.

0 голосов
/ 03 июня 2010

Задача ant JUnit по умолчанию запускает все тесты. Есть два решения для этого.

Самое простое решение - установить для свойства haltonerror значение true, и сборка завершится неудачно при первом сбое теста.

Немного более сложным (и моим предпочтением) является установка failureProperty, чтобы все тесты выполнялись. Это позволяет узнать, сколько тестов провалилось, а не только первый тест, который не прошел. Это требует больше работы над муравьем, потому что вам нужно добавить строку после ваших тестов junit, как это:

<fail message="tests failed" if="failureProperty"/>   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...