无条件地在ant中执行任务?

时间:2008-09-24 16:40:15

标签: java unit-testing ant

我正在尝试定义在目标完成执行时发出(使用echo)消息的任务,无论该目标是否成功。具体来说,目标执行一个任务来运行一些单元测试,我想发出一条消息,指出结果的可用位置:

<target name="mytarget">
  <testng outputDir="${results}" ...>
    ...
  </testng>
  <echo>Tests complete.  Results available in ${results}</echo>
</target>

不幸的是,如果测试失败,则任务失败并且执行中止。因此,只有在测试通过时才输出消息 - 与我想要的相反。我知道我可以将任务放在任务之前,但这会让用户更容易错过这条消息。我正在尝试做什么?

更新:事实证明我是愚蠢的。我的&lt; testng&gt;中有haltOnFailure =“true”任务,这解释了我所看到的行为。现在的问题是,将此设置为false会导致整个ant构建成功,即使测试失败,这也不是我想要的。以下使用该任务的答案看起来可能就是我想要的......

5 个答案:

答案 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”,以确保在全局范围内设置它时它被覆盖。

http://ant.apache.org/manual/Tasks/junit.html

答案 4 :(得分:0)

你可以分叉testng任务吗?如果是,那么,您可能希望使用该功能,以便testng任务将在不同的JVM上运行。