scala - 如何使ScalaCheck的任意值始终生成一些特殊情况值?

标签 scala scalacheck

我希望除某些随机值外,始终使用至少一组固定的特殊值来测试我的所有属性。我想在我的生成器规范中定义它,而不是在使用该生成器类型的每个测试中定义它。例如,如果我正在生成Ints,则希望我的生成器始终为每个测试用例至少生成0、1和-1。这可能吗?

到目前为止,我想出的最好的方法是制作一个大小生成器,其中最小的n个大小对应于我的n个特殊情况。这至少是有问题的,因为当最大测试数量配置为小于最大尺寸参数时,不会测试所有可能的尺寸。

最佳答案

首先,Scalacheck中已经存在偏差,因此除了其他Int.MaxValue值之外,很有可能还会选择0、1,-1,Int.MinValueInt。因此,如果您担心的话,不必担心。同样,很可能会生成空字符串。

但是,如果要重现此行为,则可以将Gen.oneOfGen.frequencyGen.choose结合使用。由于oneOffrequencyGen作为参数,因此可以将特殊情况与通用生成器结合使用。

例如:

val myArb: Arbitrary[Int] = Arbitrary(Gen.frequency(
    1 -> -1, 
    1 ->  0, 
    1 -> 1, 
    3 -> Arbitrary.arbInt.arbitrary
))

几乎满足您的要求,拥有50%的任意整数机会(这将与我所说的偏差有关),对于-1、0和1分别具有16.6%的机会。

关于scala - 如何使ScalaCheck的任意值始终生成一些特殊情况值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7569468/

相关文章:

scala - Intellij 中的自动完成 Scala 匹配案例

ScalaCheck 生成 StackOverflowError

json - Akka-http-json "Unsupported Content-Type, supported: application/json"

java - Scala 如何在方法定义中接收多个参数?

scala - 如何使用 Scala 将数据作为元组传递到 Spark 中的 rdd

string - 使用scala在spark中分割由逗号和空格分隔的字符串

scala - 为什么我使用自定义生成器进行的 Scalacheck 测试在丢弃许多案例后失败了,如何解决这个问题?

ScalaCheck:选择一个具有自定义概率分布的整数

scala - 测试递归数据结构

functional-programming - 基于属性的测试的不确定性是否会损害构建的可重复性?