【问题标题】:How do I prevent shrinking in Model-based testing?如何防止基于模型的测试中的收缩?
【发布时间】:2021-10-15 18:48:36
【问题描述】:

以下是 FsCheck 中基于模型的测试示例:

let spec =
  let inc = { new Command<Counter, int>() with
                    override __.RunActual counter = counter.Inc(); counter
                    override __.RunModel m = m + 1
                    override __.Post(counter, m) = counter.Get = m |@ sprintf "model: %i <> %A" m counter
                    override __.ToString() = "inc" }
                           
  let dec = { new Command<Counter, int>() with
                    override __.RunActual counter = counter.Dec(); counter
                    override __.RunModel m = m - 1
                    override __.Post(counter, m) = counter.Get = m |@ sprintf "model: %i <> %A" m counter
                    override __.ToString() = "dec" }
  
  { new ICommandGenerator<Counter,int> with
      member __.InitialActual = Counter()
      member __.InitialModel = 0
      member __.Next model = Gen.elements [inc;dec] }

如何为此测试禁用缩小命令?

【问题讨论】:

  • 我假设您问的是如何防止缩小使用的命令的 number 个,而不是如何防止缩小实际的命令对象本身?例如,默认情况下,FsCheck 会尝试将[inc; inc; dec; inc; inc; dec; dec; dec](7 个命令)缩小为[inc; inc; inc; dec](4 个命令)。

标签: f# fscheck


【解决方案1】:

如果您想阻止 FsCheck 缩小使用的命令数量(请参阅我上面的问题),您可以将规范转换为禁用缩小的属性:

let property =
    let generator = Command.generate spec
    let shrinker _ = Seq.empty   // disable
    Command.toPropertyWith spec generator shrinker
Check.Quick(property)

这允许 FsCheck 生成比所需更长的命令序列。例如。 [inc; inc; dec; inc; inc; dec; dec; dec].

【讨论】:

  • 要明确,无论哪种方式,FsCheck 都会生成更长的序列。此处禁用的是生成后的阶段,在该阶段 FsCheck 将尝试查找仍然未通过测试的较短序列(从较长的失败序列开始)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2014-10-29
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多