5.工具使用介绍
5.1 GraphWalker用途
GraphWalker提供3种工作方式:
5.1.1作为第三方库,可被java测试程序直接调用
MBT中测试设计的目的是描述被测系统的预期行为。设计的结果看起来像一个具有许多边(也就是箭头,弧或过渡)和顶点(又称节点或状态)的模型,以及它们如何相互作用。
模型会提醒您流行的测试状态转换图或有限状态图。边表示与SUT的动作,顶点表示应该测试的SUT的状态。
完整的模型可能如下所示:
在进入测试编码部分之前,我们需要根据GraphWalker语法规则验证模型是否正确。
要验证模型,我们使用GraphWalker CLI对其进行测试:
java -jar graphwalker.jar offline -m Login.graphml "random(edge_coverage(100))“
生成测试序列。这是一个离线生成的测试。不会生成错误或其他警告消息,这意味着模型是正确的。
GraphWalker支持特殊规则,可帮助您选择一系列操作和状态,您希望通过模型中的测试覆盖这些操作和状态。
这些规则由两部分组成 - “如何掩盖”和“涵盖什么”。该模式如下所示。
GW有很多方法可以覆盖你的模型,既详尽又有效。
可以在生成器和停止条件中看到的路径生成方法的完整列表。选择测试选择标准后,可以选择测试路径生成类型。
路径生成是在执行测试运行时期间完成的。这意味着GraphWalker需要嵌入到您的测试自动化代码中。这增加了一点复杂性,但优点是:
无需处理文件中的中间路径序列。
如果测试自动化是用Java编写的,那非常简单。用一个Java类来注释@GraphWalker。
该类表示图形和该类中的方法表示该图形中的元素。使用maven,使用GraphWalker运行测试的过程如下:
mvn graphwalker:test
GraphWalker将在路径生成期间调用该类中的方法。
测试自动化代码可以直接访问图形执行上下文。
当GraphWalker生成路径时,它会在执行上下文中保留有关生成的所有数据。测试可以查询模型中的数据,甚至可以更改模型中的数据。
测试路径生成之后的下一步应该是测试执行。
创建测试代码
当前的测试路径执行将以两种方式完成 - 逐步测试创建或通过maven目标触发。
第一种方式如下。
使用Maven和模型设计步骤中的完整模型创建所需的所有存根代码。
1.创建文件夹结构:
%> 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.移动保存的模型:
%> mv Login.graphml login/src/main/resources/org/myorg/testautomation
3.复制并粘贴以下内容并将其保存为文件夹中的pom.xml 。
<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.运行以下命令:
%> cd login
%> mvn graphwalker:generate-sources
最后一个命令将在Login.graphml中自动生成模型的接口。该接口位于target / generated-sources / graphwalker /文件夹中。它将包含以下文件和文件夹:
5.实现接口
如果是web应用,可以使用Selenium Web Drive
如果是桌面应用,可以使用Sikuli
如果是app,可以使用Appium
6.运行测试
mvn test
Java测试程序调用GraphWalker时,可以直接继承GraphWalkerorg.graphwalker.core.machine.ExecutionContext类。该类成员函数,可以配置在guard、action中调用。在ExecutionContext类初始化时中,以将所有类成员函数转化成了javascript函数调用,存在Context的js引擎中。函数名完全一致。作用是使原本的js引擎可以调用java代码。
它的执行过程类似下面步骤:
1.创建start节点
2.创建图形或模型。
3.向模型中添加边。
4.这个边命名为:edge1
5.向这条边添加守卫guard。 guard是条件表达式,这个guard将执行类成员函数isTrue()得到返回值。如果返回值为true,则边可以被访问以执行,否则不执行。
6.设置这条边的起点。这里设置的起点为start顶点。
7.将start顶点命名为:vertex1。
8.创建一个新的顶点,并将其设置为edge1这条边的目标顶点。
9.刚建立的顶点命名为:vertex2。
10.为edge1这条边添加一个操作Action。该操作是在遍历到edge1边时执行的JavaScript代码,调用函数myAction。
11.构建模型(使其不可变),并将其提供给Context。
12.创建一个路径生成器,并指定停止条件,并将其提供给Context。
13.将start顶点设置为模型执行的起点。
14.创建一个GraphWalker的执行器machine,把Context传递给machine
15.只要路径生成器的停止条件未满足,hasNext将返回true。
16.执行模型的下一步。
5.1.2作为可执行程序,以offline模式,加载model,直接运行
作为可执行程序,以offline模式,加载model,直接运行。
offline模式 java -jar graphwalker-cli-3.4.2.jar offline
5.1.3作为可执行程序,以online模式,作为service,提供服务
online模式 websocket服务
HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
WebSocket 就是这样发明的。WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
如:在端口9999上启动GraphWalker Websocket服务:
java -jar graphwalker-cli-3.4.2.jar online --port 9999 --service WEBSOCKET
模型必须对GraphWalker模型使用JSON表示
5.2常用命令:
下面我们简单介绍一下GraphWalker工具的常见使用命令:
5.2.1 –debug, -d命令
Sets the log level: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL. Default: OFF
5.2.2 –help, -h命令
Prints help text
5.2.3 –version -v命令
Prints the version of GraphWalker
5.2.4 –json, -j命令
返回数据格式为json,默认true
5.2.5 –model, -m命令
模型文件,一个 graphml 文件,后面跟着路径生成器及结束条件。这个选项可以出现多次。这个选线在RESTFUL模式(-s RESTFUL)下有效、在websocket模式(-s WEBSOCKET)下无效。
5.2.6–port, -p命令
GraphWalker作为service 的端口号,默认8887
5.2.7–service, -s命令
选则GraphWalker作为service的启动模式. WEBSOCKET [默认], 或者 RESTFUL
默认WEBSOCKET。当 Websocket 模式被选择了 -m 选项无效。
5.2.8 –start-element, -e命令
选择元素作为开始元素(第一个模型中)。默认start顶点
5.2.9–unvisited, -u命令
加上这个选项将打印出模型中未访问到的元素,默认 false.
5.2.10 –verbose, -o命令
打印更多细节,默认false
5.3 Restful和WebSocket服务的区别
5.3.1 Restful
只能服务1个客户端。
该服务当时只处理一个会话。模型可以使用REST加载API调用上传,也可以在服务启动时的命令行中加载。
命令行举例:
启动 GraphWalker REST service 在默认端口 8887, debug level设置为 ALL.
java -jar graphwalker-cli-3.4.2.jar –debug all online –service RESTFUL
启动GraphWalker REST在端口9999 不进行debug
java -jar graphwalker-cli-3.4.2.jar online –service RESTFUL –port 9999
启动GraphWalker REST, 在默认端口 8887, debug level设置为full, 服务启动是加载模型ShoppingCart.graphml
java -jar graphwalker-cli-3.4.2.jar -d all online -s RESTFUL -m ShoppingCart.graphml “random(edge_coverage(100))”
5.3.2 Web Socket
可以同时为多个客户端服务
该服务将处理多个连接。每个连接都将有一个唯一的会话。必须使用Websocket start API调用来上传模型。它不会在命令行上加载任何模型
命令行举例:
启动 GraphWalker Websocket service在默认端口8887 and debug level 设置为 ALL.
java -jar graphwalker-cli-3.4.2.jar –debug all online
启动GraphWalker Websocket service 在端口9999 with不进行debug.
java -jar graphwalker-cli-3.4.2.jar online –port 9999 –service WEBSOCKET
5.4 REST API接口
5.4.1 load
Rest调用load以JASON格式上载模型,并使用新测试重置GraphWalker。
POST Request:
http://service-host:8887/graphwalker/load + json graph file
Response:
请求成功,返回ok.
{
“result”:”ok”
}
5.4.2 hasNext
如果有更多的元素要获取,Rest将调用hasNext查询服务。如果是,则尚未达到停止条件的满足。
GET Request:
http://service-host:8887/graphwalker/hasNext
Response:
如果请求成功,“result”将是“ok”。如果有更多的元素要获得,hasNext将是true。
{
“result”:”ok”
“hasnext”:”true”
}
5.4.3 getNext
getNext用于从路径生成中获取下一个元素。 GraphWalker将给定路径生成器,计算下一个元素应该是什么,并在模型的执行中向前一步。 在响应中返回元素名称。
GET Request:
http://service-host:8887/graphwalker/getNext
Response:
如果请求成功,“result”为“ok””. currentElement 返回元素名
{
“result”:”ok”
“currentElementName”:””
}
5.4.4 getData
getData用于询问GraphWalker当前模型的当前各个变量的数据值。
POST Request:
http://service-host:8887/graphwalker/getData
Response:
如果请求成功,“result”为“ok””. data 中返回各个变量的当前值。
{
“result”:”ok”
“data”:
{
“num_of_books”:”0”,
“MAX_BOOKS”:”5”
}
}
5.4.5 setData
用来设置当前模型中变量值
POST Request:
http://service-host:8887/graphwalker/setData/
Response:
如果请求成功,“result”为“ok”.
{
“result”:”ok”
“hasnext”:”true”
}
5.4.6 restart
模型重置为其初始状态。
PUT Request
http://service-host:8887/graphwalker/restart
Response
如果请求成功,“result”为“ok”.
{
“result”:”ok”
“hasnext”:”true”
}
5.4.7 fail
会终止测试会话的路径继续生成
PUT Request
http://service-host:8887/graphwalker/fail/String to explain the failure
Response{
“result”:””
}
5.4.8 getStatistics
调用getStatistics将获取会话的当前统计信息
POST Request
http://service-host:8887/graphwalker/getStatistics
Response
如果请求成功,“result”为“ok”.
{
“edgeCoverage”:
“result”:
“totalNumberOfEdges”:
“totalNumberOfUnvisitedEdge”:
“totalNumberOfUnvisitedVertices”:
“totalNumberOfVertices ”:
“totalNumberOfVisitedEdge”:
“totalNumberOfVisitedVertices”:
}
5.5 Web Socket API接口
5.5.1 start
Websocket消息命令start用于加载模型并启动服务。模型必须对GraphWalker模型使用JSON格式。
Request
加载和启动模型的请求示例, 模型在gw3标签内:
{
“command”:”start”,
“gw3”:{
“name”:”a small test moel”,
“models”:[
{
“name”:”small model”,
“generator”:”random(edge_coverage(100))”,
“startElementId”:”e0”,
“vertices”:[
],
“edges”:[
]
}
]
}
1
}
Response
如果请求成功 “success” 为 “true”.
{
“command”:”start”,
“success”:”boolean”,
“msg”:”If success is false,an message will returned”
}
5.5.2 hasNext
Websocket消息命令hasNext用于询问GraphWalker是否有任何元素在模型中执行。如果满足当前模型的所有停止条件,则对hasNext属性的响应将返回false。
Request:
{
“command”:”hasNext”
}
Response
如果请求成功 “success” 为 “true”.
{
“success”:”true”
“hasnext”:<If there are more elements to be executed,true will be returned .Otherwise false>
“command”:”hasNext”
}
5.5.3 getNext
Websocket消息命令getNext用于从路径生成中获取下一个元素。 GraphWalker将给定路径生成器,计算下一个元素应该是什么,并在模型的执行中向前进一步。 在响应中返回元素名称。GET Request:
Request
{
“command”:”getNext”
}
Response
如果请求成功 “success” 为 “true”. {
“elementId”:”<>”,
“modelId”:”<>”,
“success”:”true”,
“name”:”<>”
“command”:”getNext”
}
5.5.4 getData
Websocket消息命令getData用于询问GraphWalker当前模型的当前各个变量的数据值
Request
{
“command”:”getData”
}
Response
如果请求成功 “success” 为 “true”.
{
“data”:{
“x”:”1”,
“y”:”2”
},
“success”:true,
“command”:”getData”
}
5.5.5 visitedElement
每当getNext发生时, GraphWalker将发送visitedElement消息给client。此消息中的信息表示了模型遍历的进度。
Message
{
“elementId”:”<>”
“visitedCount”:”<>”
“stopConditionFulfillment”:””
“data”:{
“x”:”1”,
“y”:”2”
},
“comment”:”visitedElement”
}
5.6 yEd的使用
GraphWalker支持.graphml格式的文件,
graphml一种图形描述语言,内容为xml格式。
以graphml为后缀的文件,可以用"yEd Graph Editor"打开 。
工作界面如图所示:
---------------------
作者:KiroScarlet
来源:CSDN
原文:https://blog.csdn.net/m0_37657841/article/details/90757271