ScalaCheck,调用Test.check或Test.checkProperties时的不同行为

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

我有下面的代码,它使用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)
}
我的问题是为什么TEST1给出的结果与TEST3不同

如果我删除
这样的
过滤器,并在
sizeHead
方法中保留
for
语句,如下所示:

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

这是错误还是正确的行为?请记住ScalaTest
Checkers.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.