使用基于 属性 的测试工具生成 events/commands?

Generate events/commands using a property based testing tool?

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

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

据我所知,您所说的 "generation of events" 起源于 Koen Claessen 和 John Hughes 的 "Testing Monadic Code with QuickCheck"。他们给出的例子是测试一个队列。使用的方法总是相似的——正如评论所说,因为 "basic" quickcheck(我将使用小写的 quickcheck 来描述各种平台上的 QuickCheck 端口系列)假设它生成不可变数据,乍一看这并不容易使用 quickcheck 来测试有副作用的有状态系统。

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

例如,要了解这在 Quvik QuickCheck(适用于 Erlang)中的表现,您可以阅读 Thomas Arts、John Hughes、Joakim Johansson 和 Ulf Wiger 的 "Testing Telecoms Software with Quviq QuickCheck"。

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

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

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