2012-05-31 43 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