ScalaCheck,调用Test.check或Test.checkProperties时的不同行为
我有下面的代码,它使用ScalaCheck属性来测试一些类ScalaCheck,调用Test.check或Test.checkProperties时的不同行为,scala,scalatest,scalacheck,Scala,Scalatest,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
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)
}
我的问题是为什么TEST1给出的结果与TEST3不同
如果我删除这样的过滤器,并在sizeHead
方法中保留for
语句,如下所示:
for
(
i <- arbitrary[Int]
s <- choose(0, size);
h <- sizedHeap(s)
)
yield
Heap.insert(i, h)
这是错误还是正确的行为?请记住ScalaTestCheckers.check
使用Test.check
你会得到不同的结果,因为你在做不同的事情。前两个测试分别检查所有属性,而第三个测试测试所有属性,就好像它们是单个属性一样
查看Test.check
和Test.checkProperties
的签名:前者使用单个Prop
,后者使用Properties
容器
在scalacheck 1.12中,属性继承自属性;如果将Properties
作为Prop
传递,则会得到一个新的属性。其结果是,您使用单个检查配置(即生成器、迭代限制等)测试所有TestCheck
属性,并且检查配置自然会在某个点耗尽
所以是的,这是预期的行为。当然,这绝对令人困惑,因此scalacheck 1.13删除了此功能:Properties
不再从Prop
继承;您的示例将不再在scalacheck 1.13上编译。感谢您的回复。是的,我注意到我在做不同的事情,我不明白的是为什么我在两个检查中得到不同的结果,这两个检查应该做相同的事情,即检查所有属性。关于打字错误,你是对的,当重新格式化我在发布前测试的代码时,我错误地删除了一个右括号,这产生了语法错误。请原谅。但不幸的是,如果我不能复制和粘贴代码而不修改其格式,我很确定这种情况会再次发生。顺便说一句,我编辑了问题以更正错误。是的,再次感谢,现在事情的黑暗面又有点清楚了。ScalaTest最新版本似乎不支持ScalaCheck 1.13。这个Scala的世界看起来很外行!是的,我知道,但是你需要更新scalacheck吗?scalatest与1.12配合得很好,我们每天都在使用它,1.13中的更改不太可能对您有多大影响。如果您使用的是scalatest的属性检查支持,那么您不会受到问题中演示的行为的影响。无论如何,我觉得你的最后一句话非常不公平和无礼。更新在下游缓慢进行并不罕见,scalacheck是一个志愿者项目。我相信scalatest会接受你的请求。
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.