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

Test a function with different list of value with quickCheck

我需要用 quickCheck 和不同范围的值来测试一个函数。

我的函数是:

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

我想用 :

进行测试

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

这是一个更简单的示例,您应该能够根据自己的风格进行调整。假设你有一个函数

f :: Int -> Int -> Bool

并且您想测试 f x y 对于 x010y 范围内的计算结果是否为 True范围 1020,你可以说

prop_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

要定义一个使用预定义选项列表的生成器,您必须使用 elements 函数。