【问题标题】:Generate events/commands using a property based testing tool?使用基于属性的测试工具生成事件/命令?
【发布时间】:2016-06-22 20:29:47
【问题描述】:

据我了解,大多数属性测试工具都是在功能级别上运行的。给定一组参数,此类工具将生成随机输入并针对某些不变量进行测试输出。

我了解到 ScalaCheck 现在开始包含生成事件以测试全状态系统。但是,我找不到关于它的大量信息。这是否也在 *check 生态系统的其他部分(fscheck、quickcheck 和其他变体)中变得流行?

【问题讨论】:

  • 我不明白你问的问题。基于属性的测试基于被测试的代码没有突变或副作用的假设。如果您的代码具有对功能至关重要的突变或副作用,则您需要一种不同的方法。这就是 scala check 中的状态测试框架的用途。至于您关于在其他框架中受欢迎程度的问题,我认为这只有主观答案,因此对于 SO 来说不是一个好问题
  • “这会变得流行吗”我的意思是我只是想知道其他语言中的类似框架是否与 scalacheck 的状态测试对应。不是最受欢迎的排名。由于基于事件的架构越来越流行,我很想知道自动随机测试生态系统是否会提出相应的解决方案。
  • 如果您采用响应式函数式编程方法,事件就是简单的数据结构。将它们定义为记录类型,例如FsCheck 创建它们没有问题。
  • @MarkSeemann 在我看来,“事件”基础系统可以简单地建模为具有多种方法的有状态类。我了解 fscheck/等。可以使用随机输入多次调用单个函数,但它是否设计为使用随机输入以随机顺序调用类的整个公共接口,然后检查类的状态?
  • FsCheck 和 QuickCheck 不调用任何方法。它们生成数据,然后您编写使用该数据的代码。

标签: quickcheck scalacheck fscheck property-based-testing


【解决方案1】:

据我所知,您所说的“事件生成”源自 Koen Claessen 和 John Hughes 的“使用 QuickCheck 测试一元代码”。他们给出的例子是测试一个队列。使用的方法总是相似的 - 正如 cmets 所说,因为“基本”快速检查(我将使用小写快速检查来描述各种平台上的 QuickCheck 端口系列)假设它生成不可变数据,乍一看它并不容易使用quickcheck 测试一个有副作用的、有状态的系统。

直到您意识到有状态系统通过执行一系列状态转换(这些转换称为命令、动作、事件等)而达到某个状态。这个序列可以完美地表示为不可变转换的不可变列表!通常,每个转换都在被测真实系统及其状态模型上执行。然后在每次转换后将模型状态与真实状态进行比较。

要了解这如何在 Quvik QuickCheck(针对 Erlang)中发挥作用,例如,您可以阅读 Thomas Arts、John Hughes、Joakim Johansson 和 Ulf Wiger 的“使用 Quviq QuickCheck 测试电信软件”。

我确实相信大多数快速检查,包括 QuickCheck 本身,在基本快速检查功能之上都有一个层,允许您生成一系列状态转换,通常使用带有前置条件和后置条件等的状态机方法。

我认为这不是特别新,但可能有点被低估了。

例如,FsCheck 多年来一直拥有model based testing(披露:我是 FsCheck 的主要贡献者)。我认为 ScalaCheck 也是如此。 Quvik QuickCheck 可能是最先进的实现(当然是最先进的应用程序)。

【讨论】:

  • 很棒的细节。谢谢@Kurt。对论文的引用也有助于我对这个主题有更深入的了解。
猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2020-10-24
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多