如何改进QuickCheck和Parsec调试?

sda*_*das 7 haskell parsec quickcheck

我正在使用Haskell和Parsec来解析文件格式.我的解析函数类似于:

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

data Model = Model { mNumV :: Int, mNumF :: Int, ... }
Run Code Online (Sandbox Code Playgroud)

为了测试这个,我使用的是QuickCheck.我已经定义了一个Arbitrary生成String表示格式化文件内容的实例:

instance Arbitrary File where
    arbitrary = ...

data File = File { fContents :: String, fNumV :: Int, fNumF :: Int, ... }
Run Code Online (Sandbox Code Playgroud)

我的一个属性可能会检查以确定mNumV == fNumV在解析任意后是否String.这很有效 - 当它工作时.

但如果出现问题,Parsec会抛出类似于的错误:

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

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

我能看到的唯一选择是fContents在每次测试后打印每个任意文件 - 但这似乎是一个糟糕的主意.将每个任意文件路由到磁盘上的文件以供以后参考也是如此.

这有什么共同的方法吗?

pat*_*pat 1

您可以whenFail在失败时打印有问题的字符串(或将其转储到文件中)。