【发布时间】:2014-01-11 20:10:20
【问题描述】:
我正在使用 Scalacheck 并希望生成给定大小的集合。 scalaCheck 中有一个特殊的功能,Gen.listOfN(size, Gen[T])。
当在forAll 方法中打印生成的集合的大小时,它并不总是具有定义的大小。实际上,它仅在第一次尝试时具有给定的大小。例如,大小 6 --> 第一次尝试收集的大小是 6,第二次尝试大小只有 3。我做错了什么?
【问题讨论】:
标签: scalacheck
我正在使用 Scalacheck 并希望生成给定大小的集合。 scalaCheck 中有一个特殊的功能,Gen.listOfN(size, Gen[T])。
当在forAll 方法中打印生成的集合的大小时,它并不总是具有定义的大小。实际上,它仅在第一次尝试时具有给定的大小。例如,大小 6 --> 第一次尝试收集的大小是 6,第二次尝试大小只有 3。我做错了什么?
【问题讨论】:
标签: scalacheck
听起来您可能正在使用旧版本(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 方法简单地添加生成器的不变量。生成器/收缩功能是改进的目标,所以如果您有任何特定的用例让您觉得麻烦,我很乐意听到它们。