6

我有以下内容build.xml

<junit fork="yes" printsummary="yes" filtertrace="yes">
    <classpath>...</classpath>
    <test name="tests.AllTests"/>
    <formatter type="plain" usefile="false"/>
</junit>

我希望在每个测试完成后立即报告 JUnit 结果,不幸的是,JUnit 任务仅在整个测试用例完成后打印测试结果。测试用例(AllTests)相当大,所以我必须等待很长时间才能输出。有什么方法可以<junit>立即打印个人测试结果?

4

2 回答 2

6

我按照 dkatzel 的建议编写了自己的JUnitResultFormatter. 这是我的 JUnitFormatter 的代码:

package util;

import java.io.OutputStream;
import java.io.PrintStream;

import junit.framework.AssertionFailedError;
import junit.framework.Test;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;

public class SimpleTestFormatter implements JUnitResultFormatter {
    private PrintStream out = System.out;

    @Override
    public void addError(Test test, Throwable error) {
        logResult(test, "ERR");
        out.println(error.getMessage());
    }

    @Override
    public void addFailure(Test test, AssertionFailedError failure) {
        logResult(test, "FAIL");
        out.println(failure.getMessage());
    }

    @Override
    public void endTest(Test test) {
        logResult(test, "PASS");
    }

    @Override
    public void startTest(Test test) { }

    @Override
    public void endTestSuite(JUnitTest testSuite) throws BuildException { }

    @Override
    public void setOutput(OutputStream out) {
        this.out = new PrintStream(out);
    }

    @Override
    public void setSystemError(String err) {
        // don't echo test error output
    }

    @Override
    public void setSystemOutput(String out) {
        // don't echo test output
    }

    @Override
    public void startTestSuite(JUnitTest testSuite) throws BuildException { }

    private void logResult(Test test, String result) {
        out.println("[" + result + "] " + String.valueOf(test));
        out.flush();
    }
}

这就是我在 Ant 脚本中使用它的方式:

<junit fork="yes" printsummary="yes" filtertrace="yes">
    <classpath>...</classpath>
    <test name="tests.AllTests"/>
    <formatter classname="util.SimpleTestFormatter" usefile="false"/>
</junit>

请注意,必须使用类路径编译ant.jar该类ant-junit.jar

于 2013-08-22T16:27:43.447 回答
2

我相信内置的 JUnit 格式化程序会缓冲所有内容直到结束。您应该能够编写自己的格式化程序实现,它可以扩展org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter以便立即刷新到 STDOUT,但我从未这样做过。

您可以使用此博客,其中作者制作了自定义格式化程序,并在 build.xml http://shaman-sir.wikidot.com/one-liner-output-formatter中显示了代码以及如何使用它

还有一个类似的 SO question with similar info How do I configure JUnit Ant task to only generate output on failures?

于 2013-08-21T01:49:01.923 回答