如何使用quickcheck显示测试属性失败的原因?

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)

是否有更好/更好或更快速的方法来做到这一点?

Pau*_*son 9

我假设您的"原因"变量包含某些特定于测试的数据.您可以改为返回"结果",其中包含成功/失败/无效条件以及解释出错的字符串.返回结果的属性由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.P​​roperty中定义的"Result"类型.

Test.QuickCheck.P​​roperty中还定义了一些组合器,它们可以帮助您组合Result而不是直接调用构造函数,例如

prop_three :: Integer -> Property
prop_three n = printTestCase ("always fails: n = " ++ show n) False
Run Code Online (Sandbox Code Playgroud)

我想这将是更好的风格使用它们.