使ScalaCheck测试确定性

Rob*_*een 16 scala scalacheck specs2

我想暂时在我的specs2测试套件中进行ScalaCheck属性测试,以便于调试.现在,每次重新运行测试套件时都会生成不同的值,这会使调试变得令人沮丧,因为您不知道观察到的行为的变化是由代码更改引起的,还是仅仅是由生成的不同数据引起的.

我怎样才能做到这一点?是否有正式的方法来设置ScalaCheck使用的随机种子?

我正在使用sbt运行测试套件.

奖金的问题:是否有一个正式的方式打印出由ScalaCheck使用的随机种子,这样就可以重现即使是非确定性的试运行?

Eri*_*ric 11

如果您使用的是纯ScalaCheck属性,那么您应该能够使用Test.Params该类来更改所使用的java.util.Random实例并提供您自己的 实例,它始终返回相同的值集:

def check(params: Test.Parameters, p: Prop): Test.Result

[更新]

我刚刚发布了一个新的specs2-1.12.2-SNAPSHOT,您可以使用以下语法指定随机生成器:

case class MyRandomGenerator() extends java.util.Random {
  // implement a deterministic generator 
}

"this is a specific property" ! prop { (a: Int, b: Int) =>
  (a + b) must_== (b + a)
}.set(MyRandomGenerator(), minTestsOk -> 200, workers -> 3)
Run Code Online (Sandbox Code Playgroud)