Android JUnit测试失败,而不是像我期望的那样破坏我的Ant脚本?

时间:2010-06-02 16:13:23

标签: android ant junit

JUnit测试失败,没有像我期望的那样破坏我的Ant脚本?

我的持续集成服务器运行一个Ant脚本,它调用类似于: / 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

错误没问题,但我的构建脚本继续运行(最终将我破碎的应用程序发布给我的测试人员 - 糟糕!)。我期望的是instrimentaiton抛出构建错误,所以我的持续集成服务器(在这种情况下是TeamCity)意识到出错了并报告了破坏的构建。 “failonerror”已在相关的macrodef中设置,所以我不确定我还能做什么?

/tests/build.xml

                       运行测试......                                                                                                                                                     

有关如何解决此问题的任何想法/建议?

此致 标记

5 个答案:

答案 0 :(得分:12)

我是用另一种方式做的,因为我使用的是 Android test文件中的ant 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>

答案 1 :(得分:4)

我遇到了同样的问题,我最终在我自己的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>

答案 2 :(得分:3)

也正在为此寻找某种标准解决方案。我想知道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)最好在项目中覆盖这个宏

答案 3 :(得分:2)

另一个选择当然是抛弃Ant而转向Maven或Gradle。两者都有Android插件,在测试失败时正确地使构建失败。

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

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

运行检测测试刚刚添加到Gradle Android插件中,并等待合并回主存储库,因此很快就会有另一个版本。

答案 4 :(得分:-3)

ant JUnit task默认运行所有测试。有两种解决方案。

最简单的解决方案是将haltonerror属性设置为true,并且在第一次测试失败时构建将失败。

稍微多一点(我的偏好)是设置failureProperty以便所有测试运行。这可以让您知道有多少测试失败,而不仅仅是第一次失败的测试。这需要更多的ant工作,因为你需要在你的junit测试之后添加一行:

<fail message="tests failed" if="failureProperty"/>