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运行测试......
有关如何解决此问题的任何想法/建议?
此致 标记
答案 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"/>