通过使用QuickCheck生成输入来测试Parsec解析器

时间:2012-06-12 16:04:24

标签: testing haskell parsec quickcheck

我想为一套Parsec解析器编写测试。这是我想用QuickCheck测试的解析器的一个简单示例:

identifier = do
  c <- letter
  cs <- many (alphaNum <|> oneOf identSymbols)
  skipSpaces
  return $ Ident $ c:cs

因此,理想情况下,我希望QuickCheck生成有效的标识符,并确保我得到正确的结果,并生成无效的标识符并确保它们返回ParseError。是否有任何实用程序可以使这种事情变得更容易?有没有办法可以“反向运行我的解析器”,可以说,生成这样的输入?

一般来说,这个解析器的一套优秀的QuickCheck测试是什么样的?在某种程度上,似乎我基本上必须在QuickCheck中复制解析器的逻辑以实现彻底的测试。这真的是一个好主意,或者这可能是像HUnit这样的传统工具比QuickCheck更适合的情况吗?

1 个答案:

答案 0 :(得分:13)

一般情况下,解析器的反向是一台漂亮的打印机,与解析器的随机输入相反,是AST的随机漂亮打印。

因此,请遵循usual approach并为您的AST定义一个Arbitrary实例,它驱动随机格式良好的语法片段。混合使用一些错误字符作为包装来测试错误处理。

另见: