在xml中自动生成JUnit结果的最佳方法是什么? [英] What is the best way to automatically generate JUnit results in xml?

查看:89
本文介绍了在xml中自动生成JUnit结果的最佳方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在JUnit中编写一系列测试。我需要自动将结果导出为XML。我正在阅读,最好的方法是扩展RunListener类并以这种方式编写XML。下面是我到目前为止所做的一些示例,但我正在努力解决如何提取已运行的每个测试的信息。 描述类似乎没有任何有用的get方法,我觉得我可能会以错误的方式解决这个问题。

I am currently writing a series of tests in JUnit. I need to automatically export the results as XML. I was reading that the best way of doing this is by extending the RunListener class and writing the XML that way. Below is a sample of what I have done so far, but I am struggling with how to extract information on each test that has been run. The 'Description' class doesn't seem to have any useful get methods and I feel like I am maybe going about this the wrong way.

有人可以协助如何从描述中获取有用的信息(例如测试通过/失败,测试持续时间,测试名称等)或者给我一些关于我的建议实际应该做什么?

Can someone assist with how to get useful information from description (eg. test passed / failed, duration of test, test name etc) or give me some advice on what I actually should be doing?

public class XmlListener extends RunListener {

    private final PrintStream fWriter;

    public XmlListener(JUnitSystem system) {
        this(system.out());
    }

    public XmlListener(PrintStream writer) {
        this.fWriter = writer;
    }

    @Override
    public void testRunStarted(Description description) {
        fWriter.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    }

    @Override
    public void testRunFinished(Result result) {
        fWriter.append("\t\t</suite>\n");
        fWriter.append("\t</suites>\n");
        fWriter.append("</result>\n");
        printHeader(result.getRunTime());
        printFailures(result);
        printFooter(result);

    }

    @Override
    public void testStarted(Description description) {
        fWriter.append("\t\t\t<case>\n");
        fWriter.append("\t\t\t\t<timestamp>"  + "</timestamp>\n");
        fWriter.append("\t\t\t\t<className>"  + "</className>\n");
        fWriter.append("\t\t\t\t<testName>"  + "</testName>\n");
    }

    @Override
    public void testFinished(Description description) {
        fWriter.append("\t\t\t\t<duration>"  + "</duration>\n");
        fWriter.append("\t\t\t</case>\n");
        Iterator it = description.getAnnotations().iterator();
        while (it.hasNext()) {
            fWriter.append(it.next().toString());
        }
    }

    @Override
    public void testFailure(Failure failure) {
        fWriter.append('E');
    }

    @Override
    public void testIgnored(Description description) {
        fWriter.append('I');
    }

    /**
     * private methods
     * @return
     */

    private PrintStream getWriter() {
        return fWriter;
    }

    protected void printHeader(long runTime) {
        getWriter().println();
        getWriter().println("Time: " + elapsedTimeAsString(runTime));
    }

    protected void printFailures(Result result) {
        List<Failure> failures= result.getFailures();
        if (failures.size() == 0)
            return;
        if (failures.size() == 1)
            getWriter().println("There was " + failures.size() + " failure:");
        else
            getWriter().println("There were " + failures.size() + " failures:");
        int i= 1;
        for (Failure each : failures)
            printFailure(each, "" + i++);
    }

    protected void printFailure(Failure each, String prefix) {
        getWriter().println(prefix + ") " + each.getTestHeader());
        getWriter().print(each.getTrace());
    }

    protected void printFooter(Result result) {
        if (result.wasSuccessful()) {
            getWriter().println();
            getWriter().println("\t</suites>\n");
            getWriter().println("</result>\n");
            getWriter().println(" (" + result.getRunCount() + " test" + (result.getRunCount() == 1 ? "" : "s") + ")");

        } else {
            getWriter().println();
            getWriter().println("FAILURES!!!");
            getWriter().println("Tests run: " + result.getRunCount() + ",  Failures: " + result.getFailureCount());
        }
        getWriter().println();
    }

    /**
     * Returns the formatted string of the elapsed time. Duplicated from
     * BaseTestRunner. Fix it.
     */
    protected String elapsedTimeAsString(long runTime) {
        return NumberFormat.getInstance().format((double) runTime / 1000);
    }
}

UPDATE - Ant构建文件

UPDATE - Ant build file

<?xml version="1.0" encoding="UTF-8"?>
<project name="COTPlus" default="main" basedir=".">
<property name="src.dir" location="src" />

<target name="test" >
<junit printsummary="on" haltonfailure="false">
  <formatter type="xml" />
  <batchtest todir="/test-reports">
    <fileset dir="${src.dir}" includes="**/ExampleTest.java"  />
  </batchtest>
</junit>
</target>

<target name="main" depends="test">
        <description>Main target</description>
        <echo>${src.dir}</echo>
    </target>

</project>


推荐答案

您可以使用Ant脚本获取XML结果

You can use a Ant Script to get XML Results

<target name="test" >

 <javac srcdir="/src"
     destdir="/bin"
     classpath="/lib/junit.jar"  />


<junit haltonfailure="false">
  <formatter type="xml" />
  <batchtest todir="/test-reports">
    <fileset dir="/bin" includes="tests/ExampleTest.class"  />
  </batchtest>
</junit>
</target>

这将在/ test-reports文件夹中生成一个xml。有关Ant构建的更多详细信息 http://ant.apache.org/manual/tasksoverview.html

this will Generate an xml into the /test-reports Folder. More Details on Ant Builds http://ant.apache.org/manual/tasksoverview.html

这篇关于在xml中自动生成JUnit结果的最佳方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆