我在这里遇到了编程问题。一半的麻烦是问题本身很难思考,另一半是我不记得如何找到 QuickCheck 的方法。

我知道,如果您编写一个函数,该函数接受多个具有 Arbitrary 实例的参数,QuickCheck 会让您使用该方法作为测试。我无法弄清楚如何在该方法中生成新的测试参数。我想写一些类似的东西

prop13 :: Foo -> Bar -> Bool
prop13 foo bar =
  if foobar foo bar
    then fn1 foo
    else newInput $ \ baz -> fn2 foo bar baz

但我不知道该怎么做。

其实不,我真正想写的是
prop13 :: Foo -> Bar -> Property
prop13 foo bar =
  if foobar foo bar
    then label "foobar=YES" $ fn1 foo
    else label "foobar=NO"  $ newInput $ \ baz -> fn2 foo bar baz

只是为了让我可以检查它是否 100% 的时间都没有占用一个分支或类似的荒谬的东西。

实际上,如果我可以要求 baz 具有某些特定属性,那就太好了。我依稀记得 QuickCheck 在某处有一个函数可以丢弃不满足给定条件的输入。 (唯一的问题是它可能需要不合理的次数来满足条件......)

有没有办法做到这一点?我盯着黑线鳕页面,但我不知道如何获得我想要的东西......

最佳答案



(来自 QuickCheck manual )

为了要求输入数据的特定属性,您可以在测试主体之前添加 somePredicate data ==>,如上面的代码片段所示。另一个例子:
prop_max xs = (not . null xs) ==> head (sort xs) == maximum xs
你是对的,这个组合器会丢弃不合适的情况。如果这是不希望的,您可以在输入类型上制作 newtype 包装器并为其重新定义 Arbitrary 实例(请参阅 PositiveNonEmpty 等示例 here )

关于haskell - 在 QuickCheck 属性中生成新的测试数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22014754/

10-11 00:33