Scalacheck忽略了提供的生成器

ton*_*ian 5 scala sbt scalacheck

我正在尝试实现一个简单的属性检查,但Scalacheck忽略了我的生成器.我在这里做错了什么?

object AlgorithmTest extends Properties("Algorithm") {
  property("Test") = forAll (Gen.choose(0,10)) (n => n>=0 & n<10)
}
Run Code Online (Sandbox Code Playgroud)

这是SBT的结果

[info] ! Algorithm.Test: Falsified after 12 passed tests. [info] >
ARG_0: -1 [error] Failed: : Total 1, Failed 1, Errors 0, Passed 0,
Skipped 0
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 5

forAll搜索较小的反例时,传递给该方法的Shrink实例似乎未使用生成器。如果您将财产更改为:

property("Test") = Prop.forAllNoShrink(Gen.choose(1, 10)) (n => n >= 0 && n < 10)
Run Code Online (Sandbox Code Playgroud)

然后它应该正确地失败,并带有:

[info] ! Algorithm.Test: Falsified after 7 passed tests.
[info] > ARG_0: 10
[error] Failed: : Total 1, Failed 1, Errors 0, Passed 0, Skipped 0
Run Code Online (Sandbox Code Playgroud)

可视化收缩值的Prop.collect一种方法是使用方法:

property("Test") = Prop.forAll(Gen.choose(1, 10)) { n =>
  Prop.collect(n) { n >= 0 && n < 10 }
}
Run Code Online (Sandbox Code Playgroud)

然后收集的值如下所示:

[info] ! Algorithm.Test: Falsified after 40 passed tests.
[info] > ARG_0: -1
[info] > Collected test data: 
[info] 17% 3
[info] 17% 1
[info] 15% 6
[info] 12% 9
[info] 10% 2
[info] 10% 5
[info] 7% 4
[info] 7% 8
[info] 2% -1
[info] 2% 7
Run Code Online (Sandbox Code Playgroud)

可以看到在缩小过程中使用了-1。

  • 但这不是记录的行为。如果我使用1到10之间的生成器,则所有值都必须在[1,10 [。永远不要出现-1 (2认同)
  • @ancechu测试失败后,“-1”出现在_after_之后,因为ScalaCheck试图找到失败的简单输入,即“缩小”。该阶段不尊重生成过程-我不知道是错误还是固有限制。 (2认同)