5

単純なプロパティ チェックを実装しようとしていますが、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
4

1 に答える 1

5

メソッドに渡される Shrink インスタンスは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

Shrink 値を視覚化する 1 つの方法は、次の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 が使用されたことがわかります。

于 2012-05-31T12:24:22.290 に答える