Graph Walker使用

本文主要对基于模型的测试工具graph walker使用介绍

本文恢复2019-3-15

graphWalker使用

官网:http://graphwalker.github.io/yed_model_syntax/

是基于模型测试的工具,以有向图形式表示

alt text

节点:代表我们想要执行的期望状态。

顶点表示我们要检查的预期状态。 在任何实现代码/测试中,您都可以在其中找到断言或者oracles。

边:表示从一个顶点到另一个顶点的过渡。无论为了达到下一个状态,都需要采取任何状态。它可以选择一些菜单选项,单击按钮或进行REST API调用。

关键词:

start-这在顶点中用于表示“开始”顶点。 每个模型只有一个Start顶点。

BLOCKED-生成路径时,将排除包含此关键字的顶点或边。 如果它是边缘,它将简单地从图形中删除。 如果它是一个顶点,顶点将会删除其内边和外边。

SHARED-此关键字仅适用于顶点。 这意味着GraphWalker可以跳出当前模型,跳转到具有相同SHARED名称的顶点的任何其他模型。

语法是SHARED:SOME_NAME

INIT-只有一个顶点可以有这个关键字。 在模型中使用数据时,需要初始化数据。 这就是这个关键字的作用。 允许INIT的顶点多于一个顶点。

语法是:INIT:loggedIn=false; rememberMe=true;

REQTAG-只有一个顶点可以有这个关键字。 以逗号分隔的要求列表。 用于创建具有外部需求和模型的可跟踪性。

语法是:REQTAG:String1, String2

weight-只有边可以拥有此关键字。 仅在使用随机生成器时使用。 它保持0到1之间的实数值,并表示应选择边缘的概率。 例如,值0.05表示选择该边缘的概率为5%。 下图中有两个来自顶点v_LoginPrompted的外边缘,它使用关键字权重。

语法是:weight=float value between 0.0 and 1.0

GraphWalker可以在一次会话中运行多个模型

MBT执行:

可以自动化生成测试用例,并且可以产生不同类型的测试用例

-冒烟测试

-功能测试

-非功能测试,exhaustive tests

可以通过从终端运行命令来生成路径。 下面是使用具有边缘覆盖停止条件的随机路径生成器从该图生成的路径的示例。

离线

1
2
3
java -jar graphwalker-cli-3.4.2.jar offline --start-element app_closed --model example_1.graphml "random(edge_coverage(100))"
#只打印当前元素的名字currentElementName
java -jar graphwalker-cli-3.4.2.jar offline --start-element app_closed --model example_1.graphml "random(edge_coverage(100))" | jq -r '.currentElementName

在线

路径生成在测试执行期间完成,即运行时。 这意味着GraphWalker需要嵌入您的测试自动化代码中。 这增加了一些复杂性,但优点是

无需处理文件中的中间路径序列。

java:直接在类前加入注解@GraphWalker

1
mvn graphwalker:test

您的测试自动化代码可以直接访问图执行上下文。

测试执行选择Selenium

构建方式:

1
2
3
git clone https://github.com/GraphWalker/graphwalker-project.git
cd graphwalker-project
mvn package -pl graphwalker-cli -am

jar包所在位置

1
graphwalker-cli/target/graphwalker-cli-3.4.2.jar

标准的GraphWalker工作流

General workflow

Model design

保存成文件 Login.graphml.

Tests selection step

GraphWalker支持特殊规则,可帮助您选择一系列操作和状态,您希望通过模型中的测试覆盖这些操作和状态。

Selection rule pattern

eg.random(edge_coverage(100)):随机浏览模型,直到达到所有(100%)边缘

a_star(reached_vertex(v_Browse)):生成通过模型到顶点“v_Browse”的最短路径

路径产生准则详见http://graphwalker.github.io/generators_and_stop_conditions

Tests execution

创建测试代码

第一种方式使用Maven和模型设计步骤中的完整模型创建所需的所有桩代码。

1.创建文件结构如下

1
2
3
%> mkdir -p login/src/main/java/org/myorg/testautomation
%> mkdir -p login/src/main/resources/org/myorg/testautomation
%> mkdir -p login/src/test/java/org/myorg/testautomation

2.移动保存的模型

1
%> mv Login.graphml login/src/main/resources/org/myorg/testautomation

3.保存pom.xml到login文件夹下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>org.myorg</groupId>
<version>3.2.1</version>
<artifactId>example</artifactId>
<name>GraphWalker Test</name>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Set graphwalker.version below to the version you wish to use. We recommend the latest stable version -->
<graphwalker.version>3.4.2</graphwalker.version>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.graphwalker</groupId>
<artifactId>graphwalker-maven-plugin</artifactId>
<version>${graphwalker.version}</version>
<!-- Bind goals to the default lifecycle -->
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>generate-sources</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>org.graphwalker</groupId>
<artifactId>graphwalker-core</artifactId>
<version>${graphwalker.version}</version>
</dependency>
<dependency>
<groupId>org.graphwalker</groupId>
<artifactId>graphwalker-java</artifactId>
<version>${graphwalker.version}</version>
</dependency>
<dependency>
<groupId>org.graphwalker</groupId>
<artifactId>graphwalker-maven-plugin</artifactId>
<version>${graphwalker.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>

</project>

4.切入登录文件夹,然后运行

1
2
%> cd login
%> mvn graphwalker:generate-sources

交互文件可以在文件夹target/generated-sources/graphwalker/.下找到

详细的可以参考腾讯移动品质中心写的https://blog.csdn.net/TMQ1225/article/details/53940828

我心中的大佬啊!!!

Pymodel

Model-based testing 编写一个模型,根据需要生成尽可能多的测试用例,并充当检查是否传递任何案例的oracle

解决的问题

Testing behavior:正在进行的活动可能表现出历史依赖和不确定性

应针对每个场景(或用例)测试许多变体(数据值,交错等)。

常用于Model-based testing的场景: communication protocols, web applications, control systems, user interfaces, …

我们用跟踪表示行为:带参数的动作序列。 通过描述允许哪些跟踪以及禁止哪些跟踪来指定系统

FSMmodel

1

PyModel Graphics program pmg :对于一个FSM模型产生图

The PyModel Tester pmt :从一个模型中产生序列,每一个序列描述一次测试执行,包括期望的测试结果

The PyModel Analyzer pma :通过名为Exploration的过程从模型程序生成FSM

Offline testing: pmt将跟踪保存在测试套件中离线测试

On-the-fly testing: pmt 在生成跟踪时执行跟踪在线测试

模型程序由状态变量,动作函数和启用条件组成

1
2
3
4
5
6
7
8
9
10
11
stack = list() # State
def Push(x): # Push is always enabled
global stack
stack.insert(0,x)
def Pop(): # Pop requires an enabling condition
global stack
result = stack[0]
del stack[0]
return result
def PopEnabled(): # Pop is enabled when the stack is not empty
return stack

终止条件

在这里,我们定义了一个有限域来限制图形的宽度,以及一个状态滤波器来限制其深度。

1
2
3
domains = { Push: {’x’:[0,1]} }
def StateFilter():
return len(stack) < 4

测试生成可以随机选择下一个启用的操作,或使用可选策略选择根据某种度量增加覆盖率的操作

PyModel中包含ActionNameCoverageStateCoverage

我们需要场景控制来限制测试运行到感兴趣的场景,PyModel使用组合,一种多功能技术结合两种或更多模型,形成一种新的模型,即产品

不太理解。。。pymodel好像很久没更新了

M1 ×M2 = P

Contract ×Scenario = Product

shared actions组合同步共享操作。

在TesterHome上有一位大佬用python解析Graph Walker生成的文件并编写测试脚本

[object ProgressEvent]