如何让ScalaCheck的Arbitrary始终生成一些特殊的案例值?

mpa*_*tel 9 scala scalacheck

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

我想出了迄今为止最好的是做一个大小发电机,其中最小的ñ大小对应于我ñ特殊情况.这是有问题的,至少因为当最大测试次数配置为低于max size参数时,不测试所有可能的大小.

Dan*_*ral 18

首先,存在已经是在Scalacheck偏置使0,1,-1,Int.MaxValueInt.MinValue很可能除了对方作为选Int值.所以,如果那是您的担心,请不要担心.同样,可能会生成空字符串.

但是,如果您想为其他内容重现此行为,请使用Gen.oneOf或者Gen.frequency,也许与其结合使用Gen.choose.由于oneOffrequency采取Gen的参数,你可以用普通的发电机相结合的特殊情况.

例如:

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

几乎是你所要求的,有50%几率的任意整数(这与我所说的偏见有关),以及-1,0和1各16.6%.