如何报告失败的测试用例

How to report failing test cases

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

如何配置我的环境以报告 QuickCheck 生成的参数未能满足测试中的 属性?正如 Testing with HTF 中所指出的,单是其中一些工具的文档就已经很稀疏而且很差,更不用说将它们组合在一起了。

"Gave up!" 表示与 "Falsifiable".

不同类型的失败

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

因此,丢弃的测试不会从整体上伪造 属性(前提条件为假的蕴涵在逻辑上是正确的),但是太多的丢弃测试可能会导致覆盖率不足,这会通过您的失败发出信号观察到,并且没有可打印的反例。为了解决这个失败,找到丢弃物的来源,可能的结果包括:

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

@Li-yao Xia 说得对,你的生成器生成了很多可丢弃的测试用例。要提高 HTF 的丢弃阈值,您可以这样写 属性:

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

args 变量的类型为 Args,直接来自 quickcheck 包。