【发布时间】:2012-11-22 13:41:00
【问题描述】:
我有一个 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”的属性
至于前面的例子?我想,对此可以使用whenFail 或whenFail',但我还不了解QuickCheck 的内部结构。
【问题讨论】:
-
是否有理由不为元素类型定义属性,而让 QuickCheck 一次测试一个元素?然后 QuickCheck 会告诉您失败的值。
-
是的,我忘了提。在我的真实代码中,我通过在所有估值的详尽列表上进行比较来测试布尔公式的等价性。输出应该给我第一个估值,这些公式有偏差。
-
我改变了问题,给出了一个更接近我真实代码的例子。
标签: haskell quickcheck