1

我正在运行一个 specs2 测试套件sbt,使用该test命令。当 ScalaCheck 属性失败时,我只会在我的代码中看到 specs2 匹配失败的文件名和行号——当它碰巧是一种实用方法时,它不是很有用,它执行我经常做的一种常见类型的检查. 堆栈跟踪会更好。

我已经last在 sbt 中尝试过该命令,但这并没有显示我正在寻找的堆栈跟踪。唯一的堆栈跟踪last显示是这个通用的:

java.lang.RuntimeException: Tests unsuccessful
        at scala.sys.package$.error(package.scala:27)
        at scala.Predef$.error(Predef.scala:66)
        at sbt.Tests$.showResults(Tests.scala:168)
        at sbt.Defaults$$anonfun$testTasks$5.apply(Defaults.scala:279)
        at sbt.Defaults$$anonfun$testTasks$5.apply(Defaults.scala:279)
        at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:473)
        at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:473)
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:41)
        at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$11.apply(Structure.scala:295)
        at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$11.apply(Structure.scala:295)
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
        at sbt.std.Transform$$anon$5.work(System.scala:67)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:221)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:221)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
        at sbt.Execute.work(Execute.scala:227)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:221)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:221)
        at sbt.CompletionService$$anon$1$$anon$2.call(CompletionService.scala:26)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

我还在 java.util.logging 属性文件中启用了 FINEST 日志记录级别。

现在,我正在使用 Eclipse 调试器解决这个问题,但在某些情况下,它是不必要的重量级。

4

2 回答 2

1

failtrace您可以通过在命令行上传递参数来显示堆栈跟踪失败。这记录在用户指南的参数部分。

此外,您必须知道此堆栈跟踪已被过滤以避免显示 specs2 自己的堆栈,因此如果您想查看需要添加的所有内容,fullstacktrace这是一个不过滤任何内容的快捷方式。TraceFilter

于 2012-10-09T02:32:37.620 回答
0

我决定采用不同的方法来识别失败的匹配 - 使用aka,如下所示:

def occurExactlyOnceInBody = be_===(1) ^^ { (s: String) => body.tails.count(_.startsWith(s)) aka "No. of occurences of " + s + " in body" }

缺点是这确实需要手动应用,但优点是更容易理解故障。

于 2012-10-09T16:53:27.250 回答