我正在尝试定义在目标完成执行时发出(使用echo)消息的任务,无论该目标是否成功。具体来说,目标执行一个任务来运行一些单元测试,我想发出一条消息,指出结果的可用位置:
<target name="mytarget">
<testng outputDir="${results}" ...>
...
</testng>
<echo>Tests complete. Results available in ${results}</echo>
</target>
不幸的是,如果测试失败,则任务失败并且执行中止。因此,只有在测试通过时才输出消息 - 与我想要的相反。我知道我可以将任务放在任务之前,但这会让用户更容易错过这条消息。我正在尝试做什么?
更新:事实证明我是愚蠢的。我的&lt; testng&gt;中有haltOnFailure =“true”任务,这解释了我所看到的行为。现在的问题是,将此设置为false会导致整个ant构建成功,即使测试失败,这也不是我想要的。以下使用该任务的答案看起来可能就是我想要的......
答案 0 :(得分:5)
根据Ant docs,如果testng任务失败,有两个属性可以控制构建过程是否停止:
haltonfailure - 停止构建过程 如果在此期间发生了故障 测试运行。默认为false。
haltonskipped - 停止构建过程 如果至少有跳过测试。 默认为false。
如果您要设置此属性,我无法从代码段中判断出来。如果当前设置为true,可能值得尝试将haltonfailure显式设置为false。
另外,假设您正在使用&lt; exec&gt; Ant中的功能,有类似的属性来控制执行的命令失败时会发生什么:
failonerror - 如果命令退出并返回代码,则停止构建过程 信令失败。默认为false。
failifexecutionfails - 如果我们无法启动程序,请停止构建。 默认为true。
根据您帖子中的部分代码段无法判断,但我的猜测是,最可能的罪魁祸首是 failonerror 或 haltonfailure 设置为true。 / p>
答案 1 :(得分:5)
您可以使用try-catch块,如下所示:
<target name="myTarget">
<trycatch property="foo" reference="bar">
<try>
<testing outputdir="${results}" ...>
...
</testing>
</try>
<catch>
<echo>Test failed</echo>
</catch>
<finally>
<echo>Tests complete. Results available in ${results}</echo>
</finally>
</trycatch>
</target>
答案 2 :(得分:4)
问题的解决方案是将failureProperty
与testng任务的haltOnFailure
属性结合使用,如下所示:
<target name="mytarget">
<testng outputDir="${results}" failureProperty="tests.failed" haltOnFailure="false" ...>
...
</testng>
<echo>Tests complete. Results available in ${results}</echo>
</target>
然后,在其他地方,如果您希望构建失败,请添加如下的ant代码:
<target name="doSomethingIfTestsWereSuccessful" unless="tests.failed">
...
</target>
<target name="doSomethingIfTestsFailed" if="tests.failed">
...
<fail message="Tests Failed" />
</target>
然后,您可以调用doSomethingIfTestsFailed,以使您的ant构建失败。
答案 3 :(得分:0)
虽然您在示例中显示了一个名为“testng”的假任务,但我认为您正在使用junit目标。
在这种情况下,您看到这些结果很奇怪,因为默认情况下,junit目标不会在测试失败时中止执行。
有一种方法可以通过使用暂停属性来实际告诉ant停止构建junit失败或错误,例如。 haltonfailure :
<target name="junit" depends="junitcompile">
<junit printsummary="withOutAndErr" fork="yes" haltonfailure="yes">
但是, haltonfailure 和 haltonerror 默认设置为关闭。我想你可以检查你的构建文件,看看是否已经设置了这些标志。它们甚至可以全局设置,因此你可以尝试的一件事是在你的任务上明确地将它设置为“no”,以确保在全局范围内设置它时它被覆盖。
答案 4 :(得分:0)
你可以分叉testng任务吗?如果是,那么,您可能希望使用该功能,以便testng任务将在不同的JVM上运行。