quickcheck测试失败

时间:2014-01-06 02:05:37

标签: haskell quickcheck

我有一个简单的反向函数功能集(简单的移位代码):

  encode, decode :: Int -> String -> String

他们通过一些简单的手动测试进行测试,但是quickCheck测试报告失败:

*** Failed! Falsifiable (after 8 tests and 4 shrinks):
"\254"
0

但手动运行同样的测试效果很好:

   *Main> decode 0 ( encode 0 "\254")
   "c"

我不是在问为什么它会失败(这是我要追逐的东西),但为什么当手表(看似)同样的测试有效时,quickCheck会失败?

我怀疑它与字符编码有关,一个解码它,另一个将它视为字符串,但我不确定原因。


这个问题是关于测试如何工作,而不是(还是!)函数或失败的原因,但这里是代码:

import Data.Char
let2int c =  ord c - ord 'a'

int2let n =  chr (ord 'a' + n)

shift :: Int -> Char -> Char
shift n c | isLower c   =  int2let ((let2int c + n) `mod` 26)
          | otherwise   =  c

encode, decode :: Int -> String -> String
encode n xs  = [shift n x | x <- xs]
decode n     = encode (-n)

参考:Hutton,2007

quickCheck $ (\s n-> (decode n $ encode n s) == s)

1 个答案:

答案 0 :(得分:1)

您提供的信息不足 - 下次请提供完整的测试和完整的代码。当应用于quickCheck的输出时,除了失败的结果之外,还没有任何神奇的因素可用于测试中的表达式。

从您的代码中我发现您的测试是decode 0 . encode 0 ~ id。这不是真的,只要看看ghci的输出:

*Main Test.QuickCheck> quickCheck (\x -> x == decode 0 (encode 0 x))
*** Failed! Falsifiable (after 13 tests and 4 shrinks):    
"\244"
*Main Test.QuickCheck> decode 0 (encode 0 "\244")
"r"
*Main Test.QuickCheck> "\244" == "r"
False