我在这里遇到了编程问题。一半的麻烦是问题本身很难思考,另一半是我不记得如何找到 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
实例(请参阅 Positive
、 NonEmpty
等示例 here )
关于haskell - 在 QuickCheck 属性中生成新的测试数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22014754/