System.out.print() 在测试方法中不显示任何内容

Posted

技术标签:

【中文标题】System.out.print() 在测试方法中不显示任何内容【英文标题】:System.out.print() doesn't show anything in test methods 【发布时间】:2015-06-11 21:23:18 【问题描述】:

我试图在我的单元测试 (@Test mehotds) 中使用 System.out 打印一些数据,但它没有显示任何内容。但是,它在@Before 方法中可以正常工作。我正在使用带有 Maven Surefire 插件的 JUnit。

public class MyTests 

  @Before
  void init()

    System.out.println("Initializing some data..."); // <- It works.

  

  @Test
  void shouldRemoveSeries() 

    System.out.println("TEST: Should remove series"); // <- It doesn't.

  

maven-surefire-plugin配置:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.15</version>
  <configuration>
    <includes>
      <include>**/*Tests.java</include>
    </includes>
  </configuration>
</plugin>

谢谢。

【问题讨论】:

澄清一下:你为什么使用 System.out.println() 而不是 Logger?后者是为你写的目的而设计的 您是否尝试过以: test 开头的测试名称?有需要这个的 JUnit 版本。 作为 Junit 测试或 Maven 测试运行 看看@gclaussn的回答。 您应该更改测试的名称,而不是 maven-surefire-plugin 的配置。遵守约定。 【参考方案1】:

Maven 的-Dtest=* 命令行选项似乎触发了单元测试中标准输出的显示。

按照惯例,标准输出显示在target/surefire-reports/*-output.txt 中。显然,Surefire 插件开发人员无法重用标准输出来在测试和框架之间进行许多通信。

【讨论】:

【参考方案2】:

我正在使用gradleSystem.outjava.util.logging.Logger 都有这个问题。我编辑了build.gradle 文件的以下部分:

test 
  testLogging 
    exceptionFormat = 'full'
    events = ["passed", "failed", "skipped"]
  

并在testLogging 下添加了showStandardStreams = true。结果如下:

test 
  testLogging 
    exceptionFormat = 'full'
    events = ["passed", "failed", "skipped"]
    showStandardStreams = true
  

它修复了它们。

【讨论】:

在 gradle 6.6.1 上我不得不使用 --info【参考方案3】:

我在单独的非测试类中做了一些小把戏。它没有记录器那么流畅,但是如果您正在寻找 Spring Boot 中的快速解决方案,您可以使用它。

PrintForTest.java

import org.springframework.stereotype.Controller;

@Controller
public class PrintForTest 

    public static void print(String input)
        System.out.println(input);
    

MainTest.java

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.junit.Assert;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
public class MainTest 

...

    @Test
    public void testingSomething()
        PrintForTest.print("My new System.out.print()");
        Assert.assertEquals(...);
    


已编辑:使用静态方法,无需使用@Autowired。

【讨论】:

我看不出您的代码与仅使用 System.out.println("My new System.out.print()"); 之间有任何区别。为什么通过 Spring bean 打印时它可以工作? 我不知道为什么它在测试方法中不起作用。无论如何,在这种情况下 System.out.print 被从测试方法中调用,这解决了我的问题。 感谢您的回答!【参考方案4】:

也遇到了这个问题。我正在使用 gradle 来管理我的任务,并将其放在 build.gradle 文件的末尾:

test 
  testLogging.showStandardStreams = true

现在我看到了System.out.println(whateves)

【讨论】:

我需要提一下,gradle中没有使用=符号,应该只是testLogging.showStandardStreams true 这是从 2016 年的工作代码中复制和粘贴的。YMMV,所以也许不再需要使用 = 了?你要承担风险。 :) 不知道。如果您使用 kotlin 格式而不是 build.gradle 的默认 groovy 格式,可能需要它。 @AndreiChernikov 在 Java 格式的 build.gradle 中使用了 = 符号。 也适用于 JUnit 5。【参考方案5】:

要通过 System.out.println 获取书面测试的输出,您需要配置 maven-surefire-plugin 以将此输出重定向到文件中,这可以通过以下方式实现:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.18.1</version>
  <configuration>
    <redirectTestOutputToFile>true</redirectTestOutputToFile>
  </configuration>
</plugin>

redirectTestOutputToFile 选项会将 System.out.println 等的输出重定向到一个单独创建的文件中:

文档摘录:

将此设置为“true”以将单元测试标准输出重定向到文件 (在报告目录/testName-output.txt 中找到)。

除此之外,System.out.println 通常在单元测试中没有意义。

【讨论】:

【参考方案6】:

这听起来对我来说很熟悉,所以我假设您正在从某个 IDE(Netbeans?)运行您的测试。它可能只显示失败的测试的输出。从控制台运行测试时也会出现这种情况吗?

使用System.err 而不是System.out 可能会更幸运,但我不确定。

【讨论】:

【参考方案7】:

问题是您的测试类的名称。要在构建中的测试阶段被识别(由 Maven surefire 插件),它必须命名为“*Test”:

Inclusions and Exclusions of Tests

【讨论】:

【参考方案8】:

使用Log

private static Logger log = Logger.getLogger(LoggingObject.class);
log.info("I'm starting");

或System.setOut()

private final PrintStream stdout = System.out;
private final ByteArrayOutputStream output = new ByteArrayOutputStream();
private TerminalView terminalview;

【讨论】:

我已经尝试过使用 Logger,但它仍然没有显示任何内容。测试没有通过,我的意思是,它们运行时出错,这可能是日志记录不起作用的原因吗? 你在测试中遇到的任何东西,理论上都将成为被评估的候选者,所以也许测试正在捕获日志作为测试的一部分,这就是为什么 a) 控制台中没有结果 b) 测试未能通过.. . 检查System.setOut() 链接,我将能够创建一个函数来打印您想要的内容,而不会弄乱测试... ;) 它对我不起作用 :( 并且Logger 在 @Before 方法中不起作用,同时 System.out.print() 起作用。 日志链接已损坏。 什么是终端视图?它不是标准的 Java 类。

以上是关于System.out.print() 在测试方法中不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章

java中如何快速打出System.out.print

是否可以以相反的顺序使System.out.print排序变量?

JAVA中System.out.println和System.out.print有啥区别?

JAVA中System.out.println和System.out.print有什么区别

java中System.out.print()与System.out.println()与System.out.printf()的差别

关于java的print()