【问题标题】:Scalacheck, generator for lists between size 5 and 12Scalacheck,大小为 5 到 12 的列表生成器
【发布时间】:2016-04-21 02:12:26
【问题描述】:

我可以找到许多设置生成器最大大小的示例,但是如何生成介于最小和最大长度之间的列表?

【问题讨论】:

    标签: unit-testing scalatest scalacheck property-based-testing


    【解决方案1】:

    关于生成器的一个简洁属性是它们是可组合的,因此您可以使用listOfN 生成器简单地为您的列表长度组合一个生成器。

    for {
      numElems <- Gen.choose(5, 12)
      elems <- Gen.listOfN(numElems, elemGenerator)
    } yield elems
    

    【讨论】:

    • 你知道吗;这简直太优雅了!出于某种原因,库在处理大小时需要转换,例如:不支持最小大小的 Gen.resize(12,myGenerator)。您的示例更加灵活和有启发性。
    • 组合生成器是一个你必须在头脑中翻转的开关,但是一旦你意识到它对于生成专门的对象实际上是多么强大。很高兴我能帮上忙!
    • 使用 Gen.chooseNum 而不是 Gen.choose,因为 chooseNum 赋予了更大的权重来测试和生成最小值、最大值和特殊情况,例如 0(如果它们在范围内)。
    • 这让我觉得不正确:listOfN 中的 N 被描述为 Generates a list with at most the given number of elements ...意思是无论 N 是 5 还是 12,您仍然可以获得以下列表3个元素。或者一个空列表,就此而言。
    • 我没有看到相同的文档。在底层它使用buildableOfN,如果容器强制元素唯一性(如集合或地图),它可以生成小于指定大小的容器。 List 不是这种情况,我找到的所有文档都指定生成的列表的长度恰好是指定的 N
    【解决方案2】:

    我在这里唤醒了鬼魂,但万一有人来:

    根据我对已接受答案的评论,该解决方案随机决定 5 到 12 之间的最大长度,但在这种情况下,生成列表的实际大小仍可能为 0(零)或低于 5 的任何值。

    我认为以下内容符合 OP 的描述:

    Gen
      .listOfN(12, elemGenerator)
      .suchThat(_.size >= 5)
    

    如果有一个 API 可以方便地生成这个,或者说一个精确大小的列表,N,那就太棒了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多