Testing Haskell:如何使用quickcheck测试(反应性)FSM?

Testing Haskell:如何使用quickcheck测试(反应性)FSM?,testing,haskell,quickcheck,frp,Testing,Haskell,Quickcheck,Frp,我写了一个有限状态机模块为一个小足球比赛,我目前正在工作。它提供了一个用于设置FSM(基本上是其状态和转换)的接口。对于每个状态,您可以提供在进入和退出时触发的函数,或者在FSM保持相同状态时,这些函数然后返回一些消息。它还提供了一个反应式接口(Yampa),该接口产生时变状态并收集随时间发生的消息。代码在这里 我正在寻找一个很好的方法来测试这个模块。因为它是纯的,我想试试quickcheck。我没有快速检查的经验,所以任何提示都将不胜感激!到目前为止,我的基本理解是:提供一些函数或多或少随机地

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


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

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

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


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

那么,您想编写哪种类型的测试?哪些属性或行为需要验证?嗯,也许问题是我真的不知道。。。对于“对于每个有效的fsm,任何有限的转换列表都会导致状态“Nothing”或状态“Just s”,其中s是fsm中的状态”,ok。但是更复杂的东西,比如“对于每一个有效的fsm和(时变的)转换和感知列表,沿着转换路径的每一个消息集合都应该被提取”,我不知道如何将其形式化。我知道如何为此设置单元测试,但是使用quickcheck我有点迷路了。链接已断开(),并且没有可以保存的存档find@icc:已经有一段时间了:-)-修复了链接。差不多5年了:)所以可能混合是最好的方法:测试特定fsm的特定结果,并使用HUnit输入逐步情况,还有快速检查更多的通用属性?@martingw:我认为混合是最好的默认方法,是的。我敢肯定,黑客网站上甚至有为HUnit、QuickCheck和其他东西提供统一测试工具的东西。我可能会争辩说,如果可能的话,应该优先选择快速检查,但当您测试的是从A到B,而不是路线的细节时,它最有效。