我有一个QuickCheck属性,如下所示:
prop42 :: Foo -> Bool
prop42 foo = fn1 foo == fn2 foo
如果此属性失败,它将打印出foo
的内容。但我真的很想知道fn1
和fn2
返回了什么。如果foo
很大,那么手工生成这些信息有点不重要。 (即,坐在那里,手动输入打印到Windows控制台窗口的巨大文本楔形。)
测试框架通常会有一个比较相等的东西,并且如果相等不成立则打印出两个值。但我似乎无法为QuickCheck找到这样的功能...
答案 0 :(得分:10)
看一下来自here的组合子。例如,printTestCase
允许将任意字符串添加到失败案例的输出中。一个简单的例子:
prop x = let f = sin x
in printTestCase ("Should be at least " ++ show f) $ x >= sin x
$> quickCheck prop *** Failed! Falsifiable (after 2 tests and 1 shrink): -1.0 Should be at least -0.8414709848078965
答案 1 :(得分:2)
根据Yuuri的回答,这就是我的用途:
(?==?) :: (Eq x, Show x) => x -> x -> Property
x ?==? y =
printTestCase ("Left: " ++ show x) $
printTestCase ("Right: " ++ show y) $
x == y
现在我可以写一些像
这样的东西prop42 :: Foo -> Prop
prop42 foo = fn1 foo ?==? fn2 foo
答案 2 :(得分:0)
我认为假设fn1
和gn2
返回Bar
,可以执行以下操作:
newtype Bar1 = B1 Bar deriving Show
newtype Bar2 = B2 Bar deriving Show
instance Arbitrary Bar1 where
arbitrary = arbitrary >>= return . B1 . fn1
instance Arbitrary Bar2 where
arbitrary = arbitrary >>= return . B2 . fn2
prop_xx = forAll arbitrary $ \(B1 b1) ->
forAll arbitrary $ \(B2 b2) ->
b1 == b2