我希望除某些随机值外,始终使用至少一组固定的特殊值来测试我的所有属性。我想在我的生成器规范中定义它,而不是在使用该生成器类型的每个测试中定义它。例如,如果我正在生成Ints,则希望我的生成器始终为每个测试用例至少生成0、1和-1。这可能吗?
到目前为止,我想出的最好的方法是制作一个大小生成器,其中最小的n个大小对应于我的n个特殊情况。这至少是有问题的,因为当最大测试数量配置为小于最大尺寸参数时,不会测试所有可能的尺寸。
最佳答案
首先,Scalacheck中已经存在偏差,因此除了其他Int.MaxValue
值之外,很有可能还会选择0、1,-1,Int.MinValue
和Int
。因此,如果您担心的话,不必担心。同样,很可能会生成空字符串。
但是,如果要重现此行为,则可以将Gen.oneOf
或Gen.frequency
与Gen.choose
结合使用。由于oneOf
和frequency
以Gen
作为参数,因此可以将特殊情况与通用生成器结合使用。
例如:
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/