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

这篇具有很好参考价值的文章主要介绍了【AltWalker】模型驱动:轻松实现自动化测试用例的自动生成和组织执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型驱动的自动化测试

模型驱动的自动化测试(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))"
运行效果

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

自己编写图模型

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

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

在线模型编辑器

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

VScode扩展

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

本地部署

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

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

点击查看对应模型
{
    "name": "Pay Models",
    "models": [
      {
        "name": "PayModel",
        "generator": "random(edge_coverage(100) && vertex_coverage(100))",
        "startElementId": "v_init",
        "vertices": [
          {
            "id": "v_init",
            "name": "start_vertex"
          },
          {
            "id": "v_login",
            "name": "state_login"
          },
          {
            "id": "v_select_product",
            "name": "state_select_product"
          },
          {
            "id": "v_pay",
            "name": "state_pay"
          },
          {
            "id": "v_logout",
            "name": "state_logout"
          }
        ],
        "edges": [
          {
            "id": "e_init",
            "name": "action_init",
            "sourceVertexId": "v_init",
            "targetVertexId": "v_login"
          },
          {
            "id": "e_login",
            "name": "action_login",
            "sourceVertexId": "v_login",
            "targetVertexId": "v_select_product"
          },
          {
            "id": "e_select_product",
            "name": "action_select_product",
            "sourceVertexId": "v_select_product",
            "targetVertexId": "v_pay"
          },
          {
            "id": "e_pay",
            "name": "action_pay",
            "sourceVertexId": "v_pay",
            "targetVertexId": "v_logout"
          },
          {
            "id": "e_logout",
            "name": "action_logout",
            "sourceVertexId": "v_logout",
            "targetVertexId": "v_init"
          }
        ]
      }
    ]
  }
模型效果

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

1、校验模型

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

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

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

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

可以看到在上面的报错中给出了建议的代码,我们把它复制到 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】模型驱动:轻松实现自动化测试用例的自动生成和组织执行

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

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

点击查看对应模型
{
    "name": "Default Models",
    "models": [
        {
            "name": "DefaultModel",
            "generator": "random(never)",
            "startElementId": "v0",
            "vertices": [
                {
                    "id": "v0",
                    "name": "登录界面"
                },
                {
                    "id": "v1",
                    "name": "用户首页"
                },
                {
                    "id": "v2",
                    "name": "浏览器关闭"
                },
                {
                    "id": "v3",
                    "name": "A商品详情页"
                },
                {
                    "id": "v6",
                    "name": "商品C详情页面"
                },
                {
                    "id": "v7",
                    "name": "付款界面"
                },
                {
                    "id": "v8",
                    "name": "付款成功界面"
                },
                {
                    "id": "v9",
                    "name": "订单倒计时界面"
                },
                {
                    "id": "v10",
                    "name": "用户中心界面"
                },
                {
                    "id": "v11",
                    "name": "商品B详情页"
                },
                {
                    "id": "v4",
                    "name": "历史订单界面"
                },
                {
                    "id": "v5",
                    "name": "订单详情界面"
                }
            ],
            "edges": [
                {
                    "id": "e0",
                    "name": "输入密码登录",
                    "sourceVertexId": "v0",
                    "targetVertexId": "v1"
                },
                {
                    "id": "e1",
                    "name": "关闭浏览器",
                    "sourceVertexId": "v0",
                    "targetVertexId": "v2"
                },
                {
                    "id": "e2",
                    "name": "关闭浏览器",
                    "sourceVertexId": "v1",
                    "targetVertexId": "v2"
                },
                {
                    "id": "e3",
                    "name": "查看商品A",
                    "sourceVertexId": "v1",
                    "targetVertexId": "v3"
                },
                {
                    "id": "e5",
                    "name": "点击第二个商品按钮",
                    "sourceVertexId": "v3",
                    "targetVertexId": "v6"
                },
                {
                    "id": "e7",
                    "name": "点击付款",
                    "sourceVertexId": "v6",
                    "targetVertexId": "v7"
                },
                {
                    "id": "e8",
                    "name": "退出登录",
                    "sourceVertexId": "v8",
                    "targetVertexId": "v0"
                },
                {
                    "id": "e9",
                    "name": "e9",
                    "sourceVertexId": "v3",
                    "targetVertexId": "v8"
                },
                {
                    "id": "e10",
                    "name": "付款成功",
                    "sourceVertexId": "v7",
                    "targetVertexId": "v8"
                },
                {
                    "id": "e11",
                    "name": "取消付款",
                    "sourceVertexId": "v7",
                    "targetVertexId": "v9"
                },
                {
                    "id": "e12",
                    "name": "点击用户中心",
                    "sourceVertexId": "v6",
                    "targetVertexId": "v10"
                },
                {
                    "id": "e13",
                    "name": "点击购买",
                    "sourceVertexId": "v11",
                    "targetVertexId": "v7"
                },
                {
                    "id": "e14",
                    "name": "点击相似商品B",
                    "sourceVertexId": "v3",
                    "targetVertexId": "v11"
                },
                {
                    "id": "e17",
                    "name": "关闭浏览器",
                    "sourceVertexId": "v9",
                    "targetVertexId": "v2"
                },
                {
                    "id": "e18",
                    "sourceVertexId": "v10",
                    "targetVertexId": "v4",
                    "name": "查看订单"
                },
                {
                    "id": "e19",
                    "name": "点击首页按钮",
                    "sourceVertexId": "v3",
                    "targetVertexId": "v1"
                },
                {
                    "id": "e20",
                    "name": "点击首页",
                    "sourceVertexId": "v6",
                    "targetVertexId": "v1"
                },
                {
                    "id": "e21",
                    "name": "点击用户中心",
                    "sourceVertexId": "v10",
                    "targetVertexId": "v1"
                },
                {
                    "id": "e4",
                    "name": "刷新浏览器",
                    "sourceVertexId": "v6",
                    "targetVertexId": "v6"
                },
                {
                    "id": "e6",
                    "name": "查看订单",
                    "sourceVertexId": "v7",
                    "targetVertexId": "v4"
                },
                {
                    "id": "e15",
                    "name": "关闭浏览器",
                    "sourceVertexId": "v4",
                    "targetVertexId": "v2"
                },
                {
                    "id": "e16",
                    "name": "查看订单详情",
                    "sourceVertexId": "v4",
                    "targetVertexId": "v5"
                },
                {
                    "id": "e22",
                    "name": "关闭浏览器",
                    "sourceVertexId": "v5",
                    "targetVertexId": "v2"
                }
            ],
            "actions": [
                "fasf;fdsaf;"
            ]
        }
    ]
}

完整的结合 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是一个强大的测试框架,可以帮助我们更高效地编写、执行和管理测试用例。

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

到了这里,关于【AltWalker】模型驱动:轻松实现自动化测试用例的自动生成和组织执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用可视化docker浏览器,轻松实现分布式web自动化

    顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以实现可视化,同时可以对浏览器进行相关的操作。 首先我们先了解什么是有头浏览器和无头浏览器的区别

    2024年02月14日
    浏览(44)
  • 自动化测试:yaml结合ddt实现数据驱动!

    在python+unittest+selenium+ddt的框架中,数据驱动常见有以下几种方式实现: Csv/txt Excel YAML 本文主要给大家介绍测试数据存储在YAML文件中的使用场景。首先先来简单介绍一下YAML。 一种标记语言类似YAML,它实质上是一种通用的数据串行化格式,由于其可读性高,用来表达数据序列

    2024年02月07日
    浏览(42)
  • Python Selenium实现自动化测试及Chrome驱动使用!

    本文将介绍如何使用Python Selenium库实现自动化测试,并详细记录了Chrome驱动的使用方法。 通过本文的指导,读者将能够快速上手使用Python Selenium进行自动化测试。 并了解如何配置和使用Chrome驱动来实现更高效的自动化测试。 一、Python Selenium简介 Python Selenium是一个用于Web应用

    2024年03月10日
    浏览(60)
  • Python Selenium实现自动化测试及Chrome驱动使用

    本文将介绍如何使用 Python   Selenium 库实现 自动化测试 ,并详细 记录 了Chrome驱动的使用方法。 通过本文的指导,读者将能够快速上手使用Python Selenium进行自动化测试。 并了解如何配置和使用Chrome驱动来实现更高效的自动化测试。 一、Python Selenium简介 Python Selenium是一个用于

    2024年02月03日
    浏览(54)
  • 自动化的驱动力,工控机助您实现智能生产!

    “智能工厂建设如火如荼,部分成果已经落地,在大规模资金投入的市场催化下,海尔、海信等制造企业通过智能工厂手段推进生产效率成倍增长的新闻层出不穷。在工业4.0时代,“中国制造2025”战略中,智能工厂构建都是其中不可或缺的部分,处于核心地位,大数据、AI、

    2024年02月11日
    浏览(39)
  • 基于 python 的接口自动化测试,让你轻松掌握接口自动化

    目录 目录 一、简介                ​编辑二、引言 三、环境准备 四、测试接口准备 接口信息 五、编写接口测试 六、优化 封装接口调用   本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势; 然后简单讨论了一下接口测试框架的要点; 最后介绍了一下

    2023年04月19日
    浏览(66)
  • Postman实战:轻松搞定接口自动化测试

    随着移动互联网的发展,接口自动化测试已经成为软件测试领域中不可或缺的一部分。而作为最流行的API开发工具之一,Postman凭借其简单易用、功能强大的特点赢得了越来越多开发者和测试人员的青睐。 想要掌握Postman的接口自动化测试技能,只需要花费少量时间学习即可轻

    2024年02月15日
    浏览(42)
  • iOS系统下轻松构建自动化数据收集流程

    在当今信息爆炸的时代,我们经常需要从各种渠道获取大量的数据。然而,手动收集这些数据不仅耗费时间和精力,还容易出错。幸运的是,在现代科技发展中有两个强大工具可以帮助我们解决这一问题——Python编程语言和iOS设备上预装的Shortcuts App。 首先让我们来了解一下

    2024年02月10日
    浏览(29)
  • Python+selenium,轻松搭建 Web 自动化测试框架

    在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。 「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的业务要求,只能被企业逐步裁员淘汰。 「自动化测试

    2024年02月10日
    浏览(97)
  • 如何使用Selenium IDE浏览器插件轻松完成脚本录制,轻松搞定自动化测试!

    Selenium IDE可以用来调式Selenium脚本,支持将浏览器的Web网页操作导出为不同编程语言的脚本。 创建项目之后可以录制或回放已录制的网页操作情况,特别是对一些开发测试人员提供了相当大的便利。 目前,该Selenium IDE插件可以支持Edge/火狐以及谷歌浏览器的使用,其他浏览器

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包