如何在 ScalaTest 中使测试失败并打印堆栈跟踪?

How to fail a Test in ScalaTest and print stacktrace?

在 ScalaTest 中,我未能通过以下测试:

fail("message")

它只打印红色突出显示的消息,但不打印堆栈跟踪。

我不得不采取一种非常尴尬的方式,例如:

try { throw new Exception } catch { case e => 
  e.printStackTrace()
  fail("message")
}

获取堆栈跟踪。

我试过 fail("message", new Exception) 但它也不打印。有没有更好的方法来做到这一点?

您可以通过以下方式进行:

fail(new Exception().getStackTrace.foldLeft("")(_ + " " + " " + _))

它将打印出与空格连接的 stackTrace(或您想要连接的任何方式)

fail(new Exception().getCause)

或者这样得到异常的原因

两种方式都可以,就看你想要什么了。

记者可能 configured 通过配置参数显示简短或完整的堆栈跟踪

S - show short stack traces
F - show full stack traces

例如,在 build.sbt 中的标准输出上配置短堆栈跟踪,就像这样

testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-oS")

然后进行下面的测试

import org.scalatest._

class HelloSpec extends FlatSpec with Matchers {
  "The Hello object" should "say hello" in {
    fail("boom!")
  }
}

输出类似于

[info] HelloSpec:
[info] The Hello object
[info] - should say hello *** FAILED ***
[info]   boom! (HelloSpec.scala:7)
[info]   org.scalatest.exceptions.TestFailedException:
[info]   ...
[info]   at example.HelloSpec.$anonfun$new(HelloSpec.scala:7)
[info]   at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)