2013-08-17 7 views
5

Ich habe folgende in meinem build.xml:Sofortige JUnit-Testprotokollierung mit <junit> Ant-Task

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

Ich würde die JUnit Ergebnisse wie für jeden Test gemeldet werden, sobald sie abgeschlossen ist, leider die JUnit Aufgabe druckt nur die Testergebnisse nach Abschluss des gesamten Testfalls. Der Testfall (AllTests) ist ziemlich groß, daher muss ich ziemlich lange auf die Ausgabe warten. Gibt es eine Möglichkeit <junit> einzelne Testergebnisse sofort zu drucken?

Antwort

3

Ich folgte dem Vorschlag von Dkatzel, meine eigene JUnitResultFormatter zu schreiben. Hier ist der Code für meine 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(); 
    } 
} 

Und das ist, wie ich es in der Ant-Skript verwenden:

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

Beachten Sie, dass die Klasse muss mit ant.jar und ant-junit.jar auf dem Classpath kompiliert werden.

1

Ich glaube, dass die eingebauten JUnit Formatierer alles bis zum Ende puffern. Sie sollten in der Lage sein, Ihre eigene Formatiererimplementierung zu schreiben, die org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter erweitert, so dass es sofort zu STDOUT führt, aber ich habe es nie getan.

Sie können diesen Blog verwenden, in denen der Autor einen benutzerdefinierten Formatierer macht und zeigt sowohl den Code und wie es in der build.xml verwenden http://shaman-sir.wikidot.com/one-liner-output-formatter

Es gibt auch eine ähnliche SO mit ähnlichen Informationen Frage How do I configure JUnit Ant task to only produce output on failures?

+0

Vielen Dank für diese Antwort. Ich habe meine eigene Antwort mit dem Code hinzugefügt, den ich verwendet habe, um dies zum Laufen zu bringen, da ich denke, dass das Beispiel, mit dem Sie verlinkt haben, unnötig lang ist. – user11171

Verwandte Themen