如何使用ScalaCheck在ScalaTest中收集和分类?

时间:2016-09-06 19:58:17

标签: scala scalatest scalacheck

即使测试成功运行,Prop.collect((a, b))的以下使用也不会按预期打印统计信息。

import org.scalacheck.Prop
import org.scalatest.{GivenWhenThen, PropSpec}
import org.scalatest.prop.{Checkers, GeneratorDrivenPropertyChecks}

import org.scalacheck.Prop.AnyOperators

class AccountSpecWithMarkup extends PropSpec with Checkers with GeneratorDrivenPropertyChecks {

  property("max") {
    check({
      (a:Int, b:Int) => {

        Prop.collect((a, b)) {

          a != b || a == b
        }
      }
    })
  }
}

1 个答案:

答案 0 :(得分:1)

一个古老的问题,可能很久以来就已经回答或解决了,但是由于我是一个试图弄清楚问题的scalacheck新手,所以我会自愿做出回应。

不知道为什么您的示例无法按预期运行,但是这个更简单的测试可以解决问题(在Scalacheck 1.14中):

import org.scalacheck.Properties
import org.scalacheck.Prop.{forAll,collect}

object AccountSpecWithMarkup extends Properties("AccountSpecWithMarkup") {

  property("max") = forAll { (a: Int, b: Int) =>
    collect((a, b)) {
      a != b || a == b
    }
  }
}

请注意,测试现在是扩展object的{​​{1}}。 Properties val类型为Properties.property,它封装了可变状态(PropertySpecifier的集合),并具有Props方法。这行

update

是...的语法糖

property("max") = forAll { ... }

其中property.update("max", forAll{ ... }) 生成类型为forAll的值。累积此Prop值,以供以后使用隐式Prop生成器生成Arbitrary[Int]a的测试值,这些测试值由b收集以在报告中报告。测试结果。

这是成功进行测试的前几行

collect