Ant脚本用于从多个模块运行单元测试,如果测试失败,则会使构建失败

时间:2014-09-10 09:27:28

标签: java unit-testing ant junit continuous-integration

我的项目有几个模块,每个模块都有自己的构建脚本,目标名为“单元测试”(运行单元测试)。我创建了一个Ant脚本,它调用模块中的“单元测试”目标,运行所有测试,然后从执行的测试的输出生成junitreport(保存在xml文件中)。到目前为止一切都那么好,但我现在想要的是,如果至少有一个测试失败,那么构建失败。

我的脚本现在看起来像这样,我需要一些方法来查明单元测试是否失败。(我知道failureproperty任务中的junit但我不知道我怎么能把它传递给调用脚本)

    ....
<target name="run-unit-tests" depends="init-output">
  <ant antfile="${module1}/build.xml" inheritAll="false" target="${junit-target}" />
  <ant antfile="${module2}/build.xml" inheritAll="false" target="${junit-target}" />
    ....
</target>

<target name="default" depends="run-unit-tests">
    <junitreport todir="${junit.report.dir}" tofile="TEST-UnitTestSuites.xml">
        <fileset dir="${junit.output.dir}">
            <include name="**/TEST-*.xml" />
        </fileset>
    </junitreport>

   //---->fail the build if at least one unit tests has failed
</target>

非常感谢任何想法。谢谢:))

1 个答案:

答案 0 :(得分:1)

在尝试提出各种“技巧”来实现这一点后,我终于找到了一种我很高兴的方法。我为每个模块的build.xml文件定义了一个目标:

<junit failureproperty="testsFailed" showoutput="true">         
        ...
        <formatter type="xml" />
</junit>
<fail if="${testsFailed}" message="Some of the unit tests failed." />
<!-- the fail task throws an exception if ${testsFailed} is true -->

这将在模块中执行单元测试,如果任何测试失败,则会抛出异常。它还将junit输出记录在xml文件中。在tests.xml构建文件中,我有这样的东西:

<target name="run-unit-tests" >
    <run-tests location="${module1.location}" />
    <run-tests location="${module2.location}" />
</target>

<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Writes the results of the unit tests in a junit report        -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<target name="unit-tests" depends="run-unit-tests">
    <junitreport todir="${junit.report.dir}" tofile="TEST-UnitTestSuites.xml">
        <fileset dir="${junit.output.dir}">
            <include name="**/TEST-*.xml" />
        </fileset>
    </junitreport>
    <fail if="${testsFailed2}" message="Some of the unit tests failed." />
</target>

<macrodef name="run-tests">
    <attribute name="location" />
    <sequential>
        <trycatch>
            <try>
                <echo message="@{location}" />
                <if>
                    <available file="@{location}/build.xml" />
                    <then>
                        <ant antfile="@{location}/build.xml" inheritAll="false" target="${junit-target}" />
                    </then>
                </if>
            </try>
            <catch>
                <property name="testsFailed2" value="true" />
            </catch>
        </trycatch>
    </sequential>
</macrodef>

如果模块中的测试失败,则捕获异常并设置testsFailed2属性。现在运行所有测试并将junit输出保存在同一文件夹中。 unit-tests目标从所有测试输出创建单个xml报告(此报告可用于持续集成构建),如果任何单元测试失败,则ant脚本将失败。 希望这有助于某人:)