从Junit运行时,System.out.print不输出到控制台

时间:2016-05-22 08:36:16

标签: java multithreading junit junit4 system.out

运行时:

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

VS。从junit运行相同的代码时:

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

有不同的行为:
对于main() - 当流程运行时,输出会按预期显示("。" - >" .." - >" ... &#34)

但是,对于JUnit,当运行相同的代码时,进程运行时不会显示输出 - 只有在退出测试时才会刷新。

为什么会这样?如果我需要在测试运行期间在控制台中显示状态,有没有办法解决它?

我需要打印到同一行,所以使用println不适合。

4 个答案:

答案 0 :(得分:5)

人们可以通过多种方式运行JUnit测试(来自IDE内部,来自Maven等构建系统,或来自直接使用JUnit库的命令行)。看来,运行它的方式使用的标准输出不会在每个输出上刷新。 (这可能是故意的,因为通常使用持续集成系统批量运行测试,然后审查日志,因此不会在每次写入时刷新都可以提高性能。)

但是,如果您需要明确刷新缓冲区,请在每次.print调用后尝试使用System.out.flush();

根据您实际想要做的事情,另一个选择可能是使用比内置System.out流更全功能的日志记录系统。

答案 1 :(得分:1)

Ctrl + Shift + p并输入show test output。或者,您可以打开输出窗口(Ctrl + J)并选择从右上角的组合框中查看测试输出。

答案 2 :(得分:0)

这在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
    }};
}

答案 3 :(得分:0)

或者,您可以使用您选择的记录器。使用 log4j 在控制台上打印输出。 导入以下依赖于 pom.xml

  <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

在 JUnitTestClass 中导入

import org.apache.log4j.Logger;

然后声明日志

public static Logger log = Logger.getLogger(JUnitTest.class.getName());

打印输出 log.info("....");

希望这适用于您的情况。