当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
答案 0 :(得分:3)
您应该使用quickCheckResult
(或quickCheckWithResult
)来运行测试。如果它返回Failure
,则usedSeed
和usedSize
字段具有QCGen
和Int
值,您需要将Args
传递给quickCheckWith
。
答案 1 :(得分:1)
还有一个软件包quickcheck-with-counterexamples,如果测试失败,属性可以捕获生成的值以进行进一步检查。