gpt4 book ai didi

haskell - 在 QuickCheck 属性中生成新的测试数据

转载 作者:行者123 更新时间:2023-12-01 09:26:46 25 4
gpt4 key购买 nike

我在这里遇到了编程问题。一半的麻烦是问题本身很难思考,另一半是我不记得如何找到解决 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% 的时间占用一个分支或类似的 absurd 。

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

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

最佳答案

A property may take the form

classify <condition> <string>$ <property>

For example,

prop_Insert x xs =
ordered xs ==>
classify (ordered (x:xs)) "at-head" $
classify (ordered (xs ++ [x])) "at-tail" $
ordered (insert x xs)
where types = x :: Int

Test cases satisfying the condition are assigned the classification given, and the distribution of classifications is reported after testing. In this case the result is

Main> quickCheck prop_Insert
OK, passed 100 tests. 58% at-head,
at-tail. 22% at-tail. 4% at-head.

Note that a test case may fall into more than one classification.

(来自 QuickCheck manual)

对输入数据的特定属性要求,可以加somePredicate data ==>在测试主体之前,如上面的代码片段所示。另一个例子:

prop_max xs = (not . null xs) ==> head (sort xs) == maximum xs

你说得对,这个组合器会丢弃不恰当的情况。如果不希望这样做,您可以创建 newtype包装输入类型并重新定义 Arbitrary它的实例(参见 PositiveNonEmptyhere 的示例)

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com