使用 quickCheck 测试具有不同值列表的函数
Test a function with different list of value with quickCheck
我需要用 quickCheck
和不同范围的值来测试一个函数。
我的函数是:
prop_test (x,y,z) (i,j,k) ndiv
我想用 :
进行测试
- x,y,z在0到1000[=范围内随机取35=]
- i,j,k在1000到100000[=范围内随机取35=]
- ndiv在固定值列表中随机取[2,5,10,20]
我设法为一个参数设置了一个 属性,但我没有找到如何为函数设置多个(不同的)属性。
这是一个更简单的示例,您应该能够根据自己的风格进行调整。假设你有一个函数
f :: Int -> Int -> Bool
并且您想测试 f x y
对于 x
在 0
到 10
和 y
范围内的计算结果是否为 True
范围 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
要定义一个使用预定义选项列表的生成器,您必须使用 elements
函数。
我需要用 quickCheck
和不同范围的值来测试一个函数。
我的函数是:
prop_test (x,y,z) (i,j,k) ndiv
我想用 :
进行测试- x,y,z在0到1000[=范围内随机取35=]
- i,j,k在1000到100000[=范围内随机取35=]
- ndiv在固定值列表中随机取[2,5,10,20]
我设法为一个参数设置了一个 属性,但我没有找到如何为函数设置多个(不同的)属性。
这是一个更简单的示例,您应该能够根据自己的风格进行调整。假设你有一个函数
f :: Int -> Int -> Bool
并且您想测试 f x y
对于 x
在 0
到 10
和 y
范围内的计算结果是否为 True
范围 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
要定义一个使用预定义选项列表的生成器,您必须使用 elements
函数。