【问题标题】:Recreating failing input value for QuickCheck from a seed从种子重新创建 QuickCheck 的失败输入值
【发布时间】:2018-09-27 16:51:58
【问题描述】:

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

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

unGen :: QCGen -> Int -> a

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

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

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

【问题讨论】:

    标签: haskell quickcheck


    【解决方案1】:

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

    【讨论】:

    • 你能举个例子吗? (或解决方案的句法示例)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多