Haskell 快速检查测试失败
我有一组简单的逆函数(简单的移位码): 通过一些简单的手动测试,它们可以很好地进行测试,但快速检查测试会报告失败:Haskell 快速检查测试失败,haskell,quickcheck,Haskell,Quickcheck,我有一组简单的逆函数(简单的移位码): 通过一些简单的手动测试,它们可以很好地进行测试,但快速检查测试会报告失败: *** Failed! Falsifiable (after 8 tests and 4 shrinks): "\254" 0 但手动运行同样的测试效果很好: *Main> decode 0 ( encode 0 "\254") "c" 我不是问为什么它会失败(这是我要追问的),而是为什么当(看起来)同样的手工测试有效时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)
您提供的信息不足-下次请给出完整的测试和完整的代码。当将测试中的表达式应用于
quickCheck
的输出时,除了给出失败的结果之外,没有什么神奇的地方,也没有什么好的理由
根据你的代码,我认为你的测试是解码0。编码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
实际测试是什么?查看
encode
和decode
的定义可能也很有用。您需要在问题中包含失败测试的定义。您是否测试encode n
和decode n
是否相互相反?它们不是。谢谢,我被“\254”符号以及它是如何生成的弄糊涂了。我需要为快速检查创建一个经过消毒的可打印字符串生成器。您不需要新的生成器,只需从当前任意
实例中筛选输入:(\x->let y=filter isAscii x in y==decode 0(encode 0 y))
。是的,但我发现我得到的筛选块太多,速度非常慢,然后可能由于太多被丢弃的测试值而失败。(我使用了(\c->(isAlpha c)==>…)的过滤器。从中我认为我需要一个safeChar生成器,它工作得很好。谢谢。
quickCheck $ (\s n-> (decode n $ encode n s) == s)
*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