6

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

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

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

更新:事实证明我很愚蠢。我的 <testng> 任务中有 haltOnFailure="true" ,这解释了我看到的行为。现在的问题是,即使测试失败,将其设置为 false 也会导致整个 ant 构建成功,这不是我想要的。下面使用任务的答案看起来可能是我想要的..

4

5 回答 5

5

根据Ant 文档,如果 testng 任务失败,有两个属性控制构建过程是否停止:

haltonfailure - 如果在测试运行期间发生故障,则停止构建过程。默认为假。

haltonskipped - 如果至少有一个跳过的测试,则停止构建过程。默认为假。

我无法从片段中判断您是否设置了此属性。如果当前设置为 true,则可能值得尝试将 haltonfailure 显式设置为 false。

此外,假设您在 Ant 中使用 <exec> 功能,有类似的属性可以控制如果执行的命令失败会发生什么:

failonerror - 如果命令退出并返回代码信号失败,则停止构建过程。默认为假。

failifexecutionfails - 如果我们无法启动程序,则停止构建。默认为真。

根据您帖子中的部分代码片段无法判断,但我猜测最可能的罪魁祸首是failonerrorhaltonfailure设置为true。

于 2008-09-24T16:51:27.767 回答
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>
于 2008-09-24T16:52:01.650 回答
4

您的问题的解决方案是failureProperty结合使用haltOnFailuretestng 任务的属性,如下所示:

<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>

然后,您可以在希望 ant 构建失败的地方调用 doSomethingIfTestsFailed。

于 2008-09-25T17:05:04.357 回答
0

尽管您在示例中显示了一个名为“testng”的假任务,但我认为您正在使用 junit 目标。

在这种情况下,您看到这些结果很奇怪,因为 junit 目标默认情况下不会在测试失败时中止执行。

有一种方法可以通过使用停止属性来实际告诉 ant 在 junit 失败或错误时停止构建,例如。停机故障

<target name="junit" depends="junitcompile">
    <junit printsummary="withOutAndErr" fork="yes" haltonfailure="yes">

但是,haltonfailurehaltonerror默认设置为关闭。我想您可以检查您的构建文件以查看是否设置了这些标志中的任何一个。它们甚至可以全局设置,因此您可以尝试的一件事是在您的任务中明确将其设置为“否”,以确保在全局范围内设置它时将其覆盖。

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

于 2008-09-24T17:02:28.707 回答
0

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

于 2008-09-24T18:16:15.910 回答