【问题标题】:Test a function with different list of value with quickCheck使用 quickCheck 测试具有不同值列表的函数
【发布时间】:2015-03-19 03:26:24
【问题描述】:

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

我的功能是:

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

我想用 :

进行测试
  • x,y,z01000 范围内随机取
  • i,j,k1000100000 范围内随机取
  • ndiv 随机取入固定值列表[2,5,10,20]

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

【问题讨论】:

  • 你能给我们你试过的代码吗?以这种方式为您指出正确的方法会更容易。除此之外,您还可以获取 7 个随机(非负?)整数并使用位整数/模运算将它们带入您想要的范围;)(QuickCheck 中也有函数可以将生成器按摩到其中)
  • 例如,要在域 [0..1000] 上测试函数 f,您可以执行类似 prop_f = forAll (choose (0, 1000)) f 的操作。您可以为需要生成的每个值链接forAlls。

标签: haskell quickcheck


【解决方案1】:

这是一个更简单的示例,您应该能够适应自己的风格。假设你有一个函数

f :: Int -> Int -> Bool

并且您想测试f x yx010 范围内和y1020 范围内的计算结果是否为True,您可以这样做通过说

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 函数。

【讨论】:

  • 我在 hackage 中搜索了 &lt;$&gt; 函数,但没有找到。哪个模块导入了这个函数?
  • @JeanJouX 使用 Hoogle 搜索函数:haskell.org/hoogle/?hoogle=%3C%24%3E 运算符 &lt;$&gt; 只是 fmap 的另一个名称。它在Data.Functor 中定义,并从Control.Applicative(也定义&lt;*&gt;)重新导出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多