Junit Reports仅显示使用build.xml执行时运行的最后一个类

时间:2011-06-05 00:28:15

标签: ant junit build.xml

如果我调用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 >

提前致谢

2 个答案:

答案 0 :(得分:1)

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

如果无法一起运行测试,则可以选择运行XML转换以在报告之前合并XML输出。构建单个文件集应该更容易。

答案 1 :(得分: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 NODE

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

旧版festreoprt针对runTest目标的NODE

<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文件覆盖问题。