自动化测试实现研究
2016-10-15付晓杨海根
付晓+杨海根
[摘要]随着软件技术的发展,需要消耗大量的人力才能进行的大量重复测试带来的低效率,使进行自动化测试成为软件测试的必然趋势。理想的自动化测试能够按计划完全自动地运行,在开发人员和测试人员不可能实行三班倒的情况下,自动化测试可以胜任这个任务,充分地利用了公司的资源,也避免了开发和测试之间的等待。对于功能已经完整和成熟的软件,每发布一个新的版本,其中大部分功能和界面都和上一个版本相似或完全相同,这部分功能特别适合于自动化测试,从而可以让测试达到测试每个特征的目的。
[关键词]自动化测试;实现;需求
[DOI]10.13939/j.cnki.zgsc.2016.34.096
软件测试一个特点是重复性,重复测试让我们产生厌倦心理,因此人们想到用工具来解决重复的问题。另外手工还存在精确性的问题,尤其是面对大量数据需要检查时候,人工的比较和搜索存在效率问题,易出错,覆盖面低。手工测试存在效率问题,这在软件产品的研发后期阶段尤其明显,随着功能日趋增多,需要检查的点和测试内容也越来越多,人工回归测试难度增大,很难在短时间完成大面积测试覆盖。当然,手工测试也有不可替代的地方,比如测试用例的设计,界面和用户体验性测试,正确性的检查,而自动化通过计算能力,不知疲倦地运行,对于数据能精确运行。因此,在需要重复执行界面操作、计算、数值比较、搜索等方面。我们需要充分利用自动化测试工具的高效率来帮助测试人员完成测试用例的执行,加快回归速度,提高测试覆盖率。
1 自动化测试准备
在进行项目自动化测试之前,首先要考虑以下5个方面,其次是衡量项目开展自动化的一些条件。
(1)测试自动化类似于软件开发过程
录制/回放脚本开发方式是不可能应付所有自动化测试需求的,因此需要测试人员掌握必要的开发知识和代码。
(2)测试自动化是一个长期的过程
自动化测试只有长期多次运行才能体现出价值,同时需要考虑自动化测试维护成本。
(3)确保自动化测试的资源,包括人员和技能
最好有专门的自动化测试工程师来保证测试自动化持续,需要对项目负责,设计测试框架和脚本结构,解决各种测试脚本开发问题。
(4)循序渐进开展自动化测试
(5)确保测试过程的成熟度
2 自动化测试开展
自动化测试只有在多次运行后,才能体现出自动化的优势,只有不断地运行自动测试,才能有效预防缺陷,减轻测试人员手工的回归测试工作量,如果一个项目是短期的,则不适合开展,另外,不宜在一个进度非常紧迫的项目中开展自动化测试。
自动化测试不应该在界面尚未稳定的时候开始,但是此时可以着手准备自动化测试计划和准备工作,自动化测试工具评估使用。
首先分析项目的特点,软件系统采用的开发工具、语言、技术平台等,结合测试的类型,测试的要求,同时还要了解目前存在的各种测试工具的情况,根据选择的测试工具,进行试用,制订一份详细的测试工具使用计划。
3 自动化测试工具
软件测试可以按照自动化工具类型进行分类,软件自动化测试工具是实现软件自动化测试必不可少的关键,因此,选择一个优秀的、适合自己的测试项目的测试工具是实现成功自动化测试的第一步。
3.1 按用途分类
软件自动化测试工具按安装用途可分为
测试管理工具
自动化功能测试工具
性能测试工具
单元测试工具
白盒测试工具
测试用例设计工具
自动化测试工具可基于GUI层面进行测试,也可基于代码层面进行测试,只要实现了自动化执行测试用例,自动检测测试数据的测试工具,替代人工进行测试步骤的执行,从而验证应用程序是否满足了特定功能的测试工具。
3.2 基于代码层面的功能自动化测试工具
基于代码层面的功能自动化测试工具主要是一些单元测试工具,例如junit,这些工具直接访问被测试的应用程序的代码,对其中的类和函数进行调用,输入各种测试数据,检查函数的返回值,通过比较返回值与期待值是否一致来判断测试是否通过。
3.3 基于浏览器和DOM 对象模型的功能自动化测试工具
例如selenium,这些测试工具直接访问Web浏览器,利用脚本语言操作浏览器和Web页面中包含的DOM对象,从而达到模拟用户控制浏览导航、页面元素的操作等效果,并直接获取DOM对象的属性,从而获得Web页面元素的各种属性,通过这些属性判断测试步骤结果是否正确。
3.4 基于GUI对象识别的测试工具
目前,大部分自动化功能测试工具,尤其是商业的测试工具,如QTP都是基于GUI对象识别技术来设计的,基于GUI层面的测试需要与各种节目元素打交道,而且不同的编程语言和开发工具在界面的表现、事件的响应上都略有不同。
QTP同样是通过查找应用程序界面中的各个控件的属性来判断是否与测试对象匹配,还可以根据控件的类型,把其拥有的可操作方法列举出来,针对不同平台和语言编写的控件,依据该控件与其他控件能区分的属性来判断其身份,例如控件的类名、控件的文本等。
QTP自动化测试工具是一种自动测试工具。使用QTP的目的是想用它来执行重复的手动测试,主要是用于回归测试和测试同一软件的新版本。因此在测试前要考虑好如何对应用程序进行测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等。QuickTest针对的是GUI应用程序,包括传统的Windows应用程序,以及现在越来越流行的Web应用。它可以覆盖绝大多数的软件开发技术,简单高效,并具备测试用例可重用的特点。其中包括:创建测试、插入检查点、检验数据、增强测试、运行测试、分析结果和维护测试等方面。
4 自动化测试基本流程
基本流程图如下。
4.1 制订测试计划
在展开自动化测试之前,我们需要做个测试计划,明确测试对象、测试目的、测试的项目内容、测试的方法、测试的进度要求,并确保测试所需的人力、硬件、数据等资源都准备充分。
4.2 分析测试需求
用例设计者根据测试计划和需求说明书,分析测试需求,设计测试需求树,以便用例设计时能够覆盖所有的需求点。一般来讲,基于Web功能测试需要覆盖以下几个方面:
(1)页面链接测试,确保各个链接正常;
(2)页面控件测试,确保各个控件可靠;
(3)页面功能测试,确保各项操作正常;
(4)数据处理测试,确保数据显示准确、处理精确可靠;
(5)模块业务逻辑测试,确保各个业务流程畅通。
4.3 设计测试用例
通过分析测试需求,设计出能够覆盖所有需求点的测试用例,形成专门的测试用例文档。由于不是所有的测试用例都能用自动化来执行,所以需要将能够执行自动化测试的用例汇总成自动化测试用例。必要时,要将登录系统的用户、密码、产品、客户等参数信息独立出来形成测试数据,便于脚本开发。
4.4 搭建测试环境
自动化测试人员在用例设计工作开展的同时即可着手搭建测试环境。因为自动化测试的脚本编写需要录制页面控件,添加对象。测试环境的搭建,包括被测系统的部署、测试硬件的调用、测试工具的安装盒设置、网络环境的布置等。
4.5 编写测试脚本
根据自动化测试用例和问题的难易程度,采取适当的脚本开发方法编写测试脚本。一般先通过录制的方式获取测试所需要的页面控件,然后再用结构化语句控制脚本的执行,插入检查点和异常判定反馈语句,将公共普遍的功能独立成共享脚本,必要时对数据进行参数化。当然还可以用其他高级功能编辑脚本。脚本编写好了之后,需要反复执行,不断调试,直到运行正常为止。脚本的编写和命名要符合管理规范,以便统一管理和维护。
4.6 分析测试结果、记录测试问题
应该及时分析自动化测试结果,建议测试人员每天抽出一定时间,对自动化测试结果进行分析,以便尽早地发现缺陷。如果采用开源自动化测试工具,建议对其进行二次开发,以便与测试部门选定的缺陷管理工具紧密结合。理想情况下,自动化测试案例运行失败后,自动化测试平台就会自动上报一个缺陷。测试人员只需每天抽出一点时间,确认这些自动上报的缺陷,是否是真实的系统缺陷。如果是系统缺陷就提交开发人员修复,如果不是系统缺陷,就检查自动化测试脚本或者测试环境。
4.7 跟踪测试BUG
测试记录的BUG要记录到缺陷管理工具中去,以便定期跟踪处理。开发人员修复后,需要对此问题执行回归测试,就是重复执行一次该问题对应的脚本,执行通过则关闭,否则继续修改。如果问题的修改方案与客户达成一致,但与原来的需求有所偏离,那么在回归测试前,还需要对脚本进行必要的修改和调试。
5 自动化测试架构
真正的自动化测试框架可以不是一个程序,它仅仅是一种思想和方法的集合,说白了,就是一个架构,它定义了几层架构,定义了各层互相通信的方式。通过这个架构我们才能在上面进行拓展我们的测试对象(核心体)、测试库(链接库)、测试用例集(各个windows进程)、测试用例(线程),而其之间通过参数的传递进行通信(即相当于系统中的消息传递)。
5.1 几种自动化测试框架思想
(1)模块化思想
就是将一个测试用例中的几个不同的测试点拆分并且将其单个点的测试步骤进行了封装,形成了一个模块。
例如:一个测试用例要对一个登录程序进行测试,其中包括:用户名输入、密码输入以及确定登录。
那么就可以将用户名输入、密码输入、确定登录、取消登录四个操作分别封装在四个不同的模块中。测试时,只需调用其模块即可。这样的话,当一个模块有变化,你只需单独维护那个模块即可,也可以根据模块的不同组合成不同的测试用例。
(2)库思想
就是模块化思想的升华,其为应用程序的测试创造了库文件(可以是APIs、DLLs等),这些库文件为一系列函数的集合。其与模块化思想不同的是,其拓展了接口思想,即可以通过接口去传递参数,而不是一个封死的模块,可以说是一个多了一个“门”的交互型模块。
例如:登录场景,只是将用户名输入、密码输入、确定登录、取消登录封装成一个库,这个库含有一个函数Login,这个函数Login接收两个参数“用户名、密码”,对输入不同的用户名和密码可以进行不同的测试用例。也可以用另外一个函数Cancle。
(3)数据驱动思想
就是变量不变的数据驱动结果,不同的数据导致了不同的结果的产生。而对于数据的导入,可以通过很多方式,例如:Excle表、XML(用在Web中)、数据库(DB)、CSV文件、TXT等都可以。
(4)关键字驱动思想
关键字驱动就是一种面向对象的思想,例如:QTP、RFT中,对象可以为一个数据或者一个关键字,对对象的抓取,可以将其测试对象封装为一个关键字,这样可以对其关键对象进行各种操作了,不同的对象可以驱动不同的测试流向与结果。
5.2 自动化测试发展
(1)第一代自动化测试,即自动化测试思想刚开始诞生时,依靠的是传统的“录制—回放”技术,这种技术与现在的工具的“录制—回放”思想不一样,其实就是一个“模拟”的过程,即模拟对PC的操作而形成的,其基于你对键盘的输入与对鼠标的操作,原理与按键精灵等类似,这种机制对环境的依赖性太强,对变化性太过敏感,因此不可能发展成一种规模。
(2)第二代自动化测试,即脚本化的自动化测试,利用脚本进行结构化的自动化测试,此可以应用于CLI与API的自动化测试,在此就开始集成了模块化与库思想。
(3)第三代自动化测试,开始产生了各种自动化测试思想,包括数据驱动与关键字驱动思想,其伴随着对象化思想的产生,也造就了现在一系列的自动化测试软件,其中都集成了这些思想,从这时候开始,自动化就开始实现了一定的规模,开始运用在各个行业,并且发展趋势越来越快。
5.3 构建自动化测试框架的策略
做一个自动化测试框架主要是从分层上去考虑,而不是简简单单地应用一种思想,它是各种思想的集合体。而其中,可以贯穿着自动化测试的各种思想,例如:对象层中有关键字的思想、可以将对象库标示在Excel表中进行管理,或者应用动态搜索的方式传递对象识别参数。tasks层中可以封装各种方法,形成一个大型的方法库,而每个方法中可以应用数据驱动的思想。
6 结 论
自动化测试的优点是能够很快、很广泛地查找缺陷,同时可以做很多重复性的工作,自动化功能测试工具无须大量的软件测试人员手动地再次执行测试用例,极大地提高了工作效率。可以执行一些手工测试困难或不可能进行的测试。比如,对于大量用户的测试,不可能同时让足够多的测试人员同时进行测试,但是却可以通过自动化测试模拟同时有许多用户,从而达到测试的目的。更好地利用资源。将烦琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例。
参考文献:
[1]张月亲.建立自动化测试系统的必要性[J].国外电子测量技术,2000(6).
[2]常征.功能测试中自动化测试框架的分析与应用[D].北京:北京林业大学,2007.
[3]应杭.软件自动化测试技术及应用研究[D].杭州:浙江大学,2006.