使用quickCheck测试具有不同值列表的函数

时间:2015-03-18 16:25:08

标签: haskell quickcheck

我需要使用quickCheck测试具有不同值范围的函数。

我的职责是:

prop_test (x,y,z) (i,j,k) ndiv

我想用以下方式进行测试:

  • x,y,z 0 范围内随机拍摄 1000
  • i,j,k 1000 范围内随机拍摄 100000
  • ndiv 随机选取固定值列表 [2,5,10,20]

我设法为一个参数设置了一个属性,但是我没有找到如何为该函数设置多个(不同的)属性。

1 个答案:

答案 0 :(得分:1)

这是一个更简单的例子,你应该能够适应你的风格。假设你有一个功能

f :: Int -> Int -> Bool

并且您想测试f x y评估True范围内x010范围内y的{​​{1}}是否为10 20prop_f :: Property prop_f = forAll (choose ( 0, 10)) $ \ x -> forAll (choose (10, 20)) $ \ y -> f x y ,你可以通过说

来做到这一点
forAll

另一种选择是通过动态构建新的生成器,将多个值的生成组合成一个prop_f :: Property prop_f = forAll ((,) <$> r1 <*> r2) $ \ (x, y) -> f x y where r1 = choose ( 0, 10) r2 = choose (10, 20) 调用:

newtype R1 = R1 Int
newtype R2 = R2 Int

instance Arbitrary R1 where arbitrary = R1 <$> choose ( 0, 10)
instance Arbitrary R2 where arbitrary = R2 <$> choose (10, 20)

prop_f :: R1 -> R2 -> Bool
prop_f (R1 x) (R2 y) = f x y

另一个选择是定义自己的newtype包装器:

elements

要定义使用预定义选项列表的生成器,您必须使用{{1}}函数。