2014-01-16 39 views
7

我正在使用Haskell和Parsec来解析文件格式。我的解析函数看起来像这样:如何改进QuickCheck和Parsec调试?

parseInput :: String -> Model 
parseInput input = ... 

data Model = Model { mNumV :: Int, mNumF :: Int, ... } 

为了测试这个,我使用QuickCheck。我已经定义了一个Arbitrary实例产生代表格式文件的内容String

instance Arbitrary File where 
    arbitrary = ... 

data File = File { fContents :: String, fNumV :: Int, fNumF :: Int, ... } 

我的一个特性可能会检查解析任意String后,以确定是否mNumV == fNumV。这很好 - 当它工作。

但是,如果有失败,秒差距抛出类似的错误:

*** Failed (after 1 test): 
Exception: 
    (line 302, column 3): 
    unexpected "\n" 
    expecting space 

这是有用的 - 但是,测试失败后的任意文件的内容消失。我不能进去参考线302.

我可以看到的唯一替代方法是在每次测试后打印每个任意文件的fContents - 但这似乎是一个可怕的想法。将每个任意文件路由到磁盘上的文件以供日后参考也是如此。

有没有常见的解决方法?

+1

还有一个关于如何返回quickCheck失败的值的问题:http://stackoverflow.com/questions/8191131/find-the-value-that-failed-for-quickcheck –

+0

@JakobRunge我想我已经有这样的价值 - 我错过了一些方法来从Parsec获取行号并查看文件内容。 – sdasdadas

+1

如果您知道如何获取失败的值,并且Parsec给出了行和列号,那么您是否应该不能到该位置查看哪个输入发生了错误? – user2407038

回答

1

可以使用whenFail打印出错的字符串(或将其转储到文件)。