收集Haskell Quickcheck的函数输出(以及输入)

时间:2018-02-01 11:43:44

标签: haskell quickcheck

什么是元组的最佳方法:1。QuickCheck输入到谓词,其中2.测试函数返回的输出?

想要用其他几种语言测试(2 * 350)函数(检查他们模仿的Haskell基础和Prelude函数的行为的差异)我的第一个实验是:

  • 从(QuickCheck)verboseCheck结果字符串
  • 捕获输出
  • 将Haskell函数应用于QuickCheck投入的每个(重新读取)输入,以获得相应的Haskell输出
  • 在自动检查其他语言中的并行函数时使用这些输入和输出,以区别于Haskell函数的行为

例如,要获取列表中函数的测试数据,例如:

testSet1
  :: (Show a, Testable prop)
  => String -> String -> ([Int] -> a) -> prop -> IO ()
testSet1 folder fname f p = do
  r <- verboseCheckResult p
  let ys =
        ((,) <*> f) . read . listTuple1 <$>
        splitOn ["Passed:"] (tail $ init $ (lines . output) r)
  writeFile (concat [folder, fname, ".txt"]) (show ys)

这个工作正常,至少对于简单的情况,但是我无法立即找到推广这种模式的方法,以避免为每个类型签名的变体编写单独的函数(为输出生成和捕获输入)。 / p>

关键问题是读取通常需要一些类型信息,用于从其(QuickCheck结果输出)字符串中解析QuickCheck生成的输入列表。

也许我采取了错误的做法。有什么想法吗 ?模板Haskell?

1 个答案:

答案 0 :(得分:2)

有一个单独的包来注释具有反例的属性(可以包含输入和输出):quickcheck-with-counterexamples

This QuickCheck issue on Github对同一主题进行了一些讨论。