7

我为我目前正在从事的一个小型足球比赛编写了一个有限状态机模块。它提供了一个用于设置 FSM 的接口(基本上是它的状态和转换)。对于每个状态,您可以提供将在进入和退出时触发的函数,或者当 FSM 保持相同状态时,这些函数会返回一些消息。它还提供了一个反应式接口 (Yampa),它产生随时间变化的状态并收集随时间发生的消息。代码在这里Data/FSM.hs

我正在寻找一种测试这个模块的好方法。由于它是纯的,我想尝试一下快速检查。我对快速检查没有经验,所以任何提示都将不胜感激!到目前为止,我的基本理解是:提供一些或多或少随机构建 FSM 的函数,然后在它们上运行一些(或多或少随机)转换。但我不太明白如何以这种方式构建测试......

4

1 回答 1

4

首先,可以说 QuickCheck 最适合验证广泛的一般属性。给定某种类型的任意数据,执行一些操作,然后使用谓词确保结果具有与输入相关的某些属性。涉及逐步行为的精确细节的事情在这种风格中可能效果不佳,您不应该觉得有义务在 QuickCheck 中做所有事情!

也就是说,根据您在评论中给出的更复杂的示例,您是否考虑过简单地生成预期输出以及 FSM 和输入?如果您可以通过构造生成您知道是正确的所需结果,那么您可以在输入上运行 FSM 并将实际结果与构造版本进行比较。

如果您避免将 QuickCheck 属性视为在某些输入上测试函数,而是将其视为检查一个或多个值是否满足以被测试函数表示的某个谓词,这可能会有所帮助。这个值的集合(可能包括多个输入、输出、任何必要的)实际上是由 QuickCheck 随机生成的。

于 2011-12-17T23:29:51.627 回答