2013-08-17 4 views
5

У меня есть следующий в моих build.xml:Немедленного JUnit тест каротаж с <junit> Ant Task

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

Я хотел бы результаты JUnit, чтобы сообщаться для каждого теста, как только они завершат, к сожалению, задачи JUnit только принты результаты теста после завершения всего теста. Тест-сценарий (AllTests) довольно большой, поэтому я должен ждать достаточно времени для вывода. Есть ли способ сделать <junit> распечатать отдельные результаты теста сразу?

ответ

3

Я следовал предложению дкацеля написать свой собственный 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

Я считаю, что встроенные форматирующие устройства 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?

+0

Благодарим вас за этот ответ. Я добавил свой собственный ответ с кодом, который я использовал, чтобы заставить его работать, так как я думаю, что пример, с которым вы связаны, излишне длинный. – user11171

Смежные вопросы