2016-09-19 3 views
3

を呼び出すときに、私は次のコードを持っているScalaCheck、異なる動作Test.checkまたはTest.checkProperties

package quickcheck.tests 

import org.scalacheck.Arbitrary._ 
import org.scalacheck.Gen._ 
import org.scalacheck.Prop._ 
import org.scalacheck._ 
import org.scalacheck.util.ConsoleReporter 

class Heap 
{ 
} 

object Heap 
{ 
    val empty = new Heap 
    def insert(i: Int, h: Heap) = new Heap 
} 

class TestCheck extends Properties("Heap") 
{ 
    lazy val genHeap: Gen[Heap] = 
    { 
    def sizedHeap(size: Int): Gen[Heap] = 
    { 
     if (size <= 0) 
     Heap.empty 
     else 
     for 
     (
      i <- arbitrary[Int] suchThat(_ > Int.MinValue); 
      s <- choose(0, size); 
      h <- sizedHeap(s) 
     ) 
      yield 
      Heap.insert(i, h) 
    } 

    Gen.sized[Heap](sizedHeap) 
    } 

    implicit lazy val arbHeap: Arbitrary[Heap] = Arbitrary(genHeap) 

    property("test1") = forAll 
    { 
    (h: Heap) => true 
    } 

    property("test2") = forAll 
    { 
    (h1: Heap, h2: Heap, n: Int) => true 
    } 
} 

object MyTest extends App 
{ 
    println("*** TEST 1") 
    val checkHeap = new TestCheck 
    Test.checkProperties(Test.Parameters.default.withTestCallback(ConsoleReporter(1)), 
    checkHeap) 

    println("*** TEST 2") 
    val checkHeap2 = new TestCheck 
    checkHeap2.check 

    println("*** TEST 3") 
    val checkHeap3 = new TestCheck 
    Test.check(Test.Parameters.default.withTestCallback(ConsoleReporter(1)),  checkHeap) 
} 

私はScalaCheck Testクラスを通してそれを実行した場合、私は異なる結果が出た場合私は方法Test.checkPropertiesまたは方法Test.checkを使用します。

これは、私が手に出力されます:TEST1がTEST3とは異なる結果を与える理由

*** TEST 1 
+ Heap.test1: OK, passed 100 tests. 
+ Heap.test2: OK, passed 100 tests. 
*** TEST 2 
+ Heap.test1: OK, passed 100 tests. 
+ Heap.test2: OK, passed 100 tests. 
*** TEST 3 
! Gave up after only 40 passed tests. 202 tests were discarded. 

私の質問です。

私はsuchThatフィルタを削除し、このようsizeHead方法でfor声明を残す場合:

for 
(
    i <- arbitrary[Int] 
    s <- choose(0, size); 
    h <- sizedHeap(s) 
) 
    yield 
    Heap.insert(i, h) 

私は次のような結果を得る:

*** TEST 1 
+ Heap.test1: OK, passed 100 tests. 
+ Heap.test2: OK, passed 100 tests. 
*** TEST 2 
+ Heap.test1: OK, passed 100 tests. 
+ Heap.test2: OK, passed 100 tests. 
*** TEST 3 
+ OK, passed 100 tests. 

はこのバグですか、それはあります正しい行動ですか? ScalaTest Checkers.checkTest.checkを使用しています。

答えて

1

あなたは違うことをしているので、結果が違ってきます。最初の2つのテスト(effectively the same)はすべてのプロパティを個別にチェックし、3番目のテストではすべてのプロパティをテストします。は、単一のプロパティと同じです。

Test.checkTest.checkPropertiesのシグネチャを見てください。前者はPropの1つで、後者はPropertiesのコンテナです。

scalacheckで1.12 PropertiesPropから継承します。 PropertiesPropとすれば、という新しいプロパティtests whether all contained properties holdとなります。その結果、すべてのプロパティを単一のチェック設定(つまり、ジェネレータ、反復制限など)でテストし、そのチェック設定がある時点で使い果たされることがあります。

はい、これは予想される動作です。もちろん、それは絶対に紛らわしいので、scalacheck 1.13はこの機能を削除しました:PropertiesPropから継承しません。あなたの例はもうscalacheck 1.13でコンパイルされません。

+0

私の回答が物事をクリアするのに役立つことを願っていますか? – lunaryorn

+0

ありがとうございます。はい、私は私が違うことをしていることに気付きました。私が理解していないのは、すべてのプロパティをチェックするのと同じことをする2つのチェックに対して異なる結果を得ている理由です。 正解ですが、コードを再フォーマットするときに、私が投稿する前にテストしたところで、エラーで右括弧が削除されました。これは構文エラーです。私はあなたの許しを請います。しかし残念なことに、再フォーマットを行わずにコードをコピー&ペーストできなければ、これが再び起こることは間違いありません。 –

+0

ところで、私はタイプミスを修正するために質問を編集しました。 –

関連する問題