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】:我正在使用gradle
。 System.out
和 java.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() 在测试方法中不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章
是否可以以相反的顺序使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()的差别