从种子为QuickCheck重新创建失败的输入值

时间:2018-09-27 16:51:58

标签: haskell quickcheck

当QuickCheck测试失败时,有时我需要遍历ghci(或堆栈代表)中的代码来分析问题。因此,我要做的第一件事是重新创建失败的输入。现在,QuickCheck打印出失败的输入(使用Show),但是有时很难或不可能从中重新创建输入。例如,所讨论的类型可能未实现Read。或者它可能是一个非常复杂的类型,需要大量类型才能重新创建它,并跟踪导出这些类型的模块,然后手动将其导入到repl中。

因此,我希望能够从种子中重新创建失败的输入,这也由QuickCheck报告。看起来Test.QuickCheck.Gen中的unGen就是为此而设计的。

unGen :: QCGen -> Int -> a
     

在特定种子上运行生成器。如果您只想获得一个   随机值输出,请考虑使用生成。

但是unGen需要两个输入参数。我猜第二个是种子。如何重新创建QCGen参数?这是我尝试的示例,种子为-4346962096583255693。 unGen似乎不是负面种子,所以我一定做错了事。

λ> (unGen arbitrary) (mkQCGen 0) (-4346962096583255693) :: ImprintEmptyBrainTestData 
ImprintEmptyBrainTestData (*** Exception: Negative exponent

2 个答案:

答案 0 :(得分:3)

您应该使用quickCheckResult(或quickCheckWithResult)来运行测试。如果它返回Failure,则usedSeedusedSize字段具有QCGenInt值,您需要将Args传递给quickCheckWith

答案 1 :(得分:1)

还有一个软件包quickcheck-with-counterexamples,如果测试失败,属性可以捕获生成的值以进行进一步检查。