我有一個使用ScalaCheck性能,如果測試一些類ScalaCheck,不同的行爲
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
。
這是輸出我得到:
*** 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.
我的問題是,爲什麼TEST1給出不同的結果,TEST3。
如果我刪除suchThat
濾波器和離開for
聲明中sizeHead
方法是:
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.check
使用Test.check
。
我希望我的回答有助於澄清事情嗎? – lunaryorn
感謝您的回覆。是的,我注意到我做了不同的事情,我不明白的是爲什麼我得到不同的結果,兩個檢查應該做同樣的事情,檢查所有的屬性。 關於錯字,你是正確的,當重新格式化代碼,我發佈之前測試過,我錯誤地刪除了一個右括號,這產生了語法錯誤。我請求你原諒。但不幸的是我很確定,如果我不能複製和粘貼代碼而不修改它來重新格式化,這將再次發生。 –
順便說一句,我編輯的問題,以糾正錯字。 –