2013-08-17 5 views
5

Ho il seguente nel mio build.xml:immediata JUnit registrazione di prova con <junit> Ant Task

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

Vorrei i risultati JUnit da segnalare per ogni test il più presto portare a termine, purtroppo il compito JUnit solo stampa i risultati del test dopo che l'intero caso di test è stato completato. Il test case (AllTests) è piuttosto grande, quindi devo aspettare un po 'per l'output. Esiste un modo per rendere immediatamente <junit> i singoli risultati dei test?

risposta

3

Ho seguito il suggerimento di dkatzel di scrivere il mio JUnitResultFormatter. Ecco il codice per il mio 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(); 
    } 
} 

E questo è come lo uso nello script Ant:

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

Si noti che la classe deve essere compilato con ant.jar e ant-junit.jar nel classpath.

1

Credo che i formattori JUnit integrati conservino tutto fino alla fine. Dovresti essere in grado di scrivere la tua implementazione di formattazione che estende org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter in modo che venga scaricata immediatamente in STDOUT, ma non l'ho mai eseguita.

È possibile utilizzare questo blog dove l'autore fa una formattazione personalizzata e mostra sia il codice e come usarlo nel build.xml http://shaman-sir.wikidot.com/one-liner-output-formatter

C'è anche una simile domanda SO con informazioni simili How do I configure JUnit Ant task to only produce output on failures?

+0

Grazie per questa risposta. Ho aggiunto la mia risposta con il codice che ho usato per farlo funzionare poiché penso che l'esempio a cui si è collegati sia inutilmente lungo. – user11171