【问题标题】:Force JUnit to Display Uncaught Exception Stack Traces强制 JUnit 显示未捕获的异常堆栈跟踪
【发布时间】:2014-04-28 01:37:54
【问题描述】:

这在 JUnit 文档中可能已经很明显了,但似乎找不到它,也不记得是否有解决我将要描述的内容。

当我通过 maven (mvn test) 运行测试用例时,意外异常的堆栈跟踪根本不会显示在标准错误中。我得到的只是一条表明测试失败的消息。

如果我的测试代码抛出未经检查的异常,比如 NPE,我的测试用例输出如下所示:

Tests in error:
  testFoo(bar.Foo)

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

如果我的测试用例声明它可以抛出一个Exception 对象,我会像这样包装运行时异常:

@Test
public void testFoo() throws Exception
{
  try{ // something funky
     throw new NullPointerException();
  } catch( RuntimeException ex ) {
      throw new Exception(ex);
  }
}

然后我们得到这个:

Tests in error:
  testFoo(bar.Foo): java.lang.NullPointerException

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

现在我得到了一些几乎没有用的东西。但是,我想查看完整的墨西哥卷饼,整个堆栈跟踪。但是我似乎没有找到使用 JUnit 的方法,除了将我的测试用例包含在一个 catch/try 块中以将堆栈跟踪打印到标准错误(丑陋):

@Test
public void testFoo() throws Exception
{
  try{ // something funky
     throw new NullPointerException();
  } catch( RuntimeException ex ) {
      ex.printStackTrace(); // << this works, but it is ugly.
      throw ex;
  }
}

我讨厌这样做,因为它会污染 (IMO) 我的测试用例逻辑;它是手动的,我必须为每个测试用例都这样做(我宁愿把肘部润滑脂这样做,这样我就可以在那里和那里得到一个堆栈跟踪,而不是需要一个堆栈跟踪而不是它。)

有没有一种方法可以利用/告诉 JUnit,以便它打印任何未捕获异常的堆栈跟踪,而无需 * 不必依赖在我的测试用例代码中显式捕获/打印堆栈跟踪 *?

谢谢。

【问题讨论】:

  • 您希望您的测试在发生异常时通过还是失败?你为什么要打印整个堆栈跟踪 - 我想是为了调试 - 但为此你可以在你的 IDE 中看到完整的堆栈跟踪。
  • 确实可以使用 IDE。我想在构建日志中获取堆栈跟踪只是个人喜好。堆栈跟踪是我不介意在我的日志中有很多的东西 :)
  • 您是否检查了surefire-reports 目录(或目标目录下的类似目录)中的测试运行日志?主 Maven 日志中打印的是摘要。我认为详细信息在报告目录中。
  • @user944849 - 我愿意。只是我更喜欢在一个地方(构建日志)查看我的所有内容,而不是查看每个测试用例的不同日志;)
  • @HonzaZidek - 嗨 Honza。磁盘空间很便宜,而且构建日志不会永远保留 - 我们不应该将每个分支的构建日志保存超过几天(我知道这是主观的。)看,首先,这不是我们所期望的每一个测试都会失败,而且,如果我们因为在实例发生时保留堆栈跟踪而导致磁盘空间不足,我认为我们在构建基础设施方面有更深层次的问题需要担心;)

标签: java unit-testing maven junit


【解决方案1】:

尝试将 maven-surefire-plugin 的 useFile 参数设置为 false。根据Surefire plugin docs,这会将测试报告输出到控制台。

另请参阅trimStackTrace 参数。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2010-12-20
  • 2017-08-09
  • 1970-01-01
  • 2014-01-24
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多