max*_*zig 10 haskell quickcheck
在通过QuickCheck进行测试时,显示失败属性测试的原因的最佳做法是什么?
考虑例如:
prop a b = res /= []
where
(res, reason) = checkCode a b
Run Code Online (Sandbox Code Playgroud)
然后一个会话可能看起来像:
> quickCheck prop
Falsifiable, after 48 tests:
42
23
Run Code Online (Sandbox Code Playgroud)
但是对于调试来说,作为quickCheck可伪造报告的一部分,显示失败的原因将非常方便.
我这样砍了它:
prop a b = if res /= [] then traceShow reason False else True
where
(res, reason) = checkCode a b
Run Code Online (Sandbox Code Playgroud)
是否有更好/更好或更快速的方法来做到这一点?
我假设您的"原因"变量包含某些特定于测试的数据.您可以改为返回"结果",其中包含成功/失败/无效条件以及解释出错的字符串.返回结果的属性由QuickCheck以与返回Bool的属性完全相同的方式处理.
(编辑)像这样:
module QtTest where
import Test.QuickCheck
import Test.QuickCheck.Property as P
-- Always return success
prop_one :: Integer -> P.Result
prop_one _ = MkResult (Just True) True "always succeeds" False [] []
-- Always return failure
prop_two :: Integer -> P.Result
prop_two n = MkResult (Just False) True ("always fails: n = " ++ show n) False [] []
Run Code Online (Sandbox Code Playgroud)
请注意,它是您想要的Test.QuickCheck.Property中定义的"Result"类型.
Test.QuickCheck.Property中还定义了一些组合器,它们可以帮助您组合Result而不是直接调用构造函数,例如
prop_three :: Integer -> Property
prop_three n = printTestCase ("always fails: n = " ++ show n) False
Run Code Online (Sandbox Code Playgroud)
我想这将是更好的风格使用它们.