4

我想扩展QuickCheck以在测试失败时给我更好的消息(而不仅仅是种子)。例如,我希望能够按照以下方式创建事物:

eqTest :: Eq a => a -> a -> TestResult
eqTest x y = if x == y
             then HappyResult
             else SadResult $ show x <> " /= " <> show y

或(带有Monoid“停止”SadResult并“继续”在上的实例HappyResult,类似于(&&)运算符 for TestResult

listEqTest :: Eq a => [a] -> [a] -> TestResult
listEqTest [] [] = HappyResult
listEqTest [] ys = SadResult $ "Ran out of xs to compare to " <> show ys
listEqTest xs [] = SadResult $ "Ran out of ys to compare to " <> show xs
listEqTest (x:xs) (y:ys) = eqTest x y <> listEqTest xs ys

如何扩展 QuickCheck 功能?或者,是否有一个更可扩展的随机测试库?

谢谢!

4

1 回答 1

5

通过阅读 QuickCheck 文档,您正在寻找的类型是Result

data Result
  = MkResult
  { ok          :: Maybe Bool     -- ^ result of the test case; Nothing = discard
  , expect      :: Bool           -- ^ indicates what the expected result of the property is
  , reason      :: String         -- ^ a message indicating what went wrong
  , interrupted :: Bool           -- ^ indicates if the test case was cancelled by pressing ^C
  , abort       :: Bool           -- ^ if True, the test should not be repeated
  , stamp       :: [(String,Int)] -- ^ the collected values for this test case
  , callbacks   :: [Callback]     -- ^ the callbacks for this test case
  }

并且感谢instance Testable Result您可以将其用作 QuickCheck 测试的返回类型:

Prelude Test.QuickCheck Test.QuickCheck.Property> let test xs = if 13 `elem` xs then MkResult (Just False) True "Input contained bad number" False False [] [] else succeeded
Prelude Test.QuickCheck Test.QuickCheck.Property> quickCheck test
*** Failed! Input contained bad number (after 17 tests and 3 shrinks):    
[13]
于 2013-06-30T21:11:22.970 回答