【AltWalker】模型驱动:轻松实现自动化测试用例的生成和组织执行

目录

模型驱动的自动化测试

优势

操作步骤

什么是AltWalker?

安装AltWalker

检查是否安装了正确的版本

牛刀小试

创建一个测试项目

运行测试

运行效果

在线模型编辑器

VScode扩展

本地部署

包含登录、选择产品、支付、退出登录的模型编写

模型效果

 1、校验模型

2、验证测试代码是否和模型是否匹配

3、运行测试

4、查看测试报告

一个比较复杂的例子

使用 MBT 图示展示(箭头表示操作)

​编辑

结合已有框架使用

总结

资料获取方法


模型驱动的自动化测试

模型驱动的自动化测试(Model-Based Testing, 后文中我们将简称为MBT)是一种软件测试方法,它将系统的行为表示为一个或多个模型,然后从模型中自动生成和执行测试用例。这种方法的核心思想是将测试过程中的重点从手动编写测试用例转移到创建和维护描述系统行为的模型。

优势

基于MBT的测试相比较于普通的测试有以下几大优点:

优点描述
覆盖率模型是对系统行为的抽象表示,可以帮助测试人员更好地理解和分析系统的功能和性能。从而提高测试覆盖率。
测试效率通过从模型中自动生成测试用例,减少手动编写测试用例的工作量,提高测试效率。
可维护性模型驱动的测试用例易于维护,因为当系统发生变化时,只需更新模型,而无需手动修改大量测试用例。
可重用性模型可以在多个测试项目中重用,减少重复工作并提高测试质量。

操作步骤

基于MBT的测试主要有以下几个步骤:

  • 创建模型:
    首先,需要构建一个描述系统行为的模型。这个模型通常采用图形表示,如状态机、Petri网或者流程图等。模型中的顶点表示系统的状态,边表示状态之间的转换。

  • 生成测试用例:
    通过分析模型,可以自动生成测试用例。测试用例生成算法可以根据不同的目标(如覆盖率、路径长度等)来选择。常用的算法有随机测试、覆盖所有路径、覆盖所有边等。

  • 执行测试:
    使用自动生成的测试用例对实际系统进行测试。这一步通常需要一个测试执行引擎,它可以将模型中的操作映射到实际系统中的操作。例如,使用Selenium WebDriver进行Web应用测试。

  • 验证结果:
    比较实际系统的行为与模型的预期行为,以确定系统是否满足需求。如果发现问题,可以更新模型并重新生成测试用例。

下面我们一起来看看在实际业务中使用AltWalker库进行进行基于模型的自动化测试的应用。

什么是AltWalker?

AltWalker是一个基于图模型的自动化测试框架,用于编写、执行和管理基于模型的测试。它主要用于测试复杂系统,如Web应用程序、移动应用程序等。它支持运行用 .NET/C# 和 Python3 编写测试模型用例。

安装AltWalker

在命令行中输入以下命令来安装AltWalker:

pip install altwalker
检查是否安装了正确的版本
$ altwalker --version
AltWalker, version 0.3.1

牛刀小试

创建一个测试项目

创建一个新的文件夹,用于存放我们的测试项目。在该文件夹中,执行以下命令创建MBT

altwalker init -l python test-project

执行这个命令后,将在当前目录生成一个包含模型模板代码的目录test-project,目录结构如下:

# tree
test-project/
├── models/
│   ├── default.json
└── tests/
    ├── __init__.py
    └── test.py
运行测试

只需要执行以下命令,就能够运行default.json中定义的模型,覆盖模型的链路,链路执行时会运行对应在test.py中的代码

$ cd test-project
$ altwalker online tests -m models/default.json "random(edge_coverage(100))"
运行效果

 自己编写图模型

上面只是执行了一个单一的链路Demo,下面我们一起写一个我们自己的模型。

模型编辑器我们可以选择在线的,也可以选择使用 vscode的插件,当然也可以选择自己搭建一个。

在线模型编辑器

我们可以使用在线的模型编辑器来编写模型。

VScode扩展

可以在扩展上搜索AltWalker Model Visualizer
,也可以自己访问链接下载扩展来编辑查看模型。

本地部署

可以参考:https://github.com/altwalker/model-editor

包含登录、选择产品、支付、退出登录的模型编写

点击查看对应模型

模型效果

 1、校验模型

保存这个模型到新创建的项目default.json,然后执行下面的命令检查模型是否存在问题:

altwalker check -m models/default.json "random(never)" 
2、验证测试代码是否和模型是否匹配
altwalker check -m models/default.json "random(never)" 

因为我们还没有编写测试代码,所以会出现下面的报错:

可以看到在上面的报错中给出了建议的代码,我们把它复制到 test.py中。

class PayModel:

    def state_pay(self):
        pass

    def action_init(self):
        pass

    def state_select_product(self):
        pass

    def state_logout(self):
        pass
        ...

3、运行测试

在命令行中执行下面的命令来执行测试:

altwalker online tests -m models/default.json "random(edge_coverage(100))" --report-xml-file report.xml

这将会运行在default.jsontest.py文件中定义的所有测试用例。

4、查看测试报告

在测试执行完成后,AltWalker会生成一个名为report.xml的JUnit格式的测试报告。我们可以使用任何支持JUnit格式的测试报告工具来查看这个报告。

还有其他方式的测试报告提供,可以查看官方文档。

一个比较复杂的例子

如果我们有一个商城需要验证,有登录、用户个人中心,商品首页,商品详情页、支付界面、订单界面等,我们要针对这样的网站做一个自动化,可能会有以下这些场景:

场景
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击第二个商品按钮 -> 商品C详情页面 -> Do:点击付款 -> 付款界面 -> Do:取消付款 -> 订单倒计时界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击第二个商品按钮 -> 商品C详情页面 -> Do:点击付款 -> 付款界面 -> Do:查看订单 -> 历史订单界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击第二个商品按钮 -> 商品C详情页面 -> Do:点击付款 -> 付款界面 -> Do:查看订单 -> 历史订单界面 -> Do:查看订单详情 -> 订单详情界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击第二个商品按钮 -> 商品C详情页面 -> Do:点击用户中心 -> 用户中心界面 -> Do:查看订单 -> 历史订单界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击第二个商品按钮 -> 商品C详情页面 -> Do:点击用户中心 -> 用户中心界面 -> Do:查看订单 -> 历史订单界面 -> Do:查看订单详情 -> 订单详情界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击相似商品B -> 商品B详情页 -> Do:点击购买 -> 付款界面 -> Do:取消付款 -> 订单倒计时界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击相似商品B -> 商品B详情页 -> Do:点击购买 -> 付款界面 -> Do:查看订单 -> 历史订单界面 -> Do:关闭浏览器 -> 浏览器关闭
登录界面 -> Do:输入密码登录 -> 用户首页 -> Do:查看商品A -> A商品详情页 -> Do:点击相似商品B -> 商品B详情页 -> Do:点击购买 -> 付款界面 -> Do:查看订单 -> 历史订单界面 -> Do:查看订单详情 -> 订单详情界面 -> Do:关闭浏览器 -> 浏览器关闭
...
使用 MBT 图示展示(箭头表示操作)

 大家应该都能发现,使用altwalker画出来的图,能非常直观的展示各个页面之间可以进行的操作,并且很好扩展,这非常符合我们做页面自动化的时候所说的POM(Page Object Model)。

这也是altwalker最重要的价值所在:适合的用于测试复杂系统,如Web应用程序、移动应用程序等。

点击查看对应模型

完整的结合 POM使用的方法可以查看官方给出的示例:https://github.com/altwalker/altwalker-examples

结合已有框架使用

如果我们仅仅只想使用模型中的链路组织能力,也可以自己根据编写的模型使用下面这段代码来生成对应的链路,然后组织用例场景,可以用于自动化用例生成。

graph_data = {
    "name": "Default Models",
    "models": [
        {
            "name": "DefaultModel",
            "generator": "random(never)",
            "startElementId": "v0",
            "vertices": [
                {
                    "id": "v0",
                    "name": "登录界面"
        ...
    ]
}
model = graph_data['models'][0]
edges = model['edges']
vertices = model['vertices']
start_vertex_id = model['startElementId']

# 构建图
graph = {}
for edge in edges:
    source = edge['sourceVertexId']
    target = edge['targetVertexId']
    if source not in graph:
        graph[source] = []
    graph[source].append((target, edge['name']))

# 顶点ID到顶点名称的映射
vertex_name_map = {vertex['id']: vertex['name'] for vertex in vertices}


# 深度优先搜索
def dfs(_graph, start_vertex, _path, _visited):
    _visited.add(start_vertex)
    _path.append(vertex_name_map[start_vertex])
    if start_vertex not in _graph:
        print(" -> ".join(_path))
    else:
        for neighbor, action in _graph[start_vertex]:
            if neighbor not in _visited:
                _path.append(f"Do:{action}")
                dfs(_graph, neighbor, _path, _visited)
                _path.pop()
    _path.pop()
    _visited.remove(start_vertex)


# 打印所有可能的链路及其经过的操作,操作前面加上"Do"标记
visited = set()
path = []
dfs(graph, start_vertex_id, path, visited)

总结

通过以上步骤,我们了解了如何使用AltWalker进行模型驱动的自动化测试。AltWalker是一个强大的测试框架,可以帮助我们更高效地编写、执行和管理测试用例。

当然,基于模型的测试也有一些局限性,如模型的准确性和完整性对测试结果影响较大,模型构建和维护可能需要额外的成本等。因此,在实际应用中,需要根据项目的具体需求来决定是否采用基于模型的测试方法。希望本文对你有所帮助!


资料获取方法

【留言777】

各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!

三连之后我会在评论区挨个私信发给你们~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/55762.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SVN代码迁移到Git方法

1.在SVN上新增一个项目 一、点击新建项目 二、创建空白项目 三、填入项目信息 四、myProject项目模板创建成功 2.将代码提交到Git 一、新建一个文件夹myProject,将从SVN下载过来的代码复制一份拷贝到该文件夹下,注意:不要把.SVN文件拷…

2023年第四届“华数杯”数学建模思路 - 案例:感知机原理剖析及实现

# 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法,其原理可以看下图: 比如说我们有一个坐标轴(图中的…

【python爬虫】获取某一个网址下面抓取所有的a 超链接下面的内容

import requests as rq from bs4 import BeautifulSoup as bs import re# rooturl是传的是我需要查询和抓取的一个网址,可以是html js 等 def gethtml(rooturl, encoding"utf-8"):#默认解码方式utf-8response rq.get(rooturl)response.encoding encodin…

解决Mysql报错2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)

1.找到mysql文件夹,将my,ini文件放入bin文件夹 2.管理员模式打开cmd 3.输入netstat -ano查看端口占用情况,这里我已经开启mysql应用,所以会有3306,如果没有开启是不会有的 4.输入sc delete mysql,删除mysql服务 5.将…

redis的安装和配置

一、nosql 二、redis的安装和配置 redis的安装: redis常见配置: 配置文件redis.conf

自动化测试中的数据驱动

DDT 当测试框架是unittest时,可以使用ddt。ddt 这个类装饰器必须装饰在 TestCase 的子类上,TestCase 是 unittest 框架中的一个基类,它实现了 Test Runner 驱动测试运行所需的接口(interface)。 DDT 的使用步骤如下&…

软件定时器

Q: 什么是定时器? A: 其实在单片机的学习中,已经接触过无数次定时器了,所谓定时器,简单可以理解为闹钟,到达指定一段时间后,就会响铃。 STM32 芯片自带硬件定时器,精度较高,达到定时…

IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传

IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传 删除本地Git仓库 创建本地Git仓库 关联其他仓库并上传 要在IntelliJ IDEA中删除本地Git仓库并创建新的本地Git仓库,以及关联其他仓库并上传,请按照以下步骤进行操作: 删除本地G…

openSUSE安装虚拟化 qemu kvm

1) 第一种:图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装,是不是很简单呢 2)第二种: 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少,可以搜索centos7 安装qemu kvm的教程,然后…

NLP From Scratch: 生成名称与字符级RNN

NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在<cite>第一个教程< / intermediate / char_rnn_classification_tutorial ></cite> 中&#xff0c;我们使用了 RNN 将名称分类为来源语言。 这次&#xff…

MP4如何转MP3?教你简单好用的转换方法

怎么将MP4格式的视频转换成MP3音频呢&#xff1f;相信大家在看短视频的时候&#xff0c;有的视频背景音乐非常好听&#xff0c;我们又搜不到这个音频的源声在哪里&#xff0c;这时候我们就可以将这段视频直接转换成MP3格式音频&#xff0c;用来当做铃声或者是闹钟非常合适&…

【css】解决元素浮动溢出问题

如果一个元素比包含它的元素高&#xff0c;并且它是浮动的&#xff0c;它将“溢出”到其容器之外&#xff1a;然后可以向包含元素添加 overflow: auto;&#xff0c;来解决此问题&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head> <style>…

解决有道云笔记自动更新问题 关闭有道云笔记自动更新 有道云笔记自动升级v7.2.8

解决有道云笔记自动更新问题 关闭有道云笔记自动更新 有道云笔记自动升级v7.2.8 一、背景 最近使用有道云笔记时&#xff0c;遇到bug问题&#xff1a; 打不开加密的笔记&#xff0c;发现是最新版本v7.2.8&#xff0c;切换到v7.2.7后&#xff0c;一切恢复正常。 在使用有道云笔…

机器学习深度学习——数值稳定性和模型化参数(详细数学推导)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——Dropout &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 这一部…

MySQL 极速安装使用与卸载版

mysql-5.6.51 极速安装使用与卸载版 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&#xff0c;进入bin目录&#xff0c;输入mysqld --install&#xff0c;进行安装 这样&#xff…

【LeetCode】88. 合并两个有序数组

这道题我总共想了三种解法。 1.将nums2中的元素依次放入nums1有效元素的后面&#xff0c;再总体进行排序。 import java.util.*; class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j 0;for(int i m;i<mn;i){nums1[i] nums2[j];j;}Arrays…

时间复杂度为O(n2)的三种简单排序算法

1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少少一个元素移动到它应该在的位置&#xff0c;重复n次&#xff0c;就完成了n个数据的排序工作。 /*** …

华为OD机试真题 JavaScript 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

【css】nth-child选择器实现表格的斑马纹效果

nth-child() 选择器可以实现为所有偶数&#xff08;或奇数&#xff09;的表格行添加css样式&#xff0c;even&#xff1a;偶数&#xff0c;odd&#xff1a;奇数。 代码&#xff1a; <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…

算法与数据结构(五)--树【1】树与二叉树是什么

一.树的定义 树是一个具有层次结构的集合&#xff0c;是由一个有限集和集合上定义的一种层次结构关系构成的。不同于线性表&#xff0c;树并不是线性的&#xff0c;而是有分支的。 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集。 若n0&…