2013-08-17 13 views
5

Mam następujących w moim build.xml:rejestrowanie testu Natychmiastowe JUnit z <junit> Ant zadanie

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

Chciałbym wyniki JUnit być zgłaszane dla każdego testu, jak tylko kompletne, tylko niestety zadanie JUnit nadrukami wyniki testu po zakończeniu całego testu. Przypadek testowy (AllTests) jest dość duży, więc muszę trochę poczekać na wyjście. Czy jest jakiś sposób, aby od razu wydrukować indywidualne wyniki testu <junit>?

Odpowiedz

3

Podążyłem za sugestią Dkatzela, aby napisać własną JUnitResultFormatter. Oto kod dla mojego 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(); 
    } 
} 

I to jak go używać w skrypcie Ant:

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

Zauważ, że klasa musi być skompilowany z ant.jar i ant-junit.jar na ścieżce klasy.

1

Wierzę, że wbudowane formatery JUnit buforują wszystko do końca. Powinieneś być w stanie napisać własną implementację formattera, która rozszerza się o org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter, tak aby natychmiast opróżniał się do STDOUT, ale nigdy tego nie robiłem.

Można użyć tego bloga, w którym autor czyni niestandardowego formatowania i pokazuje zarówno kod i jak go używać w build.xml http://shaman-sir.wikidot.com/one-liner-output-formatter

Jest też podobny SO pytanie z podobną informacją How do I configure JUnit Ant task to only produce output on failures?

+0

Dziękuję za tę odpowiedź. Dodałem własną odpowiedź za pomocą kodu, którego użyłem, aby to zadziałało, ponieważ uważam, że przykład, z którym się łączysz, jest niepotrzebnie długi. – user11171

Powiązane problemy