【问题标题】:How do I just generate data with fscheck?如何使用 fscheck 生成数据?
【发布时间】:2012-10-05 17:06:45
【问题描述】:

是否可以使用 fscheck 生成数据,特别是列表,以便在 fscheck 之外使用?我无法调试 fscheck 测试中看起来比较结果相等但 fscheck 说它们不相等的情况。

我有一个对象列表的生成器。如何生成可以从此生成器使用的列表?

let genListObj min max  = Gen.listOf Arb.generate<obj> |> Gen.suchThat (fun l -> (l.Length >= min) && (l.Length <= max))

【问题讨论】:

  • 使用Gen.eval,见fscheck.codeplex.com/SourceControl/changeset/view/…。但是 FsCheck 会为失败的情况输出生成的数据,因此通常不需要这样做。
  • 我以为我试过 Gen.eval。我再看看。对我来说,fsCheck 在属性测试中输出此数据的位置并不明显。向我的公共分支提交一些有趣的东西,并立即发布 #98 的长消息。
  • 顺便说一下,避免使用 Gen.suchThat。它基本上会生成随机值,直到一些通过过滤器,因此可能需要很长时间。例如,最好先生成一个随机长度(使用例如 Gen.choose),然后生成该长度的列表(使用 Gen.listOfLength)。
  • 感谢 Gen.listOfLength 的提示。我不知道我怎么忽略了这一点。
  • FsCheck 默认情况下没有设置为执行此操作,但编写函数相当容易。如果您发布您遇到问题的实际财产,我想我可以为您提供更好的帮助 - 特别是我不明白“fscheck 说他们不是” - fscheck 对平等没有任何特殊想法。

标签: f# fscheck


【解决方案1】:

编辑:此函数现在是 FsCheck API (Gen.sample) 的一部分,因此您不再需要以下内容...

这是一个从给定生成器生成 n 个样本的示例函数:

let sample n gn  = 
   let rec sample i seed samples =
       if i = 0 then samples
       else sample (i-1) (Random.stdSplit seed |> snd) (Gen.eval 1000 seed gn :: samples)
   sample n (Random.newSeed()) []

编辑:其中的 1000 幻数表示生成值的大小。 1000 相当大 - 例如例如,序列的长度将在 0 到 1000 个元素之间,字符串也是如此。如果生成需要很长时间,您可能需要调整该值(或将其作为函数的参数)。

【讨论】:

  • 哇!到目前为止,即使在返回我的自定义数据结构和列表的元组的 gen 上也可以完美运行。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2020-01-14
  • 2020-01-06
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多