2012-05-31 42 views
5

我试图实现一个简单的属性检查,但Scalacheck忽略了我的生成器。我在这里做错了什么?Scalacheck忽略了提供的发生器

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

,这是导致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 
+0

现在通过使用'suchThat'后置条件修复了问题(对于内置生成器) - 请参阅https://github.com/rickynils/scalacheck/issues/8 – DNA

回答

4

它看起来像被传递到forAll方法不使用较小的反例搜索时产生的收缩情况。如果你改变你的属性:

property("Test") = Prop.forAllNoShrink(Gen.choose(1, 10)) (n => n >= 0 && n < 10) 

那么就应该正确地与失败:

[info] ! Algorithm.Test: Falsified after 7 passed tests. 
[info] > ARG_0: 10 
[error] Failed: : Total 1, Failed 1, Errors 0, Passed 0, Skipped 0 

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

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

然后收集的值如下所示:

[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 

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

+1

但这不是记录的行为。如果我使用1到10之间的发生器,所有值必须在[1,10 [。]范围内。不应该出现-1 – tonicebrian

+2

@ancechu在测试失败后出现'-1',因为ScalaCheck试图找到测试失败的简单输入 - 这就是“缩小”。这个阶段不尊重生成过程 - 不管这是一个错误还是一个内在的限制,我不知道。 –

+0

我应该昨天搜索,但这个问题实际上是讨论[这里](https://github.com/rickynils/scalacheck/issues/18) – Eric