1

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

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

4

1 回答 1

1

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

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

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

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

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

例如,FsCheck 多年来一直进行基于模型的测试(披露:我是 FsCheck 的主要贡献者)。我认为 ScalaCheck 也是如此。Quvik QuickCheck 可能是最先进的实现(当然是最先进的应用程序)。

于 2016-03-09T08:28:31.903 回答