web-dev-qa-db-ja.com

Junitから実行すると、System.out.printがコンソールに出力されない

実行時:

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

対junitから同じコードを実行する場合:

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

異なる動作があります:
for main()-プロセスが実行されると期待どおりに出力が表示されます( "。"-> ".."-> "...")

ただし、JUnitの場合、同じコードを実行すると、プロセスの実行時に出力が表示されません-テストを終了したときにのみフラッシュされます。

なぜこれが起こるのですか?テスト実行中にステータスをコンソールに表示する必要がある場合、回避策はありますか?

同じ行に出力する必要があるため、printlnを使用するのは適切ではありません。

9
Lika

JUnitテストを実行する方法は多数あります(IDE内、Mavenなどのビルドシステム内、またはJUnitライブラリを直接使用するコマンドラインから)。それを実行している方法は、すべての出力でフラッシュしない標準出力を使用しているようです。 (多くの場合、テストは継続的インテグレーションシステムを使用してバッチで実行され、ログは後で確認されるため、これは意図的なものであり、書き込みごとにフラッシュしないことでパフォーマンスが向上する可能性があります。)

ただし、バッファを明示的にフラッシュする必要がある場合は、各_.print_呼び出しの後に System.out.flush(); を使用してみてください。

別のオプションは、実際に何をしようとしているかに応じて、組み込みのSystem.outストリームよりもフル機能のロギングシステムを使用することです。

6
user65839

Ctrl + Shift + pと入力して、show test outputと入力します。または、出力ウィンドウ(Ctrl + J)を開いて、右上隅にあるコンボボックスからのテスト出力の表示を選択することもできます。

2
Leandro Tavares

これはIntelliJ 2019ではまだ機能しません。*ため息*

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

あなたが探しているものをいくらか達成するには、定期的に次のように改行を強制する必要がありました。

@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