一、自动化测试定义
首先来说一下什么是软件测试?
软件测试简单来说就是在规定的条件下对程序进行操作以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
那么什么是自动化测试呢?
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。
实际上严格的说自动化测试是分广义和狭义的。广义的就是测试自动化,它强调的是整个测试过程都由计算机系统完成,范围更广。狭义的就是我们通常所说的自动化测试,主要是说通过某个自动化工具自动执行某项测试任务,处理范围比较小。
随着软件产业的不断发展,市场对软件周期的要求越来越高,于是催生了各种开发模式,如大家熟知的敏捷开发,从而对测试提出了更高的要求。此时,产生了自动化测试,即利用工具或者脚本来达到软件测试的目的,没有人工或极少人工参与 的软件测试活动称为自动化测试。自动化测试的优势如下:
1) 更方便对系统进行回归测试。当软件的版本发布比较频繁时,自动化测试的效果更加明。
2) 可以自动处理原本烦琐、重复的任务,提高测试的准确性和测试人员的积极性。
3) 自动化测试具有复用性和一致性,即测试脚本可以在不同的版本上重复运行,且可以保障测试内容的一致性。
任何成功的自动化测试过程的关键组成部分都是测试自动化框架。降低维护成本,测试工作效率提升和提高质量保证团队的投资回报率ROI是优化敏捷流程时所提供的主要优势之一。
出于以下原因,自动化对于高效的测试过程至关重要:
提高测试效率
降低维护成本
尽可能的减少人工干预
尽可能的加大测试范围
代码的可重用性
二、自动化测试的分类
维度不同,自动化测试的分类方式也不同,以下是笔者认为比较常见的方式。从软件开发周期或者分层的角度来分类:
1) 单元自动化测试 单元自动化测试是指自动化地完成对代码中的类或方法进行测试,主要关注代码实现细节及业务逻辑等方面。
2) 接口自动化测试 接口自动化测试用于测试系统组件间接口的请求与返回。接口测试稳定性高,更适合开展自动化测试。
3) UI自动化测试 用自动化技术对图形化界面进行流程和功能等方面验证的过程。
从测试目的的角度来分类:
1) 功能自动化测试 功能自动化测试主要检查实际功能是否符合用户的需求,主要以回归测试为主,涉及图形界面、数 据库连接,以及其他比较稳定而不经常发生变化的元素。
2) 性能自动化测试 性能自动化测试是依托自动化平台自动地执行性能测试、收集测试结果,并能分析测试结果的一种可以接近无人值守的性能测试。
性能自动化测试有以下特性:对脚本创建和优化提供类库和其他模块支撑。可以设定自动化任务(比如每天根据特定场景执行一轮性能测试)。自动收集测试结果并存储。事中监控(比如场景执行过程中的异常错误自动预警邮件功能)。成熟的平台可以进行自动分析功能(比如哪些事务有问题、哪些资源消耗异常等)。安全自动化测试,类似于性能自动化测试,可以将安全测试的活动自动化,比如可以定期自动扫描安全预警或威胁并上报。
三、使用自动化测试的前提条件及适用场合
前提条件
自动化测试项目的评估需要各方面的考虑,但总体来说还是有一些规律可循的:
1) 任务测试明确,不会频繁变动。
2) 每日构建后的测试验证。
3) 比较频繁的回归测试。
4) 软件系统界面稳定,变动少。
5) 需要在多平台上运行的相同测试案例、组合遍历型的测试,以及大量的重复任务。
6) 软件维护周期长。
7) 项目进度压力不太大。
8) 被测软件系统开发较为规范,能够保证系统的可测试性。
9) 具备大量的自动化测试平台。
10) 测试人员具备较强的编程能力。
当然,并非以上 10 条都具备的情况下才能开展自动化测试工作。根据我们的经验,一般来说,满足以下 3 个条件就可以对项目开展自动化测试:
1) 需求变动不频繁。
2) 项目周期足够长。
3) 自动化测试脚本可重复使用。
1)需求变动不频繁
测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。
项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。
2)项目周期足够长
自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成,这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。
3)自动化测试脚本可重复使用
如果费尽心思开发了一套近乎完美的自动化测试脚本,但是脚本的重复使用率很低,致使其间所耗费的成本大于所创造的经济价值,自动化测试便成为了测试人员的练手之作,而并非是真正可产生效益的测试手段了。
另外,在手工测试无法完成,需要投入大量时间与人力时也需要考虑引入自动化测试。
适用场合
通常适合于软件测试自动化的场合:
(1)回归测试,重复单一的数据录入或是击键等测试操作造成了不必要的时间浪费和人力浪费;
(2)此外测试人员对程序的理解和对设计文档的验证通常也要借助于测试自动化工具;
(3)采用自动化测试工具有利于测试报告文档的生成和版本的连贯性;
(4)自动化工具能够确定测试用例的覆盖路径,确定测试用例集对程序逻辑流程和控制流程的覆盖。
随着测试流程的不断规范以及软件测试技术的进一步细化,软件测试自动化已经日益成为一支不可忽视的力量。能否借助于这支外在力量以及如何借助于这支力量来规范企业测试流程、提高特定测试活动的效率,正是本期所要讨论的话题。
四、自动化测试基本流程
1、制定测试计划
在展开自动化测试之前,最好做个测试计划,明确测试对象、测试目的、测试的项目内容、测试的方法、测试的进度要求,并确保测试所需的人力、硬件、数据等资源都准备充分。制定好测试计划后,下发给用例设计者。
2、分析测试需求
用例设计者根据测试计划和需求说明书,分析测试需求,设计测试需求树,以便用例设计时能够覆盖所有的需求点。一般来讲,基于Web功能测试需要覆盖一下几个方面:
1)页面链接测试,确保各个链接正常;2)页面控件测试,确保各个控件可靠;3)页面功能测试,确保各项操作正常;4)数据处理测试,确保数据显示准确、处理精确可靠;5)模块业务逻辑测试,确保各个业务流程畅通。
3、设计测试用例
通过分析测试需求,设计出能够覆盖所有需求点的测试用例,形成专门的测试用例文档。由于不是所有的测试用例都能用自动化来执行,所以需要将能够执行自动化测试的用例汇总成自动化测试用例。必要时,要将登陆系统的用户、密码、产品、客户等参数信息独立出来形成测试数据,便于脚本开发。
4、搭建测试环境
自动化测试人员在用例设计工作开展的同时即可着手搭建测试环境。因为自动化测试的脚本编写需要录制页面控件,添加对象。测试环境的搭建,包括被测系统的部署、测试硬件的调用、测试工具的安装盒设置、网络环境的布置等。
5、编写测试脚本
根据自动化测试用例和问题的难易程度,采取适当的脚本开发方法编写测试较薄。一般先通过录制的方式获取测试所需要的页面控件,然后再用结构化语句控制脚本的执行,插入检查点和异常判定反馈语句,将公共普遍的功能独立成共享脚本,必要时对数据惊醒参数化。当然还可以用其他高级功能编辑脚本。脚本编写好了之后,需要反复执行,不断调试,知道运行正常为止。脚本的编写和命名要符合管理规范,以便统一管理和维护。
6、分析测试结果、记录测试问题
应该及时分析自动化测试结果,建议测试人员每天抽出一定时间,对自动化测试结果进行分析,以便尽早地发现缺陷。如果采用开源自动化测试工具,建议对其进行二次开发,以便与测试部门选定的缺陷管理工具紧密结合。理想情况下,自动化测试案例运行失败后,自动化测试平台就会自动上报一个缺陷。测试人员只需每天抽出一地你该时间,确认这些自动上报的缺陷,是否是真实的系统缺陷。如果是系统缺陷就提交开发人员修复,如果不是系统缺陷,就检查自动化测试脚本或者测试环境。
7、跟踪测试BUG
测试记录的BUG要记录到缺陷管理工具中去,以便定期跟踪处理。开发人员修复后,需要对此问题执行回归测试,就是重复执行一次该问题对应的较薄,执行通过则关闭,否则继续修改。如果问题的修改方案与客户达成一致,但与原来的需求有所偏离,那么在回归测试前,还需要对脚本进行必要的修改和调试。
五、自动化测试的优劣分析
任何无法服务好业务的技术都是没有价值的,自动化测试也是,只有自动化测试能真正服务好业务,并带来较高性价比,才有价值,单纯拿代码堆叠起来的自动化测试不可取。
1) 谈及自动化测试优势,包括但不局限于以下几点:
· 只需更改测试数据(在需要时),每次执行都可以使用相同的测试脚本
· 与手动执行相比,执行时间要少得多
· 一致的结果
· 填补手动测试可能不适合或不适合的空白。(例如:网络服务)
2) 避免测试人员因重复劳动产生厌倦感。
3) 提高测试效率。
4) 保证每次测试的一致性和可重复性。
5) 更好的利用无人值守时间,可重复利用时间和环境资源。
6) 可运行更多、更繁琐的测试,且快速高效。
7) 回归测试更方便可靠。
8) 可执行一些手工测试执行相当困难或者做不到的测试,如大量的用户并发测试、性能测试等。
9) 自动化测试脚本完全可复用。
10) 支持多环境下的测试。
11) 可以将产品知识固化到脚本中,降低测试人员流动对项目造成的影响。
自动化测试虽然能带来的好处很多,但也存在一些弊端或者不太友好的地方,常见的:
1) 从短期来看,系统开发时间不一定能缩短。
2) 不能取代手工测试。
3) 自动化测试不容易发现界面、布局问题。
4) 手工测试比自动化测试发现的缺陷更多。
5) 测试自动化可能会制约软件开发。
6) 自动化测试工具是死的,它不具备任何想象力。
7) 自动化测试几乎无法发现新缺陷,最大的用途是做回归测试,确保曾经的缺陷没有在新的版本上 重新出现。
8) 在开展前期,自动化测试成本投入高,风险大,且对测试人员的技术、测试工具契合度都有要求。
六、自动化测试主流工具介绍
目前市面上自动化工具非常多,我们可以根据测试需求的不同级别来酌情选择,大体上,有三种级别:代码级别、接口/协议级别、界面级别,以下是根据不同级别对应常用工具及特性。
(1) 代码级别:
◆ XUnit:为每个测试方法产生一个对象实例,可扩展的断言、测试方法和测试类
◆ XMock:仅能适用于纯粹的面向对象的语言,使用多态来实现细节的模拟
◆ Coverage:覆盖率测试工具
(2) 接口/协议级别:
◆ LoadRunner:支持全协议,重点是支持 HTTP 等
◆ SoapUI:支持 WebService 协议 SOAP
◆ WebLoad:支持 HTTP 协议
◆ RPT:重点支持 HTTP 和 TCP/UDP 协议
◆ SilkPerformance:重点支持 HTTP 和 TCP/UDP 协议
◆ HTTPClient,JsOUP:HTTP 协议和 HTML 元素处理
◆ JMeter:支持 HTTP,JMS 协议
(3) 界面(UI)级别:
◆ QTP/UFT:支持 Windows,web,java,.NET 应用程序
◆ RFT:支持 Windows,web,java,.NET 应用程序等
◆ TestComplete:支持各类应用程序及第三方组件,对象识别能力强
◆ Selenium/Watir:支持 Web 应用, 支持多平台、多语言、多浏览器
◆ Sikuli IDE:基于图像识别自动化测试工具,支持所有应用
◆ Appium/MonkeyRunner:Android,IOS 移动应用
七、Python 脚本语言介绍
(1) Python 语言简介:
Python 是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。有人说我们公司的软件是用某语言开发的,所以自动化测试也要选某语言; 其实软件开发语言和软件自动化测试语言没有必然联系。也就是说,基于 Python (+ Selenium)编写的自动化测试脚本既可以测试基于 Java 开发的 Web 项目,也可以测试基于 PHP 开发的 Web 项目。所以,在选择 Selenium 自动化测试语言时不需要考虑与开发语言的一致性。
(2) 为什么选择 Python ?既然 Selenium 可以支持多语言,如 Java、C#、Ruby、PHP 等,那我们为什么会选择 Pyhton 呢?主要有以下几点原因:
第一:简单易学,对编程能力较弱的初学者来说,通过自动化测试技术的实践,不仅可以掌握自动化测试技术,还能掌握一门语法简单且功能强大的编程语言。
第二:通用性强,Python 可以应对很多不同的项目需求,根据不同场景需要选择相应的工具可以大大提高工作效率,例如:
◆ UI 自动化测试/兼容性测试(Python+Selenium)
◆ 接口测试(Python+requests)
◆ 性能测试(Python+Locust)
◆ 安全性测试(Python+Scapy)