Haskell - 在QuickCheck的帮助下进行Parsec测试

m0n*_*awk 7 haskell parsec quickcheck

我想为Parsec解析器编写测试.以下是解析器和数据结构的示例:

data Event = Event { keyEvent :: String }
    deriving Show

parseKey :: Parser Event
parseKey = do
             char '<'
             k <- many1 (letter <|> digit <|> oneOf "_")
             char '>'
             return $ Event k
Run Code Online (Sandbox Code Playgroud)

我知道我需要检查parse = parse . pretty . parse房产.但是,我应该如何生成正确不正确的测试用例?一般来说,我应该如何为给定的BNF生成测试用例?我知道instance Arbitrary,但这并没有多大帮助.

如果您为这个简单的解析器提供一个评论良好的生成器示例,我将不胜感激.

Mat*_*hid 12

测试解析器并非完全无足轻重.(与所有测试一样,取决于事物的复杂性.)

你可以做的一件事就是编写一个Arbitrary构造所有有效表达式的实例(或者你正在尝试解析的任何东西),然后检查如果你打印那个东西然后解析得到的字符串,你就会回来你开始了.

这有几个问题:

  • 如果答案是错的,那什么破了?解析器还是打印机?

  • 如果你正在解析的东西很复杂,有可选的括号和东西,你需要检查它是否可以使用和不使用可选括号.你漂亮的打印机通常会以这种或那种方式进行.

  • 这并没有检查垃圾输入是否真的被拒绝(并没有被解析为奇怪的东西).例如,我已经编写了大量的Parsec解析器,如果它出现在输入的末尾,它将默默地忽略语法错误.

一般来说,我所知道的测试解析器的唯一真正彻底的方法就是手动编写大量的手动测试.(每当你发现解析错误的东西时,为它添加另一个测试用例.)例如,这基本上是GHC对他们的测试套装所做的.

当然,这取决于你的解析器有多复杂,以及你想要多少保证......如果你只是解析JSON,你可以很容易地测试它.如果你正在解析像Markdown这样的东西......我的上帝怜悯你的灵魂!