版本 |
0.0.0,0.0.0,0.1.0,0.2.0,0.3.0,0.3.1,0.4.0,0.4.1,0.4.2,0.4.3,0.5.0,0.6.0,0.7.0,0.7.1,0.7.2,0.7.3,0.8.0,0.9.0,0.10.0 |
更改日志 |
CHANGELOG.md公司 |
依赖关系 |
ansi-wl-打印(>=0.6.7.3 && <0.7),基础(>=4.7 && <5),约束(>=0.9.1 && <0.10),容器(>=0.5.7.1 && <0.6),mtl公司(>=2.2.1 && <2.3),并联输入输出(>=0.3.3 && <0.4),快速检查(>=2.9.2 && <2.10),随机的,随机的(>=1.1 && <1.2),单子(>=2.2 && <2.3),stm公司(>=2.4.4.1 && <2.5)[细节] |
许可证 |
BSD-3条款 |
版权 |
版权所有(C)2017,ATS Advanced Telematic Systems GmbH |
作者 |
斯特万·安杰尔科维奇 |
维护人员 |
斯特万·安杰尔科维奇<stevan@advancedtelematic.com> |
类别 |
测试 |
主页 |
https://github.com/advancedtelematic/quickcheck-state-machine#自述文件
|
源回购 |
头部:git克隆https://github.com/advancedtelematic/quickcheck-state-machine |
已上传 |
通过斯特瓦纳在2017年6月7日08:27:27Z |
快速检查状态机
![生成状态](https://api.travis-ci.org/advancedtelematic/quickcheck-state-machine.svg?branch=master)
快速检查状态机
是基于的Haskell库在快速检查,用于测试有状态程序。图书馆不同于这个测试。快速检查。一元(Monadic)
方法因为它允许用户通过状态机指定正确性使用前置和后置条件的基于模型。状态机的优势方法有两个方面:1)指定程序的正确性变得越来越少adhoc,2)你可以免费测试比赛条件。
基于状态机的模型规范和基于属性的组合测试首先出现在Erlang的专有QuickCheck中。这个快速检查状态机
库可以被视为试图提供类似的Haskell的QuickCheck库的功能。
示例运行(摘要)
下面是我们在变量中查找竞争条件时的输出示例参考示例:
>快速检查(可变引用.prop_parallel RaceCondition)***失败!(5次试验和6次收缩后):无法线性化:┌──────────────────────┐│ 新建││ ⟶ $0 │└──────────────────────┘│ ┌────────┐│ │ 包括0美元┌─────────┐ │ │ ││ 收入0美元│ │ │ │©©©©©©©©©©©©©() ││ │ │ └────────┘│ ⟶ () │ │└─────────┘ │┌─────────┐ ││ 读取$0│││ ⟶ 1 │ │└─────────┘ │
显然,如果我们并行增加一个可变引用,那么最终可能会得到一个比赛条件。我们将回到下面的示例,但如果您是不耐烦,你可以找到完整的来源代码在这里.
它是如何工作的
粗略的想法是要求图书馆用户提供:
- 命令的数据类型;
- 数据类型模型;
- 模型上命令的前置和后置条件;
- 给定模型和命令的状态转换函数可以推进模型到下一个状态;
- 生成和收缩命令的方法;
- 执行命令的语义。
然后,库返回一个顺序属性和一个并行属性。
Sequential属性
这个顺序属性检查模型是否与语义。这样做的方式是:
-
生成命令列表;
-
从初始模型开始,对每个命令执行以下操作:
- 检查前提条件是否成立;
- 如果是,使用语义执行命令;
- 检查后置条件是否成立;
- 利用过渡函数对模型进行了改进。
-
如果出现问题,请缩小命令的初始列表并显示一个最小反例。
Parallel属性
这个平行性质检查语义的并行执行是否可以用顺序模型解释。这对于尝试查找比赛条件——这通常很难测试。它的工作原理是跟随:
-
生成一个命令列表,这些命令将作为并行程序(将其视为设置的初始化位某些州);
-
生成两个命令列表,用作并行后缀;
-
按顺序执行前缀;
-
并行执行后缀并收集每个命令的调用和响应;
-
尝试找到命令调用的可能顺序交错尊重后条件的回应。
最后一步主要是试图找到一线性化的呼叫可能发生在单个线程上。
示例
开始时,可能最简单的方法是看一看其中的一个示例:
-
水壶问题来自死硬2--这是一个简单的例子属于我们使用序列属性来寻找解决方案的规范(反例)动作片中的拼图。请注意,此示例没有有意义的语义,我们只是模型检查。这可能有助于将解决方案与刺猬解决方案和这个TLA公司+解决方案;
-
这个联合发现例子--sequential属性的另一种用法,这次使用了有用的语义(union-find算法的强制实现)。它可能很有用将解决方案与论文中的解决方案进行比较测试一元代码快速检查[PS(聚苯乙烯)],哪个是这个测试。快速检查。一元(Monadic)
模块基于;
-
可变参考例子--这是一个更大的例子,展示了sequence属性如何查找普通的bug,以及parallel属性如何查找竞争条件。几个元属性,例如检查反例是否为最小值,在分离模块;
-
门票分配器例子--再次使用parallel属性查找比赛条件。这是在测试数据库以进行比赛QuickCheck的条件和测试硬物并保持Sane公司[PDF格式,视频]文件。
所有示例都有关联的规格
模块位于这个示例/测试
目录。它们利用了示例中的属性,并作为一部分进行了测试属于特拉维斯CI.
为了更好地理解示例,可能有助于git克隆
这回购,光盘
进入示例/
目录并启动堆栈ghci
并运行不同属性交互。
如何做出贡献
这个快速检查状态机
这个图书馆仍处于实验阶段。
我们希望鼓励用户试用它,并加入关于如何我们可以在问题跟踪器上改进它!
另请参见
-
快速检查错误跟踪问题--其中关于如何将基于状态机的测试添加到QuickCheck已启动;
-
使用QuickCheck和查找Erlang中的竞争条件脉冲[PDF格式,视频]——这是第一篇描述Erlang的QuickCheck如何工作(包括并行测试);
-
线性化:并发的一个正确条件物体[PDF格式],这个是一篇描述并行的主要技术的经典论文属性;
-
Aphyr关于杰普森,其中还使用线性化技术,并在许多分布式系统:
-
使用状态机对程序的属性进行建模和验证是正如几本关于这一主题的书所证明的那样,这本书已经很成熟了:
这些书包含如何使用状态机对系统建模的一般建议,因此与我们相关。关于为什么状态机是对于建模很重要,请参见:
许可证
BSD样式(请参阅文件LICENSE)。