我的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>
立即打印出单独的测试结果?
答案 0 :(得分:4)
我按照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
编译该类。
答案 1 :(得分:1)
我相信内置的JUnit格式化程序会将所有内容缓冲到最后。您应该能够编写自己的格式化程序实现,该实现扩展org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter
以便立即刷新到STDOUT,但我从未这样做过。
您可以使用此博客,其中作者制作自定义格式化程序,并在build.xml http://shaman-sir.wikidot.com/one-liner-output-formatter
中显示代码以及如何使用它还有一个类似的SO问题,其中包含类似的信息How do I configure JUnit Ant task to only produce output on failures?