web-dev-qa-db-fra.com

System.out.print ne génère pas de données sur la console lors de l'exécution de Junit

En cours d'exécution:

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

contre le même code à partir de junit:

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

Il y a un comportement différent:
pour le principal () - la sortie est affichée comme prévu lors de l'exécution du processus ("." -> ".." -> "...")

cependant, pour JUnit, lors de l'exécution du même morceau de code, aucune sortie n'est affichée lors de l'exécution du processus. Elle n'est vidée que lorsque vous quittez le test.

Pourquoi cela arrive-t-il? Existe-t-il un moyen de contourner le problème si j'ai besoin que l'état soit affiché dans la console lors de l'exécution du test?

Je dois imprimer sur la même ligne, donc utiliser println ne conviendrait pas.

7
Lika

Les utilisateurs exécutent des tests JUnit de nombreuses façons (à partir d'un IDE, d'un système de construction tel que Maven ou d'une ligne de commande utilisant directement la bibliothèque JUnit). Il semble que la façon dont vous l'exécutez utilise une sortie standard qui ne videra pas chaque sortie. (Ceci est probablement intentionnel, car les tests sont souvent exécutés par lots à l'aide d'un système d'intégration continue et les journaux sont ensuite examinés. Par conséquent, ne pas vider chaque écriture peut améliorer les performances.)

Toutefois, si vous devez vider le tampon explicitement, essayez d’utiliser System.out.flush(); après chaque appel .print.

Une autre option, en fonction de vos objectifs, consiste à utiliser un système de journalisation plus complet que le flux System.out intégré.

4
Peter Cooper Jr.

Ctrl + Maj + p et le type montrent la sortie du test. Vous pouvez également ouvrir la fenêtre de sortie (Ctrl + J) et choisir d'afficher Test Output dans une liste déroulante située dans le coin supérieur droit.

0
Leandro Tavares

Cela ne fonctionne toujours pas dans IntelliJ 2019. * soupir *

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

Pour obtenir un peu ce que vous cherchez, je devais forcer une nouvelle ligne périodiquement comme ceci:

@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