当SBT中的ScalaTest测试失败时,我得到堆栈跟踪。我在SBT提示符下尝试set traceLevel in Test := -1
,尝试更改build.sbt
文件中的内容等,但似乎没有任何帮助。
我想摆脱的是:
> test
[info] TestWritingFunctions:
[info] - threeSquares examples *** FAILED ***
[info] scala.NotImplementedError: an implementation is missing
[info] at scala.Predef$.$qmark$qmark$qmark(Predef.scala:252)
[info] at TestWritingFunctions$$anonfun$1.apply$mcV$sp(WritingFunctions.scala:17)
[info] at TestWritingFunctions$$anonfun$1.apply(WritingFunctions.scala:16)
[info] at TestWritingFunctions$$anonfun$1.apply(WritingFunctions.scala:16)
[info] at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
[info] at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)
[info] at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info] at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info] at org.scalatest.Transformer.apply(Transformer.scala:22)
[info] at org.scalatest.Transformer.apply(Transformer.scala:20)
[info] ...
正如您所看到的,测试失败了,因为我使用了新的???
构造作为占位符,但是因为我知道那里有占位符,所以我只想要一条*** FAILED ***
消息而不是全部rigamarole。这可能吗?
答案 0 :(得分:4)
您可以使用“-o ...”而不使用F或S(即“-o”或“-oD”不会给您堆栈跟踪,但不能使用“-oF”,“ - OS”或“ -oDS“会给你一个堆栈跟踪)。这意味着您将抑制所有堆栈跟踪。如果你根本没有指定记者,你会得到一个“-o”,这意味着没有堆栈痕迹。
如果你喜欢一般的短堆栈跟踪,但是当????抛出NotImplementedError时不想看到它们,你可以覆盖withFixture并将NotImplementedError更改为挂起的测试:
import org.scalatest._
trait PendingIfUnimplemented extends SuiteMixin { this: Suite =>
abstract override def withFixture(test: NoArgTest): Outcome = {
super.withFixture(test) match {
case Failed(ex: NotImplementedError) => Pending
case other => other
}
}
}
通过这种方式,无论您选择什么,您仍然可以获得常规故障的短,长或无堆栈跟踪,但是看到(待定)因为???而失败的测试。
答案 1 :(得分:2)
(不具有权威性,但由于没有其他人回答:)
我怀疑traceLevel
没有做任何事情,因为堆栈跟踪来自ScalaTest,而不是来自sbt。
sbt确实有logLevel
设置是相关的。试试这个:
set logLevel in Test := Level.Warn
但请注意,这不仅会抑制堆栈跟踪,还会抑制示例中以[info]
开头的所有行。相反,你只需要在最后获得[error]
内容,这至少会使套件的名称失败。
如果你真的只想在不改变其他任何东西的情况下抑制堆栈跟踪,我认为这可能是不可能的。查看http://www.scalatest.org/user_guide/using_the_runner,我看到了使堆栈跟踪更短(-oS
)或更长(-oF
)的选项,但没有完全省略堆栈跟踪的选项。