【问题标题】:ScalaCheck collection generatorScalaCheck 集合生成器
【发布时间】:2014-01-11 20:10:20
【问题描述】:

我正在使用 Scalacheck 并希望生成给定大小的集合。 scalaCheck 中有一个特殊的功能,Gen.listOfN(size, Gen[T])。 当在forAll 方法中打印生成的集合的大小时,它并不总是具有定义的大小。实际上,它仅在第一次尝试时具有给定的大小。例如,大小 6 --> 第一次尝试收集的大小是 6,第二次尝试大小只有 3。我做错了什么?

【问题讨论】:

    标签: scalacheck


    【解决方案1】:

    听起来您可能正在使用旧版本(1.11.0 之前)的 ScalaCheck。在这些版本中,生成器边界并不总是得到尊重。

    当 ScalaCheck 为您的属性找到失败的测试用例时,它会尝试简化该测试用例(使其“更小”)。如今(版本 >= 1.11.0),ScalaCheck 在进行此简化时尝试尊重例如 listOfN,而不是测试少于 n 项目的列表。但是,在某些情况下,ScalaCheck 仍然不可能知道生成器从一开始就有哪些边界,例如当您使用 Gen.map 方法时。

    有关 ScalaCheck 仍可能以意想不到的方式简化测试用例的情况(以及您可以采取哪些措施来缓解它)的更多信息,请参阅:Scalacheck won't properly report the failing case

    【讨论】:

    • 您是否了解有关如何避免使用map 以避免边界(或其他元)信息丢失的任何指南?
    • 唯一的一般建议是使用Gen.suchThat 方法简单地添加生成器的不变量。生成器/收缩功能是改进的目标,所以如果您有任何特定的用例让您觉得麻烦,我很乐意听到它们。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多