【问题标题】:Testing Parsec parsers by generating inputs with QuickCheck通过使用 QuickCheck 生成输入来测试 Parsec 解析器
【发布时间】:2012-06-12 16:04:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: testing haskell parsec quickcheck


    【解决方案1】:

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

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

    另见:

    【讨论】:

    • 我喜欢使用的一个特殊属性是 parse = parse 。漂亮的 。解析。这是对解析器的信息商进行建模的一种不错的方式,有一个很好的辅助工具可以从理论的角度来驱动它,并且它捕捉到了这样一个事实:漂亮的 . parse 是幂等的,如果不是恒等函数。 (通常解析会丢弃一些信息)
    • 最后两个链接失效
    • @AlexHirzel 已修复! (待批准)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多