什么是自动化测试?如何做自动化测试?

前面介绍了功能测试和接口测试,在介绍接口测试时提到了实现API自动化。那具体什么是自动化,为什么要做自动化,这里我们集中总结。

一. 什么是自动化?

顾名思义,自动化测试是相对人工测试而言的,它是指把人工对软件的测试行为转化为由机器执行的一种实践。

需要说明的是,单元测试属于白盒测试,很多公司的单元测试都是由开发人员负责,本文不作讨论。本文讨论的重点是API测试和GUI测试。

手工API测试的做法是,使用接口测试工具(例如Postman),然后操作以下步骤:

  1. 输入接口URL
  2. 选择请求类型,例如GET、POST等
  3. 填入header和参数信息
  4. 发送请求
  5. 验证响应,包括响应码和响应体。
  6. API自动化即是自动请求对应的API,并自动验证其结果是否符合预期。

手工GUI测试的做法是,打开待测系统,参考根据需求写好的测试用例,逐个手动点击,验证结果是否符合预期。

GUI自动化即是模拟人工在软件界面上的各种点点点操作,并自动验证结果。

二. 为什么要做自动化?

自动化测试听起来很美好,可以将测试人员从简单重复的劳动中释放出来。但自动化测试的的本质是用一段代码(自动化用例)测试另一段代码(开发实现的业务逻辑),所以自动化用例本身属于开发工作,并且要随着被测对象的更新而更新,因此也有一定的维护成本。

既然有开发和维护成本,就要考虑其性价比。来看看自动化测试的优势:

  1. 自动化测试可以替代大量的手工重复性操作,测试工程师可以把更多的时间花在更全面的用例设计和新功能的测试上。
  2. 自动化测试可以答复提升回归测试的效率
  3. 自动化测试可以更好地利用无人值守的时间频繁地执行测试,适合需要7*24小时持续运行的系统稳定性测试的关键业务

自动化测试可以保证每次测试执行的操作以及验证的一致性和可重复性,避免人为的遗漏和疏忽
再来看看自动化测试的劣势:

自动化测试不能取代手工测试
自动化测试本身不具有任何“智能”,它只是按部就班地执行事先定义好的测试步骤并验证结果,无法应对被测系统的变化
自动化测试有一定的开发和维护成本。统计表明,当自动化永利的有效执行次数>=5时,才能收回自动化测试的成本。
自动化测试仅能发现回归测试范围的缺陷,无法像手工测试一样做探索性测试
结合自动化测试的优势和劣势,哪些场景适合使用自动化测试呢?

需求稳定、不会频繁变更的场景
需要频繁执行回归测试的场景
通过手工测试无法实现或者手工测试成本太高的项目
例如上面说的需要7*24小时保证稳定性的关键业务,用自动化测试技术可以不间断地操作。

三. 做自动化测试的准备工作

以测试用户登录为例,手工测试的步骤如下:

注册用户
测试用户登录
这里面有两个问题:

注册时,需要注册服务是可用的,如果无法注册用户,测试也就阻塞了
测试时,该用户没有被使用。换句话说,如果此时恰好有人做删除操作,把你刚创建的用户删除了,则测试失败。
问题1是测试数据的准备问题,问题2是测试环境的干扰问题。

3.1 测试数据的准备

仍然以测试用户登录为例,我们有几种方法来获取注册的用户:

直接通过GUI操作
这种方法简单直接,但效率较低
调用API生成
实现上没问题,问题是一个前端操作可能会调用一系列后端API,且不说获取这一些列API遇到的问题,单单逐个手动操作去调用的过程,都赶得上直接在前端操作了。
通过数据库操作
实现上没问题,问题是一则测试同学并不清楚一项业务修改了哪些数据库表,其次就算知道了手动插入也麻烦,而且直接修改DB的数据,一个不小心误删了或误改了,想想手都要抖。

其实还有一种比较好的方法,调用API或通过数据库操作,做成自动化工具。例如,正常的注册需要输入用户名、密码,甚至还有邮箱手机号啥的,最后生成了账号。而如果你要测试用户登录功能,用户名、密码、邮箱、手机号都不是要关注的重点,换句话说,这些值是什么都无所谓,你只是要一个可以登录的用户名/密码即可。由此我们可以在了解了API调用序列之后,做成自动化工具(需要有前端知识),有默认的用户名(例如test+<时间戳>)和密码(例如 test123),一键注册。如此则大大提高了效率,降低了手动操作的错误的可能性。

从广义上说,自动化工具的实现,也是自动化技术的一部分。

3.2 测试环境的准备

平时测试人员的操作都是在测试环境上进行的。需要专门为自动化测试搭建并维护一套测试环境吗?很显然,是有一定的物质成本和维护成本的。如果并用一套测试环境,会相互干扰。尤其是很多流程比较长的业务,你要验证一个环节,可能刚好这个数据被别人用了,就会导致用例的失败,由此又要去分析,最后发现是数据的问题。这里说下我曾经接触过的几个解决方案:

自动化用例中实时搭建环境,自动化用例执行完再释放环境
优点:自动化测试环境天然的隔离
缺点:实时搭建环境不仅需要大量的服务器,还需要大量的时间。
因此并不适用快节奏的互联网产品
分别维护手工测试环境和自动化测试环境
优点:数据的隔离
缺点:有更新时需要部署并维护两份。
互联网产品的快节奏决定了部署是很频繁的,这种方法效率也比较低
共用手工测试环境和自动化测试环境
优点:只需要部署并维护一份环境

缺点:数据会相互干扰

当然,可以有其他办法来解决数据的干扰,譬如命名规范,自动化用例相关的用户等固定有个前缀(例如auto),大家手工测试时不使用这类的数据。

使用哪种方案,要依据当前要解决的问题来决策。如果自动化处于起步阶段,大可先共用环境,等自动化建起来再说;如果比较成熟了且数据干扰严重,可以考虑维护两套环境等。

四. 自动化技术简介

4.1 API自动化技术

代码级的API测试是比较简单的,因为API测试的基本步骤是很标准的:

准备测试数据
发起请求
验证响应结果
而无论是请求参数还是响应参数,都是K-V的键值对,验证结果只需要解析这些键值对即可。因此常用的类和方法也就那么几种。

难点在于:业务流程设计哪些接口,接口用例如何设计、如何组织管理等。

本文不详细介绍,有时间 & 有人需要,我再更新吧~

4.2 GUI自动化技术

GUI自动化测试的核心思想是,基于页面元素识别技术,对页面元素进行自动化操作,以模拟实际终端用户的行为并验证软件功能的正确性。

GUI自动化测试主要有两大方向:

传统web浏览器的GUI自动化测试:主流方案是selenium
移动端的GUI自动化测试:主流方案是Appium,app+selenium
先来了解一下selenium和appium的工作原理。

作为TE的你肯定知道,selenium1.0和2.0的技术是截然不同的。前者的核心是Selenium RC,而后者的核心是webDriver。鉴于目前的2.0和3.0(和2.0本质是一样的)是主流,这里只介绍selenium 2.0的工作原理。

Selenium 2.0是典型的client-server模型,client端即测试用例,sever端即远程服务器,其执行流程如下:

了解原理之后,剩下的工作就只剩下用代码实现测试用例了。当然这里面的关键就是,如何识别页面元素(有人需要的话,专门开一篇来介绍)。

正确识别了页面元素,代码就是验证业务流程。这部分本身属于开发工作,和开发写代码一样,需要有代码规范、分层设计、封装(模块的封装、页面对象的封装等)。

五. 常见面试题

  1. 如何定位页面元素
  2. APP测试和web测试有什么区别?
  3. 接口自动化是如何做的?
  4. GUI自动化测试的原理及步骤
  5. GUI自动化测试中,如何保证测试用例的稳定性?

六. 思考和总结

本文介绍了自动化的概念及为什么要做自动化,做自动化测试需要做的准备工作:测试数据及测试环境,最后简单介绍了代码级别的自动化测试技术。

从广义上说,自动化技术不仅仅包含代码实现的测试用例,还应包含代码实现的自动化工具。

关于代码级别的自动化测试技术,以后有了时间再来更新细节~

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

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

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

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

相关文章

npm ERR! network This is a problem related to network connectivity.

问题详细描述 PS D:\ALearnBlog\shiyi-blog\blog-web> npm install -g vue/cli npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/vue%2fcli failed, reason: connect ETIMEDOUT 104.1…

Linux+Win双系统远程重启到Win

背景 电脑安装了双系统&#xff08;ubuntu 22.04 win11&#xff09;&#xff0c;默认进入ubuntu系统。给电脑设置了WoL(Wake-on-LAN)&#xff0c;方便远程开机远程控制。 但是ubuntu的引导程序grub无法远程控制&#xff0c;远程开机会默认进入ubuntu。 虽然说可以进入ubuntu后…

css2背景

css2背景 一.背景颜色二.背景图片三.背景平铺四.背景图片位置五.背景图像固定六.复合型写法七.背景颜色半透明八.总结 一.背景颜色 默认是transparent(透明&#xff09; 二.背景图片 默认是none 三.背景平铺 默认是background-repeat(平铺&#xff09; 四.背景图片位置…

Linux常用命令(下)

Linux命令速查表 本速查表涵盖了一些常用的Linux命令&#xff0c;包括文件操作、软件管理、进程管理、系统信息等方面的内容&#xff0c;适合Linux初学者参考使用。 文件操作 查看文件内容 head head命令用于显示文件的开头部分内容。 head filename # 显示文件开头部分内…

OK-Robot机器人实现零样本算法 可在非结构化环境下完成拾取与放置任务

纽约大学的机器人专家团队与Meta人工智能学院研发人员共同合作开发了一种新型机器人&#xff0c;该机器人具备在非结构化环境下的认知能力&#xff0c;可在陌生房间利用视觉语言模型&#xff08;VLMs&#xff09;&#xff0c;进行物品的抓取与放置。在论文当中&#xff0c;该团…

JS的高级用法

关于JS高级用法 在学习JavaScript的过程中&#xff0c;我们必须了解一些基础知识&#xff0c;如变量、函数、类、循环等。这些基础知识是我们使用JavaScript的基础。但是&#xff0c;在日常的业务开发中&#xff0c;我们需要一些更高级的技巧来更好地解决问题。 通过阅读本文…

在线黑色响应式全屏滚动主页html源码

html5黑色大气的个人博客全屏滚动个人主页源码 右键记事本即可修改 直接上传服务器空间就可使用

如何从 0 开始学 Python 自动化测试开发

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

2.18通过字符设备驱动分步注册过程实现LED驱动的编写,编写应用程序测试

应用程序&#xff1a; #include<stdlib.h> #include<stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<unistd.h> #include<string.h> #include<sys/ioctl.h> #include"myled.h&quo…

阿里云香港轻量应用服务器是什么线路?cn2?

阿里云香港轻量应用服务器是什么线路&#xff1f;不是cn2。 阿里云香港轻量服务器是cn2吗&#xff1f;香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器&#xff0c;通过mtr traceroute测试了一下&#xff0c;最后一跳是202.97开头的ip&#xff0c;1…

递归算法与分治思想

递归算法 直接或间接的调用自身的算法称为递归函数,采用栈结构,先调用的最后返回。 主要形式就是先纵后横,一个分支走到底,再退回一个到兄弟节点,依次回退。 列出递归的三种形式:切蛋糕、递推公式、等价转换。 递归要素: 明确递归得到结果是什么提取重复的逻辑,缩小…

数据库第五次实验

目录 1 创建数据表 2 创建多个用户 ​​​​​​​3 用户的授权 ​​​​​​​4 用户权限的回收 ​​​​​​​5 角色的创建与授权 ​​​​​​​6 回收角色的权利 ​​​​​​​7 审计的设置 1 创建数据表 SQL语句&#xff1a; use experimentfive; create table…

【多线程】进程和线程的区别和联系

进程和线程 什么是进程什么是线程为啥要有线程&#x1f332;进程和线程的关系&#x1f332;系统管理与分配资源和CPU调度角度&#x1f332;资源使用角度&#x1f332;线程的特点 什么是进程 进程是操作系统对⼀个正在运⾏的程序的⼀种抽象&#xff0c;换⾔之&#xff0c;可以把…

rtt设备io框架面向对象学习-pin设备

目录 1.pin设备基类2.pin设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.gpio的pin映射6.使用 1.pin设备基类 此层处于设备驱动框架层。 在/ components / drivers / include / drivers 下的pin.h定义了如下pin设备基类 struct rt…

2024年开工,煮熟的鸭子飞了咋办

去年是我居家创业的第一个年头&#xff0c;业绩总体来说不及预期&#xff08;上班的收入&#xff09;&#xff0c;仅仅满足日常开支&#xff0c;没有任何的盈余。 去年有点项目没完成收尾&#xff0c;所以初四我就选择开工了&#xff0c;就图一个大吉大利。年前积压的客户需求…

【uCore 操作系统】1. 应用程序与基本执行环境

文章目录 【 1. 代码框架简述 】1.1 OS 是怎么跑起来的&#xff1f;1.1.1 qemu 的作用1.1.2 rustsbi.bin 的作用 1.2 qemu 是怎么跑起来的&#xff1f;1.3 OS 文件夹1.3.1 kernel.ld1.3.2 entry.S1.3.3 main.c1.3.4 sbi.c 1.4 bootloader 文件夹 【 2. makefile 和 qemu 】2.1 …

【SpringBoot】项目启动增加自定义Banner

SpringBoot项目启动增加自定义Banner 前言 最近有个老哥推荐我给博客启动的时候加上自定义Banner&#xff0c;开始我还不太明白他说的是那部分&#xff0c;后面给我发了这样一个&#xff0c;瞬间就懂了~ // _ooOoo_ …

C++入门篇——命名空间

在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以避免命名冲突或名字污染&#xff0c;namespace关键…

内联函数与普通函数的区别

内联函数与普通函数的区别 内联函数与普通函数的主要区别在于它们在编译过程中的处理方式。 普通函数&#xff1a; 普通函数在编译后会被放到代码段中。当程序需要调用一个普通函数时&#xff0c;会先进行参数压栈&#xff0c;然后根据函数调用地址调用函数。函数执行完成…

【开源讲解】

开源讲解 开源介绍 开源介绍 开源是指一种项目、产品或创意的设计、开发和分享过程&#xff0c;它鼓励公开协作。在IT与软件领域&#xff0c;开源指的通常是开源软件&#xff0c;它的源代码可以被任何人查看、修改和改进。这与传统的专有软件形成鲜明对比&#xff0c;后者的源…