什么是自动化测试框架?我们该如何搭建自动化测试框架?
无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。
最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架”有了一些理解,这篇博客,就聊聊自动化框架的一些事吧。。。
一、什么是自动化测试框架
简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境。自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本,多种方式、平台执行脚本,良好的报告去跟踪脚本执行结果。
1.框架具有以下一些优点:
1)代码复用
2)最大覆盖率
3)很低成本维护
4)很少人工干预
5)简单报告输出
2.常见的测试框架分类
早期设计的框架大致可分为以下几类:
1)基于模块的测试框架
2)基于库(Library)结构测试框架
3)数据驱动测试框架,和QTP很像
4)关键字驱动测试框架,也是QTP过来的
5)混合测试框,3 4和综合
6)行为驱动开发测试框架
这里我们不一一介绍这些框架,字面意思可以想象一些这些框架的背景和组件,本文只是对框架有一个基本了解。
3.框架基本组件
我们来思考下框架组成部分:
1)需要配置文件管理
2)业务逻辑代码和测试脚本分离
3)报告和日志文件输出
4)自定义的库的封装
5)管理、执行脚本方式
6)第三方插件引入
7)持续集成
解释:
我们需要一个配置文件去控制一些,环境信息,开关,配置文件可以是txt/xml/yaml/properties/ini,一般.properties使用较多在JAVA里,本文是Python系列,我可能会选择ini文件。
业务逻辑代码和测试脚本分离,不像我们刚开始学习Selenium那样,代码和脚本在一个类文件里演示。我们根本没有用到代码重构,复用。代码和用例文件分离后,更加清晰,去多人开发脚本,方便调试。
报告和日志文件输出,你执行了多少case,case结果如何,这都需要报告来展示,一般采用第三方插件来实现这个功能,好多报告格式是html,简单,明了的风格。日志输出也很重要,如果发生报错,脚本执行失败,通过日志快速定位发生问题位置。
用户自定义库,这个很好理解,我们很多功能需要重复调用,这样我们就写成一个公用方法,放到工具包下,每次方便调用,例如浏览器引擎类和basepage.py的封装。
管理和执行脚本的方式,例如Python中单元测试框架unittest使用率非常高。
第三方插件,有时候,我们一些功能,需要借助第三方插件,能够更好实现,例如AutoIT,来实现文件上传和下载。还有利用第三方报告插件生成基于html格式的测试报告。
持续集成,git,svn,ant,maven,jenkins,我们会把这整合到jenkins,达到持续集成,一键执行测试脚本。
根据以上的特点介绍,我大致用以下图来描述一下,一个简单的自动化测试框架,可能包含哪些组成部分。
框架的简单介绍就到这里,有些人把框架想得太复杂了,框架无非就是一些软件的集合,达到特定的目的。这里我们上图画出来的框架,就是一个简单的自动化测试框架,别笑,这确实是一个简单但又包含必要的组件的自动化测试框架设计实例,如果你学会了这个设计思路和思想,那么,你已经达到了自动化测试第二个阶段的水平:能够简单设计自动化测试框架和维护框架的能力。
二、自动化测试
自动化测试定义
首先来说一下什么是软件测试?
软件测试简单来说就是在规定的条件下对程序进行操作以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
那么什么是自动化测试呢?
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程,即模拟手工测试步骤通过执行程序语言编制的测试脚本自动地测试软件,包括了所有测试阶段,它是跨平台兼容的,并且是进程无关的。
实际上严格的说自动化测试是分广义和狭义的。广义的就是测试自动化,它强调的是整个测试过程都由计算机系统完成,范围更广。狭义的就是我们通常所说的自动化测试,主要是说通过某个自动化工具自动执行某项测试任务,处理范围比较小。
使用自动化测试的前提条件及适用场合
前提条件
实施自动化测试之前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试。通常需要同时满足以下条件:
1) 需求变动不频繁
测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。
项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。
2) 项目周期足够长
自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成,这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。
3) 自动化测试脚本可重复使用
如果费尽心思开发了一套近乎完美的自动化测试脚本,但是脚本的重复使用率很低,致使其间所耗费的成本大于所创造的经济价值,自动化测试便成为了测试人员的练手之作,而并非是真正可产生效益的测试手段了。
另外,在手工测试无法完成,需要投入大量时间与人力时也需要考虑引入自动化测试。
比如我们愚公坊项目这次SpringBoot升级后一些相对稳定的模块就可以采用自动化测试注册登录模块 购物车模块 订单模块等等。
适用场合
通常适合于软件测试自动化的场合:
(1)回归测试,重复单一的数据录入或是击键等测试操作造成了不必要的时间浪费和人力浪费;
(2)此外测试人员对程序的理解和对设计文档的验证通常也要借助于测试自动化工具;
(3)采用自动化测试工具有利于测试报告文档的生成和版本的连贯性;
(4)自动化工具能够确定测试用例的覆盖路径,确定测试用例集对程序逻辑流程和控制流程的覆盖。
随着测试流程的不断规范以及软件测试技术的进一步细化,软件测试自动化已经日益成为一支不可忽视的力量。能否借助于这支外在力量以及如何借助于这支力量来规范企业测试流程、提高特定测试活动的效率,正是本期所要讨论的话题。
自动化测试基本流程
1、制定测试计划
在展开自动化测试之前,最好做个测试计划,明确测试对象、测试目的、测试的项目内容、测试的方法、测试的进度要求,并确保测试所需的人力、硬件、数据等资源都准备充分。制定好测试计划后,下发给用例设计者。
2、分析测试需求
用例设计者根据测试计划和需求说明书,分析测试需求,设计测试需求树,以便用例设计时能够覆盖所有的需求点。一般来讲,基于Web功能测试需要覆盖一下几个方面:
1)页面链接测试,确保各个链接正常;2)页面控件测试,确保各个控件可靠;3)页面功能测试,确保各项操作正常;4)数据处理测试,确保数据显示准确、处理精确可靠;5)模块业务逻辑测试,确保各个业务流程畅通。
3、设计测试用例
通过分析测试需求,设计出能够覆盖所有需求点的测试用例,形成专门的测试用例文档。由于不是所有的测试用例都能用自动化来执行,所以需要将能够执行自动化测试的用例汇总成自动化测试用例。必要时,要将登陆系统的用户、密码、产品、客户等参数信息独立出来形成测试数据,便于脚本开发。
4、搭建测试环境
自动化测试人员在用例设计工作开展的同时即可着手搭建测试环境。因为自动化测试的脚本编写需要录制页面控件,添加对象。测试环境的搭建,包括被测系统的部署、测试硬件的调用、测试工具的安装盒设置、网络环境的布置等。
5、编写测试脚本
根据自动化测试用例和问题的难易程度,采取适当的脚本开发方法编写测试较薄。一般先通过录制的方式获取测试所需要的页面控件,然后再用结构化语句控制脚本的执行,插入检查点和异常判定反馈语句,将公共普遍的功能独立成共享脚本,必要时对数据惊醒参数化。当然还可以用其他高级功能编辑脚本。脚本编写好了之后,需要反复执行,不断调试,知道运行正常为止。脚本的编写和命名要符合管理规范,以便统一管理和维护。
6、分析测试结果、记录测试问题
应该及时分析自动化测试结果,建议测试人员每天抽出一定时间,对自动化测试结果进行分析,以便尽早地发现缺陷。如果采用开源自动化测试工具,建议对其进行二次开发,以便与测试部门选定的缺陷管理工具紧密结合。理想情况下,自动化测试案例运行失败后,自动化测试平台就会自动上报一个缺陷。测试人员只需每天抽出一地你该时间,确认这些自动上报的缺陷,是否是真实的系统缺陷。如果是系统缺陷就提交开发人员修复,如果不是系统缺陷,就检查自动化测试脚本或者测试环境。
7、跟踪测试BUG
测试记录的BUG要记录到缺陷管理工具中去,以便定期跟踪处理。开发人员修复后,需要对此问题执行回归测试,就是重复执行一次该问题对应的较薄,执行通过则关闭,否则继续修改。如果问题的修改方案与客户达成一致,但与原来的需求有所偏离,那么在回归测试前,还需要对脚本进行必要的修改和调试。
三、常见的自动化测试框架
1.Robot
如果是希望在测试自动化工作中使用python测试自动化框架,Robot框架是最佳选择。
Robot框架使用关键字驱动的方法来简化测试的创建。Robot框架还可以测试MongoDB、FTP、Android、Appium等。它有许多测试库,包括Selenium WebDriver库和其他有用的工具。它有很多API来帮助它尽可能地扩展。Robot框架使用的关键字方法对于那些已经熟悉其他基于供应商的关键字驱动的测试工具的测试人员非常有用,这使得他们更容易过渡到开源。
2.Pytest
Pytest是另一个python类型的自动化测试框架,可适用于多种软件测试。凭借着其开源和易学的特点该工具经常被QA团队、开发团队、个人团队、以及各种开源项目所使用。鉴于Pytest具有“断言重写”之类的实用功能许多大型互联网应用。
使用先决条件:除了基本的Python知识用户并不需要更多的技术储备。另外用户只需要有一台带有命令行界面的测试设备,并安装好了Python包管理器、以及可用于开发的IDE工具。
3.Junit
Junit 是一个Java 语言的单元测试框架。它由Kent Beck 和Erich Gamma 建立,逐渐成为源于Kent Beck 的sUnit 的xUnit 家族中最为成功的一个。Junit 有它自己的JUnit 扩展生态圈。多数Java 的开发环境都已经集成了Junit 作为单元测试的工具。
Junit 是由Erich Gamma 和Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit 测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit 是一套框架,继承TestCase 类,就可以用Junit 进行自动测试了。
4.WebDriverIO
WebdriverIO是一个基于Node.js的自动化测试框架。它有一个集成的测试运行器,可以为web应用程序和本地移动应用程序运行自动化测试。同时,它可以在WebDriver协议和Chrome Devtools协议上运行,使它对基于Selenium WebDriver的跨浏览器测试或基于Chromium的自动化都有效。由于WebDriverIO是开源的,你可以得到一堆插件来满足你的自动化需求。“Wdio安装向导”使安装简单和容易。
5.Citrus
Citrus是一个开源框架,您可以使用它自动化任何消息传递协议或数据格式的集成测试。对于任何类型的消息传递,如REST、HTTP、SOAP或JMS,Citrus框架将适合测试消息传递集成。如果您需要与用户界面交互,然后验证后端流程,那么可以将Citrus与Selenium集成。例如,如果您必须单击“发送电子邮件”按钮并在后端验证电子邮件是否已收到,柑橘可以接收此电子邮件或UI触发的JMS通信,并验证后端结果,所有这些都在一个测试中完成。
6.Selenium
这款自动化测试框架可以说是web程序中最受欢迎的开源自动化测试框架之一,拥有强大的语言功能,涵盖所有的编程语言,可跨平台和跨浏览器,可支持记录和重放功能,以通过广泛的库和API进行高度扩展,以满足测试团队的需求,是测试人员的首选测试框架。
7.Cypress
Cypress是一个以开发人员为中心的测试自动化框架,它使测试驱动开发(TDD)成为开发人员的现实。它的设计原则是能够打包和捆绑所有东西,使整个端到端测试体验愉快和简单。
Cypress的架构与Selenium不同。Selenium WebDriver远程运行在浏览器外部,而Cypress运行在浏览器内部。这种方法有助于理解浏览器内部和外部发生的一切,从而提供更一致的结果;它不需要您处理对象序列化或在线协议,同时为您提供对每个对象的本机访问。
8.Serenity
Serenity是一个开源库,用于行为驱动的测试。该框架可帮助编写验收标准,这些标准结构良好且维护更多。Serenity提供了大量的内置功能,例如处理并行运行的测试、WebDriver管理、截屏、管理步骤之间的状态、促进Jira集成,所有这些都不需要编写一行代码。
9.Gauge
Gauge是一个开源工具无关的测试自动化框架,适用于Mac、Linux和Windows。从事TDD和BDD工作的人会喜欢Gauge专注于创建动态/可执行文档。
Gauge的重要功能有:可使用单个命令启动并运行框架;通过多种扩展插件支持模块化架构;没有任何特定的结构,能用简单的Markdown创建文本文档。当然,Gauge的功能也可以通过对插件的支持进行扩展。
10.Carina
Carina是基于Java的自动化测试框架,它不依靠特定的技术堆栈,因此测试人员智只能在iOS和Android之间重用测试自动化代码。它的重要功能有:能把所有测试层,包括移动端、Web应用程序、REST服务甚至数据库组合到同一应用程序;支持关系和分关系数据库;可以用FreeMarker模板引擎生成REST请求。
关于自动化测试框架的一些理解和思考总结,就是上面这些内容,提到的一些框架组件可能存在不合理的地方,仅供参考,如有更好的建议,请指出,不胜感激。。。
相关文章:

什么是自动化测试框架?我们该如何搭建自动化测试框架?
无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架”…...

Debezium报错处理系列之六十七:TopicAuthorizationException: Not authorized to access topics
Debezium报错处理系列之六十七:TopicAuthorizationException: Not authorized to access topics 一、完整报错二、错误原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sure that the same history topic isn‘t sha…...

javaWebssh中小学课件资源系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
一、源码特点 java ssh中小学课件资源系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT…...

MySQL高级查询操作
文章目录 前言聚集函数分组查询:GROUP BY过滤:HAVING嵌套子查询比较运算中使用子查询带有IN的子查询SOME(子查询)ALL(子查询)EXISTS子查询 前言 查询语句书写顺序: 1、select 2、from 3、where 4、group by 5、having 6、order by 7、limit …...

Day53【动态规划】1143.最长公共子序列、1035.不相交的线、53.最大子序和
1143.最长公共子序列 力扣题目链接/文章讲解 视频讲解 本题最大的难点还是定义 dp 数组 本题和718.最长重复子数组区别在于这里不要求是连续的了,但要有相对顺序 直接动态规划五部曲! 1、确定 dp 数组下标及值含义 dp[i][j]:取 text1…...

Three.js--》实现3d地球模型展示
目录 项目搭建 实现网页简单布局 初始化three.js基础代码 创建环境背景 加载地球模型 实现光柱效果 添加月球模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多…...

<SQL>《SQL命令(含例句)精心整理版(6)》
《SQL命令(含例句)精心整理版(6)》 18 DB2查询语句18.1 查询数据库大小18.2 查看表占表空间大小18.3 查看正在执行的语句18.4 db2expln 查看执行计划18.5 db2advis 查看优化建议 19 空值19.1 NULL19.2 TRIM 18 DB2查询语句 18.1 …...

信息系统建设和服务能力评估证书CS
信息系统建设和服务能力评估体系CS简介 简介:本标准(团标T/CITIF 001-2019)是信息系统建设和服务能力评估体系系列标准的第一个,提出了对信息系统建设和服务提供者的综合能力要求。 发证单位:中国电子信息行业联合会。…...

vue3引入路由
1.首先在项目中安装路由 npm install vue-router -S 2.src文件夹下新建》views文件夹》新建home文件夹》新建Home.vue文件 在src文件夹下》新建router文件夹》新建index.js import { createRouter,createWebHashHistory } from vue-router const route s[ { path:/, compo…...

前后端联调跨域问题
文章目录 什么是同源策略如何判断是否同源?跨域资源共享(CORS)如何解决跨域问题 什么是同源策略 同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。 如何判断是否同源? 如果…...

day11 - 手写数字笔迹细化
手写数字笔迹细化 对于手写数字识别实验中,经常会遇到因为笔迹较粗导致误识别的情况,所以我们通常会先将笔迹进行细化,笔迹变细以后,数字的特征会更明显,后续进行识别的准确率就会更高。 例如数字7 和 1 ,…...

C++ QT QDBus基操
以下是使用QDBus进行跨进程通信的具体用法: 1. 创建DBus服务 在服务端进程中,需要创建一个DBus服务,并注册DBus对象。示例代码如下: #include <QDBusConnection> #include <QDBusMessage> #include <QDBusInterf…...

STM32的SPI外设
文章目录 1. STM32 的 SPI 外设简介2. STM32 的 SPI 架构剖析2.1 通讯引脚2.2 时钟控制逻辑2.3 数据控制逻辑2.4 整体控制逻辑 3. 通讯过程4. SPI 初始化结构体详解 1. STM32 的 SPI 外设简介 STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 …...

VMWare ESXI6.7创建虚拟机
VMware ESXi:专门构建的裸机 管理程序 首先开启ESXI主机 登录ESXI 打开浏览器输入物理机ip,输入账号密码进行登录 创建虚拟机 选择创建类型 创建RedHat7.6 选择存储类型和数据存储 仅一个存储,直接点下一页即可 配置虚拟机硬件和虚拟机附…...

TensorFlow 1.x学习(系列二 :4):自实现线性回归
目录 线性回归基本介绍常用的op自实现线性回归预测tensorflow 变量作用域模型的保存和加载 线性回归基本介绍 线性回归: w 1 ∗ x 1 w 2 ∗ x 2 w 3 ∗ x 3 . . . w n ∗ x n b i a s w_1 * x_1 w_2 * x_2 w_3 * x_3 ... w_n * x_n bias w1∗x1w2∗…...

Openwrt折腾记6-网络摄像头
前言: 前几天买了个电视机上的摄像头,但是估计是电视配置或软件不好,视频通话太卡顿。今天把它装的极路由4的usb上了。由于当初挑的是电视免驱的,所以我猜想是通用的芯片。 调查驱动 LINUX uvc支持型号的列表里 http://www.ide…...

C++判断大端小端
C判断大端小端 1. 基础知识 大端小端其实表示的是数据在存储器中的存放顺序。 大端模式:数据的高字节存放在内存的低地址中,而低字节则存放在高地址中。地址由小到大增加,数据则从高位向低位存放,这种存放方式符合人类的正常思维…...

K8S RBAC之Kubeconfig设置用户权限,不同的用户访问不同的namespace
1.CA签发客户端证书 检查证书是否存在 # ll /etc/kubernetes/pki/ 总用量 48K -rw-r----- 1 kube root 2.1K 3月 2 16:44 apiserver.crt -rw------- 1 kube root 1.7K 3月 2 16:44 apiserver.key -rw-r----- 1 kube root 1.2K 3月 2 16:44 apiserver-kubelet-client.cr…...

CodeForces..学习读书吧.[简单].[条件判断].[找最小值]
题目描述: 题目解读: 给定一组数,分别是 “时间 内容”,内容分为00,01,10,11四种,求能够得到11的最小时间。 解题思路: 看似00,01,10࿰…...

灵活使用Postman环境变量和全局变量,提高接口测试效率!
目录 前言: 环境变量和全局变量的概念 环境变量和全局变量的使用方法 1. 定义变量 2. 使用变量 环境变量和全局变量的实例代码 变量的继承和覆盖 变量的动态设置 总结: 前言: Postman是一个流行的API开发和接口测试工具,…...

Springboot+Vue3 整合海康获取视频流并展示
目录 1.后端 1.1 导入依赖 1.2 代码实战 2.前端 2.1 首先安装海康的web插件,前端vue3代码如下: 1.后端 1.1 导入依赖 <dependency><groupId>com.hikvision.ga</groupId><artifactId>artemis-http-client</artifactId&g…...

Linux——进程退出
目录 一.进程退出时有三种选择: 1.1 echo $?命令: 功能: 打印距离现在最近一次执行某进程的退出码 例2代码: 例3: 例4代码: 1.3 进程运行过程中可能会出现的错误种类: 二.总结ÿ…...

组长给组员派活,把组长自己的需求和要改的bug派给组员,合理吗?
组长把自己的工作派给手下,合理吗? 一位程序员问: 组长给他派活,把组长自己的需求或者要改的bug派给他。组长分派完需求之后,他一个人干两个项目,组长却无所事事,这样合理吗? 有人说…...

Spring注解开发——bean的作用范围与生命周期管理
文章目录 1.bean管理1.1 bean作用范围Scope注解 1.2 bean生命周期PostConstructPreDestroy 2.小结 1.bean管理 1.1 bean作用范围 Scope注解 不写或者添加Scope(“singleton”)表示的是单例 如何配置多例? 在Scope(“prototype”)表示的是多例 1.2 bean生命周…...

C++ > Cmake
目录 编译器 多文件编译与链接 Makefile构建系统 编译器 厂商 C C GNU gcc g main.cpp #include <cstdio>int main() {printf("Hello, world!\n");return 0; }编译器, 是一个根据源代码生成机器码的程序 g main.cpp -o a.out调用编译器程序g, 读…...

Spring的Bean的生命周期
Spring的Bean的生命周期 Spring的Bean的生命周期 Spring的Bean的生命周期 Spring的Bean的生命周期包括以下阶段: (1)实例化Instantiation(2)填充属性Populate properties(3)处理Aware接口的回调…...

在树莓派上搭建WordPress博客网站,并内网穿透发布到公网
✨个人主页:bit me👇 目 录 🐾概述💐安装 PHP🌸安装MySQL数据库🌷安装 Wordpress🍀设置您的 WordPress 数据库🌹设置 MySQL/MariaDB🌻创建 WordPress 数据库 ἳ…...

跨平台C++ Qt数据库管理系统设计与实战:从理论到实践的全面解析
跨平台C Qt数据库管理系统设计与实战:从理论到实践的全面解析 一、引言(Introduction)1.1 数据库管理系统的重要性(Importance of Database Management Systems)1.2 C和Qt在数据库管理系统中的应用(Applica…...

Ubuntu crontab定时任务
1. crontab 相关的命令: 安装:apt-get install cron 启动:service cron start 重启:service cron restart 停止:service cron stop 检查状态:service cron status 查询cron可用的命令:service …...

ChatGPT Prompt Engineering for Developers 大语言模型引导词指导手册
以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 https://learn.deeplearning.ai/chatgpt-prompt-eng 一、Guidelines for Prompting 引导语的编写原则 Prompting Principles 引导语编写原则 Principle 1: Write clear and specific instructions编写清晰…...