我需要使用quickCheck
测试具有不同值范围的函数。
我的职责是:
prop_test (x,y,z) (i,j,k) ndiv
我想用以下方式进行测试:
我设法为一个参数设置了一个属性,但是我没有找到如何为该函数设置多个(不同的)属性。
答案 0 :(得分:1)
这是一个更简单的例子,你应该能够适应你的风格。假设你有一个功能
f :: Int -> Int -> Bool
并且您想测试f x y
评估True
范围内x
到0
和10
范围内y
的{{1}}是否为10
20
到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
另一个选择是定义自己的newtype包装器:
elements
要定义使用预定义选项列表的生成器,您必须使用{{1}}函数。