0

我通过 Stack 使用 Haskell 测试框架来评估 QuickCheck 属性。当我运行时stack test,失败的属性以Gave up! Passed only 95 tests. 我发现的许多属性测试示例都以失败Falsifiable, after 48 tests的参数的形式报告失败。然而,这些示例似乎直接运行 QuickCheck,而不是通过 Stack 和 HTF。

如何配置我的环境以报告由 QuickCheck 生成的不满足被测属性的参数?正如在使用 HTF 进行测试中指出的那样,仅对于其中一些工具来说,文档已经很少而且很差,更不用说将它们组合在一起了。

4

2 回答 2

1

“放弃!” 意味着与“可证伪”不同的失败。

QuickCheck 有一种方法可以丢弃您认为“不正确”的测试用例,既不计入实际成功或失败。这种丢弃的典型来源来自使用蕴涵运算符(==>),其中不满足前提条件的测试用例被丢弃:“成功”仅在满足前提条件时才计算,让您更好地了解您的程度测试右侧的后置条件(这可能是对您作为用户真正重要的部分)。也可以显式使用该discard属性,其含义与实际失败(例如返回)不同False

因此,丢弃的测试不会证伪整个属性(带有错误前提条件的暗示在逻辑上是正确的),但是太多的丢弃测试可能会导致覆盖率不足,这通过您观察到的失败发出信号,并且没有反例可打印. 要解决此故障,请查找丢弃物的来源,可能的结果包括:

  • 使用更好的生成器(避免丢弃);
  • 提高丢弃阈值,@stefanwehr 在另一个答案中展示了如何在 HTF 中执行此操作;
  • 这些丢弃实际上应该是失败的。
于 2017-04-11T14:29:42.893 回答
1

@Li-yao Xia 说您的生成器生成许多可丢弃的测试用例是正确的。要使用 HTF 提高丢弃阈值,您可以这样编写属性:

prop_somePropertyWithRaisedDiscardThreshold =
    withQCArgs (\args -> args { maxDiscardRatioy = 1000 })
    somePredicateOrProperty

args变量具有 type Args,直接来自 quickcheck 包。

于 2017-04-11T19:09:30.377 回答