【问题标题】:Haskell: How to test a (reactive) FSM with quickcheck?Haskell:如何使用快速检查测试(反应性)FSM?
【发布时间】:2012-01-22 13:40:19
【问题描述】:

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

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

【问题讨论】:

  • 好吧,你想写什么样的测试?需要验证哪些属性或行为?
  • 好吧,也许问题是我真的不知道......对于像“对于每个有效的 fsm,任何有限的转换列表都会导致状态 'Nothing' 或状态 'Just s' 其中 s 是 fsm 中的一个状态”,好的。但是更复杂的东西,例如“对于每个有效的 fsm 和(随时间变化的)转换和感知列表,应该拾取转换路径上的每个消息集合”,我不知道如何将其形式化。我会知道如何为此设置单元测试,但是通过快速检查我有点迷茫。
  • @icc:已经有一段时间了 :-) - 修复了链接。
  • 将近 5 年了 :)

标签: testing haskell quickcheck frp


【解决方案1】:

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

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

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

【讨论】:

  • 所以可能混合使用是最好的方法:测试特定 fsm 的特定结果并使用 HUnit 逐步输入,并快速检查更通用的属性?
  • @martingw:我认为混合是最好的默认方法,是的。我很确定在 Hackage 上什至有一些东西可以为 HUnit、QuickCheck 和其他东西提供统一的测试工具。我可能会争辩说,如果可能的话,应该首选 QuickCheck,但是当您测试的只是从 A 到 B,而不是所走路线的详细信息时,它的效果最好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2020-01-19
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多