什么是使用QuickCheck输入谓词和测试函数返回的输出元组的最佳方法?
为了测试其他语言中的(2 * 350)个函数(以检查它们是否与模仿的Haskell基本和Prelude函数的行为不同),我的第一个实验是:
- 捕获(QuickCheck) verboseCheck结果字符串的输出 - 对QuickCheck抛出的每个(重新读取的)输入应用Haskell函数,以获取相应的Haskell输出 - 使用这些输入和输出自动检查其他语言中的并行函数,以查看它们是否与Haskell函数的行为不同
例如,要为列表上的函数获取测试数据,可以执行以下操作:
为了测试其他语言中的(2 * 350)个函数(以检查它们是否与模仿的Haskell基本和Prelude函数的行为不同),我的第一个实验是:
- 捕获(QuickCheck) verboseCheck结果字符串的输出 - 对QuickCheck抛出的每个(重新读取的)输入应用Haskell函数,以获取相应的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)
这种方式对于简单情况来说还不错,但我无法立即找到一种通用的模式来避免为每个类型签名变体编写单独的函数(以生成和捕获输入和输出)。
关键问题在于,read通常需要一些类型信息来解析QuickCheck生成的输入列表,以及它们(QuickCheck结果输出)的字符串化。
也许我采取了错误的方法,有什么想法吗?Template Haskell?
Gen
类型类),然后在不调用quickCheck
的情况下进行馈送和比较。 - Yuuri