基于模型的自动化测试工具GraphWalker(一):基本原理

原理

1、测试模型
  一个测试模型是有向图表示的FSM或者EFSM模型,由箭头和节点组成,如图所示。
基于模型的自动化测试工具GraphWalker(一):基本原理
  一个箭头,代表了一次测试动作;
  一个节点,代表一次测试验证。
2、测试需求选择Test requirements selection
目的:指导测试用例生成器( test generation)如何生成用例。
测试需求选择包含3方面:
  1)模型中的目标(结束条件)
  2)覆盖准则(路径生成准则)
   状态覆盖
   转换覆盖
  3)行走算法
  随机行走
  覆盖引导
3、测试用例生成Test generation
  按模型及测试需求选择来生成测试用例。GraphWalker就是完成这部分工作的一个开源的java工具。
4、测试具体化Test concretization
  从测试套件到可执行级别,可以自己实现插件完成这部分功能。将测试用例转化成可执行脚本。
5、执行测试Test execution
  执行测试,并比较预期结果。
  GraphWalker就是一个基于测试模型的用例生成工具,完成上图中Test generation的工作。给出一个测试模型及测试需求选择,GraphWalker能生成相应测试路径。由这个测试路径,可以用来执行你的测试脚本。它主要应用于FSM, EFSM模型。可以用来它可以直接读取FSM, EFSM图形模型、json模型,生成测试用例。

GraphWalker模型

1、顶点(Vertex)
  顶点表示我们想要检查的预期状态。在任何实现代码/测试中,你可以通过断言或者数据校验改结果。
  一个顶点称为节点,通常表示为一个框。
  GraphWalker不在乎顶点的颜色或形状。
2、边(Edge)
  表示从一个顶点到另一个顶点的方法。这是为了达到下一个状态需要做的任何动作。它可以选择一些菜单选项,单击按钮等测试动作。
  GraphWalker只接受单向有向边(箭头)。
  GraphWalker不关心边有什么颜色或宽度。
3、start顶点
  start顶点不是必需的。
  如果使用,则只能有1个 且顶点名称为:start.
  从start顶点出发只能有1个边。
  start顶点不会包括在任何生成的测试路径中,它只表示一个开始位。
  顶点或边的名字(name)
  名称是第一个单词,位于标签中边或顶点的第一行。
4、标签(Lable)
  标签是点或边上的所有文字描述。
5、Guard
  guard是一种只与边相关的机制。他们的角色与if语句相同,并且使边有资格或者没有资格被访问。
  guard是一个用方括号括起来的JavaScript条件表达式 如:[loggedIn == true]
6、操作(Action)
  Action是我们要执行的JavaScript代码。它放在正斜杠之后。Action可以有多个,每个语句必须以分号结尾。它的执行结果将作为数据传递给守卫。如:/loggedIn=false; rememberMe=true;
基于模型的自动化测试工具GraphWalker(一):基本原理

7、模型中的关键字
  在模型中使用关键词以增加功能和可用性。
  Start - 这在顶点中用于表示开始顶点。每个模型只有一个起始顶点。
  BLOCKED - 包含此关键字的顶点或边将在生成路径时排除。如果它是一个边,它将简单地从图中删除。如果它是一个顶点,顶点及相关联的边将被删除
  SHARED - 此关键字仅用于顶点。这意味着GraphWalker可以跳出当前模型,到任何其他模型到具有相同SHARED名称的顶点。 语法是: SHARED:SOME_NAME
  INIT - 只有一个顶点可以有这个关键字。在模型中使用数据时,需要初始化数据。
8、多模型
  GraphWalker可以在一个会话中使用几个模型。这意味着在生成路径时,GraphWalker可以选择跳出一个模型到另一个模型。当将不同的功能分为多个模型时,这是非常方便的。
多模型一起启动时,所有模型一起进行初始化。
多模型offilne运行举例:
java -jar graphwalker-cli-4.0.0-SNAPSHOT.jar -d all offline -m Model_A.graphml random(edge_coverage(100)) -m Model_B.graphml random(edge_coverage(100)) -m Model_C.graphml random(edge_coverage(100)) -m Model_D.graphml random(edge_coverage(100)) –o
基于模型的自动化测试工具GraphWalker(一):基本原理基于模型的自动化测试工具GraphWalker(一):基本原理
基于模型的自动化测试工具GraphWalker(一):基本原理基于模型的自动化测试工具GraphWalker(一):基本原理
  多模型之间的数据不通用。如上述模型,虽然模型A与模型B用相同变量e_B,但在不同模型间跳转时。ModelA中的e_B,与ModelB中的e_B是不同变量。
  多模型一起启动时,所有模型一起进行初始化。
  多模型之间跳转,相当与GraphWalker自动在SHARD状态之间。建立2条虚拟边,GraphWalker将根据算法选择是否前往shard状态。
  当路径生成到达模型A中的顶点v_B时,它必须考虑关键字SHARED:B .这告诉GraphWalker使用相同的名称在同一个关键字中搜索所有其他模型:B。在我们的例子中,只有一个,它在模型B中。现在GraphWalker决定是跳出模型A,模型B中的顶点v_B还是留在模型A中。这个决定是基于随机的。

工具核心算法

3.1 GraphWalker路径生成
1、路径生成器和结束条件
  路径生成器连同停止条件将决定当通过模型生成路径时使用什么策略,以及何时停止生成该路径。路径生成器可以彼此连接。可以使用逻辑或,AND,||,用&&使用多个停止条件。
2、路径生成器
  生成器是决定如何遍历模型的算法。不同的生成器将生成不同的测试序列,并且它们将以不同的方式遍历模型。多个生成器可以串联。
random( some stop condition(s) )
以完全随机的方式浏览模型。也称为 “随机步行”。该算法通过随机从顶点选择出边,并且在下一个顶点时重复此过程。
quick_random( some stop condition(s) )
  尝试运行通过模型的最短路径,但以快速的方式。这是算法的工作原理:
  选择一个尚未被随机访问的边
  使用Dijkstra算法选择到该边缘的最短路径走该路径,并将所有执行的边标记为已访问
  当在步骤1中达到选定的边缘时,从头开始,重复步骤1-> 4。
  该算法对于非常大的模型工作良好,并且生成合理的短序列。缺点是当与EFSM结合使用时。该算法可以选择被守卫block的路径。
a_star( a stop condition that names a vertex or an edge )
将生成到特定顶点或边的最短路径。
  选择一个尚未被随机访问的边
  选择一个尚未被随机访问的边使用Dijkstra算法选择到该边缘的最短路径走该路径,并将所有执行的边标记为已访问
  当在步骤1中达到选定的边缘时,从头开始,重复步骤1-> 4。
  该算法对于非常大的模型工作良好,并且生成合理的短序列。缺点是当与EFSM结合使用时。该算法可以选择被守卫block的路径。
将计算并生成通过模型的最短路径。每个边缘的成本设置为1. 不建议使用此算法,因为对于较大的模型,将需要相当长的时间来计算。
3.2 GraphWalker结束条件
edge_coverage( an integer representing percentage of desired edge coverage )
  边覆盖率达到某个值时,模型遍历结束。停止标准是一个百分比数字。当在执行期间达到所穿过的边的百分比时,停止测试。如果一个边被遍历超过一次,当计算百分比覆盖率时,它仍然计为1
vertex_coverage( an integer representing percentage of desired vertex coverage )
  顶点覆盖率达到某个值时,模型遍历结束。停止标准是一个百分比数字。当在执行期间达到所遍历的顶点的百分比时,停止测试。如果顶点遍历超过一次,当计算百分比覆盖率时,它仍然计为1。
reached_vertex( the name of the vertex to reach )
  停止标准是指定的顶点。当在执行期间到达顶点时,测试停止。
reached_edge( the name of the edge to reach )
  停止标准是指定的边。当在执行期间到达这条边时,测试停止。
time_duration( an integer representing the number of seconds to run )
  停止标准是表示允许测试发生器执行的秒数的时间。

工具地址:http://graphwalker.github.io/