数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

news2024/12/26 11:31:08

UI自动化测试用例剖析

让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。由于现在Selenium在自动化测试的统治地位,并且随着Selenium 4的即将发布,在未来很长的一段时间里这种统治地位应该还会持续,所以我的这篇文章还都是基于Selenium与Java的。

在这里插入图片描述
自动化测试小Demo

它要测试的东西其实是要看一下百度搜索能不能返回兴业银行的官网。我们分析一下这段代码都包含些什么东西。

第一,这段代码包含了定位符。熟悉Selenium的都知道,inpubBox和searchButton就是网页的元素,通过By.id实例化,然后driver在findElement 的时候是通过他们的id,就是”kw”和”su”找到他们的。所以”kw” 和”su”就是他们的定位符。

在这里插入图片描述
定位符

第二,这段代码包含测试数据。“兴业银行”,“兴业银行欢迎您”就是测试要输入的数据。
在这里插入图片描述

测试数据

第三部分没前面两部分那么直观。这段代码在基于”kw”找到inputBox后,往里填入“兴业银行”四个字,然后点击了searchButton提交搜索申请,然后在搜索结果里面寻找“兴业银行欢迎您”的text,然后以是否找到这个text作为assert的标准。这些测试步骤反映的是真实的业务逻辑, 并且不能随意更换顺序。所以第三部分是业务逻辑。在这里插入图片描述
业务逻辑

第四部分是业务逻辑里面的每一个步骤的具体操作,例如输入某段文字,或者点击一个按钮等。具体到我们的例子就是sendKeys和click。

在这里插入图片描述

具体操作

第五部分就是如果把前面四部分都抽出去后,测试代码剩下的东西,基本上就是一些负责准备或者是清理的代码,例如初始化driver等。我把它称为代码骨架。

经上分析,一个自动化测试用例由五部分组成:定位符、测试数据、业务逻辑、具体操作、代码骨架。
在这里插入图片描述
UI自动化测试结构

数据驱动的自动化测试

如果把测试数据抽取出去,通过数据的改变驱动自动化测试的执行,最终引起测试结果的改变,就是数据驱动的自动化测试。说白了,就是测试数据参数化。
在这里插入图片描述

数据驱动

数据驱动的自动化测试适合测试场景与业务逻辑相对简单,变化不是特别大,但是测试数据对测试结果影响大的情景,或者是需要通过大量不同的测试数据对相同的测试场景展开测试的情景。它实现的方式比较简单,但由于业务逻辑还是镶嵌于测试代码里面的,业务逻辑与测试代码还是强耦合的,一旦业务场景发生改变,需要修改测试代码来适应业务的变化。

想要隔离业务对测试代码的影响,就必须使用关键字驱动的方法。

关键字驱动的自动化测试

简单来说,关键字驱动的自动化测试,就是在数据驱动的基础上,把具体操作抽取到代码以外,通过具体操作的改变来驱动测试的执行。这里的说的关键字其实就是具体的操作,例如例子里面的sendKeys和click。但由于具体操作(关键字)是基于业务逻辑的,要想把关键字抽取,业务逻辑也得一同抽取,才能实现真正的关键字驱动。同时,具体操作的对象是定位符定位的元素,所以定位符也必须得一同抽取出代码意外,才能完全隔离业务对代码的影响。在这里插入图片描述

关键字驱动

基于关键字驱动的自动化测试适合业务场景复杂,测试步骤繁多的情景,又或者是希望搭建统一测试平台的情景。它最大的优点是使得不懂编程的业务人员可以在不需要读懂代码的情况下,通过更改配置,自由添加新的测试用例或修改现有的测试用例。这一点在敏捷开发里面相当实用,可以把业务卷入到测试当中,让测试用例的准备工作尽可能提前;另外,测试代码与要测试的业务逻辑完全隔离,同一份测试代码可以复用于不同的测试场景,较少了重复开发的成本。但是,它也不是完全没有缺点。首先,并不是所有场景都需要基于关键字驱动的,有些场景数据驱动的方法能解决的话就应该果断选用数据驱动,而不应该过度设计;第二,由于业务逻辑与代码隔离了,代码的可读性将大大降低,单纯的代码基本没有业务含义,要想通过读测试代码来了解业务,基本是不可能了。牺牲了代码的可读性来换取可重用性。第三,由于代码复用了,每一个测试用例的执行都相当于一次全新的测试,这意味着如果不加额外处理,测试报告将被互相覆盖,永远都只保留最后一个测试用例的执行结果。

一个关键字驱动的自动化测试例子

这是我很早之前写的一个关键字驱动的自动化测试的Demo。基本的想法是把定位符、测试数据、业务逻辑、具体操作多抽取到一个叫做testCase.properties的文件。Parameter用于存贮从testCase.properties读出来的属性,主测试类TestBankIndex通过读取这个文件来驱动测试的执行。关键字所对应的具体操作放在了PageAction里面。

在testCase.Properties里面,通过testCaseNameList来定义测试用例名字,中间用|分割开。testCaseNameList以下,是每一个测试用例的具体测试步骤。每个测试步骤名字以测试用例名字作为前缀,并且其排列顺序就是测试步骤的顺序。然后测试步骤的值以测试所需的操作(关键字)、定位方式、定位表达式、测试数据、超时时间排列得来,中间以|分割。这里有一个比较特别的是断言。如果是断言的话,会有Keyword,用于断言的判断。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!      

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

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

相关文章

【C#】XML的基础知识以及读取XML文件

最近在学读取文件 目录 介绍特点结构XML的语法规则XML 命名规则 C#操作XML新建读取第一种第二种第三种 读取属性 介绍 XML (可扩展标记语言,eXtensible Markup Language) 是一种标记语言,它被设计用来传输和存储数据。 特点 可扩展性:由于…

C++---异常处理

异常处理 异常处理try语句块和throw表达式异常的抛出和捕获异常的抛出和匹配原则 异常安全异常规范标准异常 异常处理 异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时,需要用到异常处理…

港联证券:停牌后复牌股价怎么算?

股票停牌是指买卖所或证券公司暂停一只股票的买卖,并不再出现在股票商场上。停牌的原因或许是公司内部事务调整、财政审计、重大事件或公司被收购等。当一家公司的股票停牌时,这对持有该公司股票的投资者或许会带来一些影响。因而,了解停牌后…

最新医疗界AI资讯,远程评估帕金森病症状的AI工具问世

原创 | 文 BFT机器人 1、AI模型快速评估,自动生成评估报告 罗切斯特大学研究人员开发的一种人工智能工具可以帮助帕金森病患者在几分钟内远程评估其症状的严重程度。《npj数字医学》杂志上的一项研究介绍了这种新工具,它能让用户在网络摄像头前通过敲击…

如何验证高压放大器的性能好坏呢

验证高压放大器的性能好坏,就需要考虑一系列关键指标和测试方法。这些指标包括频率响应、增益、失真、输出功率、噪声以及稳定性等,使我们能够全面评估放大器的性能和质量。下面西安安泰电子将介绍如何验证高压放大器的性能,并针对不同指标提…

眼镜镜片 光致变色镜片

声明 本文是学习GB-T 9105-2023 眼镜镜片 光致变色镜片. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 标志 6.1 通用要求 镜片的表面、包装或附带文件中,应标明下列参数: a) 产品名称、商标; b) 制造商或供…

Python面向对象编程:深入理解类、对象、继承和多态

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 面向对象编程&#xff0…

数据结构-----队列

目录 前言 队列 定义 队列的定义和操作方法 队列节点的定义 操作方式 顺序表实现队列(C/C代码) 链表实现队列(C/C代码) Python语言实现队列 前言 排队是我们日常生活中必不可少的一件事,去饭堂打饭的时候排队&a…

laravel框架 - 事件与监听器

一,绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…

【笔试强训选择题】Day43.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&#xff…

为什么qt设置了utf-8 bom 格式后还是有乱码

有乱码 void SingleApplication::_showInstanceRunningDialog() {// 创建一个提示窗口QMessageBox msgBox;msgBox.setIcon(QMessageBox::Information);msgBox.setWindowTitle("应用已运行");msgBox.setText("应用程序已经在运行中。");msgBox.setStandardB…

计算机毕业设计 基于SSM+Vue的医院门诊互联电子病历管理信息系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

GE PRG-MODEM 调节器模块

GE PRG-MODEM 调节器模块通常是工业自动化和控制系统中的一种通信设备,用于远程监测、控制和数据传输。以下是可能包括在该模块中的一些产品特点: 通信接口:PRG-MODEM 模块通常配备各种通信接口,例如串行接口(RS-232、…

docker报错Error response from daemon: Container xxx is not running

1. 问题 在移植了docker后,执行了sudo docker run --name myrosort -p 80:80 -d rosort 指令运行名为myrosort的容器,通过sudo docker ps -a也可以看到确实运行了 (base) neousysneousys-Nuvo-5000:~/wqw/docker/20230915$ sudo docker run --name myr…

springboot基础--实现默认登录页面

1、搭建项目 依赖中 多加入thymeleaf依赖 <dependencies><!--thymeleaf的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--we…

每日一题~二叉搜索树中的众数

题目链接&#xff1a;501. 二叉搜索树中的众数 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 由题可知&#xff0c;题目中所给的树是一颗二叉搜索树&#xff0c;二叉搜索树的中序遍历结果是一个从小到大的数据集&#xff0c;那么我们可…

全国职业技能大赛云计算--高职组赛题卷④(容器云)

全国职业技能大赛云计算--高职组赛题卷④&#xff08;容器云&#xff09; 第二场次题目&#xff1a;容器云平台部署与运维任务1 Docker CE及私有仓库安装任务&#xff08;5分&#xff09;任务2 基于容器的web应用系统部署任务&#xff08;15分&#xff09;任务3 基于容器的持续…

计数排序与基数排序

计数排序与基数排序 计数排序 计数排序&#xff1a;使用一个数组记录序列中每一个数字出现的次数&#xff0c;将该数组的下标作为实际数据&#xff0c;元素的值作为数据出现的次数。例如对于序列[3,0,1,1,3,3,0,2]&#xff0c;统计的结果为&#xff1a; 0出现的次数&#xf…

【Linux】基础IO,软硬链接,动静态库

1. 认识IO 什么是IO I/O简单来说对应的就是两个单词Input和Output&#xff0c;指的是计算机系统与外部环境&#xff08;通常是硬件设备或其他计算机系统&#xff09;之间的数据交换过程 I/O 可以分为两种主要类型&#xff1a; 输入&#xff08;Input&#xff09;&#xff1a; …

生命周期简化idea配置

生命周期简图 扩展接口介绍 2.1 Aware接口 在spring中Aware接口表示的是感知接口&#xff0c;表示spring框架在Bean实例化过程中以回调的方式将特定在资源注入到Bean中去&#xff08;如&#xff1a;ApplicationContext, BeanName,BeanFactory等等&#xff09;。Aware接口本事没…