web-dev-qa-db-de.com

System.out.print wird unter Junit nicht an die Konsole ausgegeben

Beim Laufen:

public static void main(String... args) throws InterruptedException {
    while (true) {
        System.out.print(".");
        Thread.sleep(200);
    }
}

im Gegensatz zu, wenn derselbe Code von junit ausgeführt wird:

@Test
public void test() throws Exception {
    while (true) {
        System.out.print(".");
        Thread.sleep(200);
    }
}

Es gibt unterschiedliches Verhalten:
für main () - die Ausgabe wird erwartungsgemäß angezeigt, während der Prozess ausgeführt wird ("." -> ".." -> "...")

bei JUnit wird jedoch beim Ausführen desselben Codeteils während der Ausführung keine Ausgabe angezeigt. Die Ausgabe wird nur beim Beenden des Tests gelöscht.

Warum passiert das? Gibt es eine Möglichkeit, dies zu umgehen, wenn der Status während des Testlaufs in der Konsole angezeigt werden soll?

Ich muss in der gleichen Zeile drucken, damit die Verwendung von println nicht passt.

7
Lika

Es gibt viele Möglichkeiten, wie Benutzer JUnit-Tests ausführen (in einer IDE, in einem Build-System wie Maven oder über eine Befehlszeile, die die JUnit-Bibliothek direkt verwendet). Es scheint, dass die Art und Weise, wie Sie es ausführen, eine Standardausgabe verwendet, die nicht bei jeder Ausgabe gelöscht wird. (Dies ist wahrscheinlich beabsichtigt, da Tests häufig in einem Stapel unter Verwendung eines kontinuierlichen Integrationssystems ausgeführt werden und die Protokolle anschließend überprüft werden, sodass nicht bei jedem Schreibvorgang die Leistung verbessert werden kann.)

Wenn Sie den Puffer jedoch explizit leeren müssen, versuchen Sie, nach jedem Aufruf von .printSystem.out.flush(); zu verwenden.

Eine weitere Option ist, je nachdem, was Sie tatsächlich tun möchten, möglicherweise die Verwendung eines umfassenderen Protokollierungssystems als der integrierte Stream "System.out".

4

Strg + Umschalt + p und Typ zeigen die Testausgabe. Alternativ können Sie das Ausgabefenster öffnen (Strg + J) und wählen, ob die Testausgabe aus einem Kombinationsfeld in der rechten oberen Ecke angezeigt werden soll.

0
Leandro Tavares

In IntelliJ 2019 funktioniert das immer noch nicht. * Seufz *

@Test
public void test() throws Exception {
    while (true) {
        System.out.print(".");
        Thread.sleep(200);
    }
}

Um etwas zu erreichen, wonach Sie suchen, musste ich in regelmäßigen Abständen einen Zeilenumbruch erzwingen:

@Before
public void forceConsoleOutput()
{
    new Thread( () -> {
        for ( ; ; )
        {
            // Does nothing. Why JetBrains?
            // System.out.flush();

            System.out.println();
            try
            {
                Thread.sleep( 5000 );
            }
            catch ( InterruptedException e )
            {
                e.printStackTrace();
            }
        }
    } )
    {{
        start();
        System.out.println( "Terminated" ); // The threads naturally stop between method tests
    }};
}
0
Drakes