基于有限状态机的测试工具。
项目描述
介绍
Python-Graphwalker 是一个基于有限状态机图的测试工具。Graphwalker 读取由图形指定的 FSM,规划路径,从图形标签中按名称调用模型方法并报告进度和结果。
虽然从概念上派生自 Graphwalker 项目,(在 java 中实现)这是对最初概念的完全重新实现。
值得注意的是,有一些区别:
在原始版本中,节点被认为是要验证的状态和要采取的边缘操作,但是这个版本并没有以任何方式强制执行这个约定,尽管它非常有用。
Python Graphwalker 不理解扩展的 FSM 标签。它应该忽略它们,但风险自负,直到最终以一种或另一种方式处理。
Python Graphwalker 在让您加载和组合代码以实现设计的不同组件方面非常混杂。有些组合没有意义。
交互式规划器的自测图表。
</figcaption> </figure>整体设计
驱动设计的想法是图形问题与测试操作完全正交,并且报告结果的问题与两者正交。图形问题可进一步分解为路径规划、停止条件,当然还有加载图形文件。
添加的能够保存和重播运行路径的功能请求溶解到路径记录器报告类和纯文本图形加载器中。
设计分为以下几个部分:
模型,(通常)由用户作为图形文件提供。
停止条件,如果满足其条件,则布尔转换为真。
Planner,它使用模型和停止条件来提供可迭代的计划步骤作为(id,name,...)元组。
Reporter,在执行事件上调用。
水龙头,由记者系统安装以捕捉副作用。(目前标准输出/标准错误和日志记录)
Actor 由用户作为具有功能属性的对象提供,通常是对象实例。
执行者,对于计划中的每个步骤,调用报告者并查找并调用参与者上的命名方法。除了 step 方法,它还调用一些其他方法,如果存在于 actor 上。
代码加载器
有一个通用的代码加载器接口,因此很容易从命令行加载自定义代码和提供参数(如果有,如果可调用):
--foo=module.module
–foo=module.module.function
–foo=module.module.class:argument,...,keyword=value,...
如果找到的对象是可调用的,它将被调用,并提供任何参数,并使用结果。
格式
目前,Python Graphwalker 可以理解一些简单的文件格式:
图形语言
原始 Graphwalker 的图形通常是使用yEd绘制的,它通常会生成 graphml 文件,因此对这些文件的支持是一个优先事项。
点/图形可视化
也可以编写普通的 graphviz 文件,结果证明这很有用:Cartographer 记者使用 dot 生成突出显示的地图。
纯文本
纯文本单词列表被解释为要访问的节点的线性列表。尊重熟悉的“/* ... */”形式的注释,以及“#”和“//”变体的行注释。如果第一个节点没有标记为“开始”,则添加这样的节点。
其他格式
其他格式很容易添加。您需要为阅读器提供的只是一个可迭代的顶点 (id, label) 对和一个可迭代的 (id, label, from-id, to-id) 四元组。Graphwalker 会将这些转换为其内部格式。对于写支持,您需要采用一对类似的序列,但不同之处在于顶点和边元组可能更长。
规划师
执行者要执行的步骤由一个或多个计划者确定。通常,计划者应该检查提供的图表并计划遍历它,但缺乏执行会产生一些特殊的机会。
规划器通过通用代码加载器接口实例化,因此很容易插入您自己的规划器。它们用一个图和一个 StopCond 实例调用,以提供一个包含至少两个元素的元组的可迭代对象,因为执行程序需要 id 和标签。
要生成可重复的计划,请使用种子关键字参数,因为计划者保留自己的随机数生成器。
随机的
最简单的规划器 Random 通过随机选择一条边并访问该边和目标顶点来遍历图,直到满足 StopCond。它不检查边和顶点之间的 StopCond。
例子
graphwalker --stopcond=Coverage --planner=Random:seed=1337 model.dot
去
要访问特定顶点,请将它们命名为 Goto 规划器的参数。除了名称和 ID 之外,“随机”将随机选择一个顶点。如果有多个候选者,将选择最接近当前顶点的那个。(因此,目前这不会最小化总路径。)
关键字参数“repeat”的整数将重复名称列表。(但不是,nota bene,特定的顶点。)零的重复将被视为无穷大。
例子
graphwalker --planner=Goto:happy,random,sad,repeat=10 model.dot
欧拉
为了最有效地访问图中的所有边,我们想生成一个 欧拉轨迹。由于图不一定是偶数(半)欧拉图,欧拉规划器复制图并对其进行修改。首先,通过从 Start vertex source 子图中删除强制步骤。然后通过添加边以使其成为欧拉图来“欧拉化”该图。(所有顶点的入度等于出度)创建计划后,它会通过 StopCond 运行,以消除最后的无关步骤。
例子
graphwalker --planner=欧拉模型.dot
交互的
在开发或调试模型时,通常希望在测试运行时选择路径。运行时,Interactive 会列出当前顶点的边并提示输入。您可以通过输入其编号来选择列出的边缘,也可以使用特殊命令之一:
姓名 |
|
---|---|
g, 去 |
转到指定的顶点[ 1 ] |
f、力 |
发送一些任意名称作为计划步骤 |
j、跳跃 |
将一些新顶点[ 1 ]设置为当前顶点 |
d、调试 |
进入 pdb 调试器 |
问,退出 |
结束计划 |
进入调试器注意事项
如果您从调试器中退出,您将退出整个程序。捕获 BdbQuit 异常似乎不起作用,而是使用 c/continue
例如,您可以在其他计划程序中设置断点,这将在您离开调试器后将您放回调试器。
StopConds - 何时停止
一些计划者具有固有的停止条件,而另一些则没有,因此可以将独立条件应用于计划。由计划人员咨询他们,因为他们并不总是以最佳方式或根本不中断测试。
覆盖范围
默认停止条件是覆盖 100% 的边,这意味着它会在看到图中的所有边时发出完成信号。它还可能需要一定百分比的顶点,或者每个顶点的一定百分比。百分比以名为“edges”和“verts”或“vertices”的关键字参数给出。
例子
graphwalker --stopcond=Coverage:edges=100,verts=50 model.dot
graphwalker --stopcond=Coverage:vertices=25 model.dot
见步骤
忽略边和顶点之间的差异,SeenSteps 将在它看到它正在寻找的所有步骤时简单地完成。这些步骤以参数列表的形式给出。
例子
graphwalker --stopcond=SeenSteps:a,e_once,b model.dot
计数步数
再次忽略边和顶点之间的差异,只计算测试步骤和在采取了一些步骤时发出的信号。步数是第一个参数,或关键字参数“步数”,默认为 100。
例子
graphwalker --stopcond=CountSteps:52 model.dot
graphwalker --stopcond=CountSteps:steps=52 model.dot
演员
测试执行器简单地使用 getattr 通过规划器提供的名称查找可调用对象,因此您可以将测试代码实现为模块、类,或者使用编程接口,基本上是您喜欢的任何对象。
测试对象上的可调用对象现在在没有参数的情况下被调用。
除了图中的标签外,还调用了一些管理方法(如果存在):
setup在测试会话开始时调用,其中包含包含测试中涉及的其他实例的字典:报告者、模型等。值得注意的是,如果您想保存测试方法的附件,您应该在此处使用报告器实例。
- step_begin在带有步骤定义的每个步骤之前调用。步骤
定义是一个可迭代的,其中第一个是 id,第二个是步骤的名称。
- step_end在每一步之后像 step_begin 一样被调用,但是使用
添加失败,通常为无。如果测试失败,或者存在其他异常,则使用该异常调用 step_end,通常是 AssertionError。step_end 方法可以通过返回确切的字符串“RECOVER”来允许测试继续。
最后, teardown的调用方式与 setup 相同。
记者
为了报告测试结果,每个事件都会调用报告器,特别是 step_begin 和 step_end。
打印
只需打印到标准输出(默认)或标准错误,由关键字参数输出控制。如果您使用的是编程接口,您可以发送任何类似文件的可写对象。请注意,Log 和 Print 的组合很快就会变得非常混乱。
例子
graphwalker --reporter=Print:output=stderr model.dot
日志
发射到标准的 python 记录器。记录器的名称默认为报告模块的名称,但可以通过关键字参数“记录器”设置。也可以使用关键字参数“级别”设置级别。请注意,Log 和 Print 的组合很快就会变得非常混乱。
例子
graphwalker --reporter=Log:logger=moo,level=WARN model.dot
路径记录器
PathRecorder 只是将计划步骤名称保存到文本文件中,以便可以通过将记录馈送到纯文本图形阅读器来复制运行。保存文件的目录默认为 '.' 但可以作为关键字参数“路径”给出。同样,名称默认为测试名称,但可以使用关键字参数“名称”进行设置。'attach' 关键字参数,如果设置(完全)使它尝试附加它。
例子
graphwalker --reporter=PathRecorder:path=/tmp,name=steps model.dot
graphwalker --reporter=PathRecorder:attach=true,name=steps model.dot
制图师
为了以图形方式绘制测试进度,Cartographer 报告器会发出 graphviz 文件,并突出显示当前步骤。关键字参数“dotpath”和“imgpath”分别控制graphviz输入和输出文件的去向,bot默认为“.”。图像类型默认为 PNG,但可以使用关键字参数“imgtype”进行设置。'attach' 关键字参数,如果设置(完全)使它尝试附加它。
例子
graphwalker --reporter=制图模型.dot
graphwalker --reporter=Cartographer:imgtype=jpg,attach=1 model.dot
graphwalker --reporter=Cartographer:dotpath=/tmp,imgpath=./www model.dot
水龙头
目前,只有流和日志系统的水龙头。默认情况下,包括标准输出和错误的记录抽头和抽头。
未来
Graphwalker 本身需要更多,更多更狡猾的测试。
执照
我们选择的许可证是 Apache 许可证,版本 2.0。您应该在名为“LICENSE.txt”的文件中找到全文。
项目详情
graphwalker -1.0.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2ec5768b56d7ef9727a46527c302ce1b6766da84f9931b3ae4850a48c75859ad |
|
MD5 | e08955af806baaae2394364d6cbafe07 |
|
布莱克2-256 | 3807f08941fda15e53630c8bc472c07825232c036011c1c02b5b8b84ef8c9a34 |