1

如果我调用 test-all,我可以让 build.xml 报告由目标定义的所有类,但如果我只想运行几个目标,我的 Junit 报告只显示最后一个运行的类。

为了进一步解释,我的 build.xml “runAll”和“runTest”中有两个目标。当我执行 runAll 目标时,我的所有类都会显示在 Junit 报告中。当我使用 runTest 运行多个目标时,我的 junit 报告只显示最后一个运行的类。

这工作并报告所有课程:
ant test-all

这不会且仅报告最后一课:
ant testClass1 testClass2 testClass3

这是我在我的构建 xml 中为 runAll 运行的片段(这个有效):

<target name="runAll" depends="clean,compile, compileTests">
    <taskdef resource="festjunittasks" classpathref="classpath" />

    <mkdir dir="${report.dir}"/>
    <mkdir dir="${results.dir}"/>
    <mkdir dir="${htmlresults.dir}"/>
    <!-- <mkdir dir="${iphone.dir}"/> -->

      <junit forkmode="perTest" printsummary="yes" haltonfailure="no" haltonerror="no" maxmemory="4096m">



        <classpath>
            <path refid="classpath"/>
        </classpath>

        <formatter classname="org.fest.swing.junit.ant.ScreenshotOnFailureResultFormatter" extension=".xml" />

        <batchtest fork="yes" todir="${results.dir}">
            <fileset dir="${testclasses.dir}" includes="**/*Test*.class" />
        </batchtest>
    </junit>

    <festreport todir="${report.dir}">
        <classpath refid="classpath" />
        <fileset dir="${results.dir}">
          <include name="TEST-*.xml" />
        </fileset>
        <report format="frames" todir="${htmlresults.dir}/html" />
      </festreport>
    <copy todir="${history.dir}">
        <fileset dir="${html.dir}"/>
        </copy>


</target >

这是我的 runTest 的片段(这个只报告最后一堂课):

<target name="runTest" depends="clean,compile, compileTests">
    <taskdef resource="festjunittasks" classpathref="classpath" />
    <mkdir dir="${report.dir}"/>
    <mkdir dir="${results.dir}"/>
    <mkdir dir="${htmlresults.dir}"/>
    <!-- <mkdir dir="${iphone.dir}"/> -->

    <junit forkmode="perTest" printsummary="yes" haltonfailure="no" haltonerror="no" maxmemory="4096m">

        <classpath>
            <path refid="classpath"/>
        </classpath>

        <formatter classname="org.fest.swing.junit.ant.ScreenshotOnFailureResultFormatter" extension=".xml" />

        <batchtest fork="yes" todir="${results.dir}">
            <fileset dir="${testclasses.dir}" includes="**/${test.to.run}" />
        </batchtest>
    </junit>

    <festreport todir="${report.dir}">
        <classpath refid="classpath" />
        <fileset dir="${results.dir}">
          <include name="TEST-*.xml" />
        </fileset>
        <report format="frames" todir="${htmlresults.dir}/html" />
    </festreport>
    <copy todir="${history.dir}">
        <fileset dir="${html.dir}"/>
    </copy>

</target >

提前致谢

4

2 回答 2

1

您面临的问题是,当您运行第一个测试类并且 junit 创建一个 html 报告时,junit 通常将以下 html 文件放在您选择的目录中,在您的情况下,它会是 '${htmlresults.dir}/html' :

/com
all-tests.html
allclasses-frame.html
alltests-errors.html
alltests-fails.html
index.html
overview-frame.html
overview-summary.html
stylesheet.css

当您运行第二个测试时,会为第二个类创建相同的 html 文件名并存储在相同的目录 ('${htmlresults.dir}/html') 中。发生的情况是第一类的 html 文件被第二类的 html 文件名覆盖,因为 html 文件名是恒定的。查看 build.xml 片段,您可以做的最简单的事情是转到您的 runTest 目标并将 festreport 节点替换为这个:

用于 runTest 目标的新 festreoprt 节点

<festreport todir="${report.dir}"> 
<classpath refid="classpath" />
<fileset dir="${results.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${htmlresults.dir}/html/${test.to.run}" />
</festreport>

用于 runTest 目标的 OLD festreoprt 节点

<festreport todir="${report.dir}">
<classpath refid="classpath" />
<fileset dir="${results.dir}">
<include name="TEST-*.xml" />
</fileset>
<report format="frames" todir="${htmlresults.dir}/html" />
</festreport>

我所做的更改非常简单。

我所做的只是告诉 junit target testRun 创建一个以刚刚运行的类命名的文件夹,

由“${htmlresults.dir}/html/ ${test.to.run} ”表示。

创建该文件夹后,它将 html 报告文件存储在具有指定类名的文件夹中。当执行下一个连续的目标时,junit 将运行目标,创建一个以正在运行的类命名的新文件夹,然后将 html 文件存储在类文件夹中。

之后您将永远不会遇到 html 文件覆盖问题。

于 2011-06-06T19:53:23.503 回答
1

看起来 runTest 在您的构建中被循环调用。如果是这种情况,您可以更改它以创建一个包含您想要运行的所有测试并一次运行它们的单个文件集吗?这是最简单的方法,因为 junitreport(可能是 festreport)期望一次运行的 xml 输出。

如果不能一起运行测试,另一种方法是运行 XML 转换以在报告之前合并 XML 输出。不过,构建单个文件集应该更容易。

于 2011-06-06T02:31:42.530 回答