无论是在自动化测试实践,还是日常交流中,经常听到一个词:框架。之前学习自动化测试的过程中,一直对“框架”这个词知其然不知其所以然。
最近看了很多自动化相关的资料,加上自己的一些实践,算是对“框架”有了一些理解,这篇博客,就聊聊自动化框架的一些事吧。。。
一、什么是自动化测试框架
简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境。自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本,多种方式、平台执行脚本,良好的报告去跟踪脚本执行结果。
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要记录到缺陷管理工具中去,以便定期跟踪处理。开发人员修复后,需要对此问题执行回归测试,就是重复执行一次该问题对应的较薄,执行通过则关闭,否则继续修改。如果问题的修改方案与客户达成一致,但与原来的需求有所偏离,那么在回归测试前,还需要对脚本进行必要的修改和调试。
三、常见的自动化测试框架
如果是希望在测试自动化工作中使用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请求。
关于自动化测试框架的一些理解和思考总结,就是上面这些内容,提到的一些框架组件可能存在不合理的地方,仅供参考,如有更好的建议,请指出,不胜感激。。。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!