UI 自动化中的分层设计

以前的设计

在过去 UI 自动化测试领域有一个规范的设计模式是 page object 模式。 意思是测试用例不会直接定位页面元素, 而是把每一个页面封装成一个类。 在这个类中封装页面元素。 然后测试用例调用 page 类来操作页面元素完成测试用例。如下图:

以前的设计

在过去 UI 自动化测试领域有一个规范的设计模式是 page object 模式。 意思是测试用例不会直接定位页面元素, 而是把每一个页面封装成一个类。 在这个类中封装页面元素。 然后测试用例调用 page 类来操作页面元素完成测试用例。如下图:

但这个模式已经诞生了差不多 20 年了。 它是以当时的前端开发模式为基础进行规定的。 而 20 年间前端技术和研发模式已经发生了很大的变化,这个模式已经不再适用当前的 UI 自动化项目了。所以我在我的项目用将上面的模式做了一些改良

改良后的设计

组件层

当下前端框架都有组件库的概念。 目的是封装通用的页面元素来让各个页面统一调用。 避免了重复开发的问题并且保持风格统一, 比如我之前在写前端项目的时候也会封装组件库, 然后在各个页面调用组件库中的组件。 我拿我之前写的前端项目举例:

如上图中在一个前端项目中, 会专门有一个叫 component 的目录(第一张图),该目录里会封装常用的页面组件,比如 button,input,dropdown,link 等。 而每个组件都会编写独立的逻辑代码和 css 代码(第二张图)。 最后在页面中通过调用组件库的组件来完成页面逻辑(第三张图, 页面中调用了第二张图里展示的 LinkButton)。 所以我们在产品界面中才会发现很多控件长得都一样, 连属性都一样, 比如 class 里的值都是一样的。 这是因为他们其实是完完全全的同一个组件。 PS:在 CSS 中比较常用 class 来定位控件。 所以我们在控件中一般能看到各种 class 定义。 这就是现代前端项目的开发模式, 我们总能听到前端研发工程师们说的组件化,其实就是这个了。 这也是为什么我们会专门抽象出一层组件层的原因。 如果研发在迭代过程中修改了组件库, 那么会影响所有的页面。 一般这对 UI 自动化来说是一个很大的打击。 所以为了避免这种情况出现,同时为了简化页面定位成本。 所以 UI 自动化项目中也要对应的封装出一个组件层来专门做元素的定位和操作。 比如我之前曾经在产品中见过这样的情况, 之前我们的 button 都是下面这个样子的。

<button> 确定 </button>

但是突然研发修改了 button 组件库。 于是所有的 button 就变成了下面这个样子:

<button><span> 确定 </span>
</button>

在修改之前一切很美好, 我们只需要用 bytext 方法或者用一个 xpath: //button[text()='确定'] 就能很方便的找到这个 button 并点击. 但某一天研发的组件库变了, button 不在有文案了, 而是在 button 里加了个 span 的子元素放置文案。 于是在 UI 自动化项目中以前所有页面的所有 button 定位和操作都挂了, 都需要改一遍。所以我们一般在 UI 自动化中通过增加一个组件层来解决这个问题。 如下图:

如上图, 在我们的测试代码中专门有一个名字叫 component 的目录, 里面根据控件的类型划分了很多文件, 每个文件里定义着这个类型的控件常用的定位和操作方式。 第二张图中我们看到的是 input 这个组件在产品中通用的逻辑。 比如拿 form_upload 这个控件来解释, 在产品中绝大部分上传文件的控件是由 input 组件来封装的。 点击上传操作其实触发的就是往一个属性 type=file 的 input 元素写入文件路径。 所以其实所有页面的上传操作都可以调用这个逻辑完成。 特别需要注意一点, 组件层不仅仅是封装元素的定位逻辑的, 也会封装一些常用操作。 还是拿上传控件来说, 用户在前端是要点击上传这个 button 后跳出一个文件选择框来完成上传操作的。 但是这个逻辑在 UI 自动化中是不可行的, 因为跳出这个文件选择框并不是浏览器的行为,而是当前操作系统的行为。 所以这个框实际上不受 webdriver 控制,并且不同的操作系统下这个框的样子也是不一样的。 所以在 UI 自动化中,我们只能通过给这个 input 元素直接写入上传的文件路径来触发文件操作。 但是这个 input 元素的 css 代码中设置了 style.display=none, 把这个 input 元素设置为了隐藏, 而 webdriver 是没办法与隐藏元素交互的。 所以我们需要先通过嵌入一段 js 代码, 把这个 input 修改成可见元素才能完成剩下的操作。 通过这个案例我想说明在组件层除了封装元素的定位方式外, 也会封装元素的操作方式。

原则上,我们所有的页面元素的交互都需要通过调用组件层的函数来完成, 一个是加快元素定位的速度 -- 调用者不再需要自己定位了, 只需要调用组件层的方法,传递参数即可。 第二个是通过统一调用, 一旦后续前端组件库发生变化,导致元素定位方式也要改变。 我们只需要修改组件层非常少量的代码即可。 而不是研发动了一行代码, 测试项目这边需要成片的逻辑修改。

页面层

页面层与老式的 page object 模式中的页面层基本类似。 一个页面封装成一个 class, 在这个 class 里定义所有的元素和对应的操作。 只不过这类对元素的定位工作基本都是通过调用组件层的能力来完成的。 如下图:


可以看到,一个页面上的所有元素都是定义在这个 class 里面的。 并且这些元素的定位都是通过组件层的方法来完成的。 我们在文件开头就会引入这些组件库来帮助页面层来完成元素的定位于操作。 同时建议页面层文件不仅仅是封装单个元素的定位, 也可以封装页面里常用的操作。 我们推荐这种封装方式, 我们应该尽量避免在 case 中直接调用页面元素操作。 原因有二

  • 代码复用, 大量 case 其实都需要调用相同的逻辑,封装成可复用的代码可以减少 case 编写成本
  • 当页面元素出现变化,比如增删元素的时候。 可只修改封装的逻辑, 而不必大量修改 case。

组件层封装基本控件,应对前端组件库的变化, 而页面层就是对产品界面进行封装, 应对的是页面逻辑发生的变动

业务逻辑层

在我们的代码里, 每个模块都有 service 文件, 这个文件就是封装的业务逻辑的文件。 我们在页面层上封装的逻辑都是单页面逻辑。 而在测试中我们往往要执行一个很复杂的业务流程。 为了执行这样一个业务流程我们跳转了很多个页面。 所以我们有必要单独封装这样一层来把业务逻辑进行封装。 这里需要提一下, 业务逻辑层相当于页面层的上层封装。 封装了完成一个业务逻辑的所有操作,比如我们假设创建一个工作流, 需要先填写基本配置, 然后跳转到高级配置页面继续填写, 填写玩后点击确定显示创建成功, 到了这里还没结束,还需要等待这个工作流程执行到某个状态,比如运行成功状态。 这里面需要跳转多个页面,甚至还需要给定一个超时时间并轮询工作流程的状态。 为什么要封装这么一层呢, 因为必然有非常多的 case 去完成这样一个流程。

需要注意的是, 我们每个模块都需要封装自己的业务逻辑层。 因为一个产品里必然有非常多的模块并且这些模块之间是有依赖关系的。 比如我在之前讲大数据的时候介绍过, 一个大数据平台的产品中做什么事都需要先把外部数据源中的数据同步到本系统里对吧, 所以数据中心的测试人员就的把自己模块的业务逻辑封装一下给其他模块的人用。 同样的,模型中心模块的人要测试得先有个模型对吧, 那用来建模的建模中心就得把自己的业务逻辑封装好了给其他人用。 在 UI 自动化中往往就是这样的,各个模块之间需要互相配合,互相调用。 因为就是有很多 case 是横跨多个模块,链路非常长非常复杂的。

用例层

用例层就没啥好说的, 就是写 case 而已。 只不过在我的这个设计里, 用例层很轻, 大部分逻辑都已经被上面的 3 层做完了。 用例层大多数时候再调用业务逻辑层, 少数情况调用页面层。 所以 case 层很轻,代码很少。 没什么可以特别强调的。

总结

就写到这吧, 最近又开始写 UI 自动化所以有些感受, 组织了一篇帖子跟大家探讨一下。

更多内容欢迎来到我的知识星球:
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具变量】巡回法庭DID数据(2000-2022)(附部分stata代码)

数据来源&#xff1a; 时间跨度&#xff1a;2000-2022 数据范围&#xff1a;全国 数据指标&#xff1a; 参考刘中华和黄斯琪等学者的做法&#xff0c;将当年企业总部所在省份被巡回法庭覆盖赋值为1&#xff0c;否则为0。数据提供两个版本excel版本和dta版本&#xff0c;还附…

【Emgu CV教程】10.14、ConnectedComponents()函数计算连通区域

文章目录 一、概念1.什么叫图像的连通区域2.提取连通区域的函数 二、简单应用1.原始素材2.代码3.运行结果4.连通区域上色 一、概念 1.什么叫图像的连通区域 图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域&#xff0c;连通域分析是指在图像中寻找出彼此互…

云工场上市在即:资产负债比率飙升,巨额分红3000万远超净利润

《港湾商业观察》施子夫 今年5月底&#xff0c;冲刺港交所上市的云工场科技控股有限公司&#xff08;以下简称&#xff0c;云工场&#xff09;通过聆讯。 6月5日&#xff0c;云工场宣布将于2024年6月5日至6月11日进行招股&#xff0c;预计在6月14日上市。公司计划发售1.15亿股…

【UE5.1 角色练习】11-坐骑——Part1(控制大象移动)

前言 在上一篇&#xff08;【UE5.1 角色练习】10-物体抬升、抛出技能 - part2&#xff09;基础上创建一个新的大象坐骑角色&#xff0c;并实现控制该角色行走的功能。 效果 步骤 1. 在商城中下载“African Animal Pack”资产和“ANIMAL VARIETY PACK”资产导入工程中 2. 复…

【deepin 邀您体验】玲珑 10 分钟快速构建指南!

玲珑 作为一种新型的独立包管理工具集&#xff0c;玲珑主要提供分层与隔离的运行环境&#xff0c;解决传统包管理系统强依赖导致的兼容性问题&#xff0c;以及权限松散导致的安全问题。当前&#xff0c;玲珑已支持 4 个发行版&#xff0c;包括 deepin、统信 UOS 以及 Debian 和…

golang 中的复合类型

前言 所有的api文档都可以使用bash命令 go doc 查看文档的帮助信息 从 Go 1.13 开始&#xff0c;godoc 不再随 Go 发行版一起安装&#xff0c;你需要单独安装它。 需要单独安装 1. go install golang.org/x/tools/cmd/godoclatest 2执行命令 godoc -http:1111 打开浏览器 http:…

java之基础2笔记

1 类型转换 1.1 自动类型转换&#xff08;隐式类型转换&#xff09; 从小的数据类型到大的数据类型的转换&#xff08;如 int 到 long&#xff09;。 从低精度的数据类型到高精度的数据类型的转换&#xff08;如 float 到 double&#xff09;。 1.2 强制类型转换&#xff0…

儿童护眼灯哪个好?带你了解适合儿童的护眼灯款式分享

儿童护眼灯哪个好&#xff1f;作为我们日常生活中极为实用的小家电&#xff0c;为了确保使用台灯时的舒适性并且保护视力&#xff0c;选择一款专业的护眼台灯成为了一个明智的决定。这样的台灯能够提供更舒适、均匀的照明环境&#xff0c;那么到底儿童护眼灯哪个好你&#xff1…

实现手机空号过滤或手机号码有效性验证

手机空号过滤或手机号码有效性验证通常涉及使用专门的API接口来查询手机号码的状态。这些API接口通常由第三方服务提供商提供&#xff0c;它们会与电信运营商合作或利用自己的数据库来验证手机号码是否真实存在、是否已被分配、是否处于空号状态等。 以下是一些步骤和考虑因素…

爬虫——有道云翻译

废话不多说直接上代码 固定文本内容 import timefrom selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWai…

Day 41 NGINX详解

Nginx详解 一、HTTP协议 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 1、HTTP 工作原理 HTTP协议通信流程 WEB Server&…

超维小课堂 | 6、MAVROS与机载电脑Jetson nano通信

MAVROS与机载电脑Jetson nano通信 ROS系统镜像——Jetson nano b01 4G 链接: 百度云镜像链接 链接&#xff1a;https://pan.baidu.com/s/1NoIEvVdsiYLPvVOWM98hjQ 提取码&#xff1a;cwkj 简介&#xff1a;MAVROS和Jetson nano通信&#xff0c;设置飞控参数和MAVROS文件&am…

程序猿大战Python——了解Python

了解Python 编程语言的发展 目标&#xff1a;了解编程语言。 我们知道&#xff0c;咱们的日常沟通交流使用的语言&#xff1a;普通话。 那什么是编程语言呢&#xff1f; 【官方解释】编程语言是用来定义程序的语言形式&#xff0c;也就是说&#xff0c;我们可以通过编程语言…

root账号,cmd命令行能用ssh连上服务器,但是vscode连接报错Permission denied,please try again

☆ 问题描述 但是cmd能连接上 ★ 解决方案 点击 然后add到自己的配置文件下 重新选择 这个时候就会出现刚刚添加的&#xff0c;点击选择 输入密码 然后就ok了 ✅ 总结 只能说&#xff1a;玄学&#xff01;

剪画小程序:自媒体必备神器:【视频翻译】自动识别语言、翻译、配音,让外语视频秒变母语!

Hello&#xff0c;大家好呀&#xff01;我是不会画画的小画~ 今天给大家带来一款敲实用的视频翻译工具一一 小程序【剪画】 我们有很小伙伴在学习他国语言时&#xff0c;最大的障碍就是语言的问题了&#xff0c;想要 理解其中的内容&#xff0c;在这之前要下很大的功夫去掌握…

创业新风口:智能售货机的崛起

随着科技的飞速发展&#xff0c;智能售货机已经不再是简单的自动贩卖机&#xff0c;它们变得更加智能、灵活&#xff0c;能够适应各种场景需求&#xff0c;从传统的饮料、零食到新鲜水果、便当、甚至是电子产品&#xff0c;无所不包。这种24小时无人值守的商业模式&#xff0c;…

居民社区团购小程序源码系统 拼团管理+团长管理功能 带完整的安装代拿代码包以及搭建教程

系统概述 居民社区团购小程序源码系统是一款专为社区团购打造的一站式解决方案。它整合了拼团管理和团长管理等核心功能&#xff0c;能够帮助企业和创业者快速搭建自己的社区团购平台&#xff0c;实现高效运营和便捷管理。 代码示例 系统特色功能 1.拼团管理&#xff1a;支持…

工业互联网基本概念及关键技术(295页PPT)

资料介绍&#xff1a; 工业互联网的核心是通过工业互联网平台把设备、生产线、工厂、供应商、产品和客户紧密地连接融合起来。这种连接能够形成跨设备、跨系统、跨厂区、跨地区的互联互通&#xff0c;从而提高效率&#xff0c;推动整个制造服务体系智能化。同时&#xff0c;工…

Java环境配置(超详细)

Java环境配置&#xff08;超详细&#xff09; 引言1、安装 JDK1.1、下载安装JDK1.2、配置环境变量&#xff1a;JAVA_HOME1.3、将JAVA_HOME添加到Path中 2、安装 Maven2.1、下载安装Maven2.2、配置maven的环境变量: M2_HOME2.3、将Maven变量添加到Path中 引言 Java开发环境的配…

PyTorch 相关知识介绍

一、PyTorch和TensorFlow 1、PyTorch PyTorch是由Facebook开发的开源深度学习框架&#xff0c;它在动态图和易用性方面表现出色。它以Python为基础&#xff0c;并提供了丰富的工具和接口&#xff0c;使得构建和训练神经网络变得简单快捷。 发展历史和背景 PyTorch 是由 Fac…