2012-10-08 37 views
1

我正在运行sbt的specs2测试套件,使用test命令。当ScalaCheck属性失败时,我只能在我的代码中看到specs2匹配失败的文件名和行号 - 当这恰好是一种实用方法时,这种做法并不是非常有用,它常常执行常见的检查类型。堆栈跟踪会更好。从specs2中的失败Scalacheck属性中确定确切的失败匹配

我试过了sbt中的last命令,但是这并不显示我正在寻找的堆栈跟踪。唯一的堆栈跟踪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启用最详细的日志记录级别。

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

回答

1

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

而且你要知道,这个堆栈跟踪进行过滤以避免显示,所以如果你想看到你需要添加fullstacktrace这是一个TraceFilter可以过滤任何一个shortcut一切specs2自己的堆栈。

+0

不幸的是,我添加了这两个,但现在我遇到了一个不同的失败的匹配,并且我看不到匹配失败的位置。我认为堆栈跟踪是在比赛实际失败后生成的。 –

0

,我决定采取不同的方法来识别失败的匹配 - 使用aka,像这样:

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

缺点是这并不需要手动应用,但好处是很容易理解的故障。