gpt4 book ai didi

haskell - 显示 QuickCheck 属性失败的原因并处理测试函数中的异常

转载 作者:行者123 更新时间:2023-12-03 22:16:01 24 4
gpt4 key购买 nike

我有一个 QuickCheck 属性测试函数 f。该属性将函数 f 映射到某个列表 xs 上,并检查结果的某些元素属性。在失败的情况下,我想显示与此失败相关的 xs 元素。考虑以下属性:

prop x =
printTestCase ("Failed for value " ++ show failure) $ isNothing failure
where
failure = fmap fst $ find (not . snd) $ map (\n -> (n, f x n == n)) [10..20]

这对于实现来说效果很好

f = (+)

quickcheck prop输出

*** Failed! Falsifiable (after 2 tests):                  
1
Failed for value Just 10

但是,如果f抛出异常,即

f = undefined

然后 quickcheck prop 输出

*** Failed! Exception: 'Prelude.undefined' (after 1 test): 
()
Failed for value Exception thrown by generator: 'Prelude.undefined'

我如何编写一个属性来捕获第二个异常并返回“Just 0”至于前面的例子?我想,可以为此使用 whenFailwhenFail',但我还不了解 QuickCheck 的内部结构。

最佳答案

感谢#haskell channel 上的 aavogt,我找到了模块 Control.Spoon,它提供了函数 spoon 和 teaspoon 可以用来解决这个问题。但是,我不知道使用这个包(它在内部使用 unsafePerformIO)有多安全。

无论如何,使用Control.Spoonprop可以重写如下:

prop x =
printTestCase ("Failed for value " ++ show pureFailure) $ isNothing excFailure
where
pureFailure = failure (fromMaybe True . teaspoon)
excFailure = failure id
failure g = fmap fst $ find (g . not . snd) $ map (\n -> (n, f x n == n)) [10..20]

fromMaybe True 包装查找谓词。 teaspoon 具有find返回的效果满足谓词或抛出异常的第一个元素。

因为teaspoon只能用来查看异常发生,而不能查看异常,我用excFailure 以便 QuickCheck 仍然可以看到异常。缺点是发现需要评估两次。 teaspoon 仅评估为 WHNF,如果您需要深入评估以触发异常,请改用 spoon

teaspoon 只捕获少数几个选定的异常,这对我来说很好,因为我只真正关心未定义和穷尽的模式匹配。

关于haskell - 显示 QuickCheck 属性失败的原因并处理测试函数中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711226/

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