9

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

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

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

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

4

1 回答 1

13

通常,解析器的逆向是漂亮的打印机,而解析器的随机输入的逆向是 AST 的随机漂亮打印。

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

也可以看看:

于 2012-06-12T16:12:13.170 回答