朱焕亮ZHU Huan-liang(中航工业信息技术中心 金航数码科技有限责任公司,北京 100028)
基于自动化测试框架的用例研究与实现
朱焕亮
ZHU Huan-liang
(中航工业信息技术中心 金航数码科技有限责任公司,北京 100028)
针对软件自动化测试框架开发自动化测试用例效率不高的现状,分析问题产生原因,提出通过设计自动生成工具来改善测试用例的开发方式,并给出提高自动化测试用例开发效率的具体实现。
自动化测试框架;测试用例自动生成
随着软件系统的日趋复杂以及回归测试等重复性测试在整个软件生命周期中所占的重要地位,我们必须使用自动化测试技术来提高我们的测试效率。自动化测试技术能帮助软件开发人员和测试人员在更短时间内开发出更高质量的产品,通过代替频繁重复的手工测试从而节省了大量的时间和开支。但是利用捕捉/回放测试工具本身无法提供高效的测试。捕捉产生的脚本对于应用的变化过于敏感,以至于测试人员要不停地修改测试脚本。这样的测试脚本不是我们想要的。我们需要的是一个易于维护的,可以应用于各种不同应用的测试模型。这样,计算机就比人更适合完成测试任务。另一方面,手工测试也存在一些局限性:手工测试无法做到覆盖所有代码路径;如果有大量(几千)的测试用例,需要在短时间内(1天)完成,手工测试几乎不可能做到。自动化所能带来的核心价值就是“效率”。本文通过介绍基于金航数码自动化测试框架的自动化测试用例的实现方式,阐述如何提高自动化测试用例开发效率。
自动化测试有别于手工测试,其特点在于需要开发自动化测试用例(编写测试代码),类似于TestNG[1](一个常用的自动化测试执行框架),这些框架过分注重“框架”的功能,强调框架即应用程序的代码开发架构,开发工作就是向其中填入业务代码。业内常见的测试框架良莠不齐,很多框架都是封装5~6个类似TestNG这样的工具,这些底层工具提供不同的功能,而框架的顶层规范了一种自身的测试用例的写法,这样开发人员无需了解底层框架的接口,只需掌握框架的用例编写方式,即可完成测试用例的开发实现。这种自动化测试开发的模式,大多只注重了自动化测试执行的实现,并没有关注自动化测试开发,导致在自动化测试用例开发阶段的工作效率较低,主要体现在以下三方面:
第一,开发代码时,界面元素定位花费时间较多。界面元素定位过程是一个需要通过工具查看,分析出元素在界面中所处位置结构(像Web项目需要用“开发者工具”查看HTML结构),描述元素属性特征,最终通过用代码的形式使计算机识别并进行操作,这个过程不仅需要观察和经验,更需要反复尝试。
第二,开发人员需要手工写入大量的测试代码。在定位好元素的描述信息和操作后,测试用例开发人员需要根据框架对脚本的规则编写测试用例,编写过程中即便有IDE等工具的帮助,也无法保证手工编写的代码没有错误。另外,学习使用这些规则和编程技术有一定难度。
第三,在一个测试用例开发完成的时候,不能对测试流程进行可执行性验证。无论是JAVA代码,还是不需要编译的脚本语言,在开发测试用例的时候,很难通过及时的回放,验证开发出来的测试代码是否符合测试目标。这种开发模式需要完成一整段代码后对脚本进行回放,如果在代码段中出现一段错误,就需要修改并重新执行之前的代码,导致开发时间不必要的延长。
2.1自动化测试框架概述
金航数码自动化测试框架提供一组抽象构件与构件实例间交互的方法,以及一套测试自动化相关问题的解决方案。自动化测试框架由自动化测试开发系统和自动化测试管理端两部分组成。自动化测试开发系统通过“录制-回放”的方式开发自动化测试用例,录制是以通过记录用户鼠标、键盘操作的方式自动生成测试代码,生成过程不需要手工编写程序,自动生成的测试用例可以在本地回放,也可上传到Web管理端远程测试执行。Web管理端是自动化测试各环节的全程可视化管理工具,能够在无人值守的情况下,完成测试环境准备、测试用例分发部署、测试结果收集并自动生成测试报告,能够加速测试效率,缩短测试周期。金航数码自动化测试框架如图1所示。
图1 测试框架
2.2自动化测试用例开发的基础-界面元素定位
界面元素定位被认为是自动化测试用例开发的基础,通过设计开发元素定位的工具,能够抓取到特定的浏览器或被测程序界面的元素结构,并通过记录用户鼠标、键盘的操作行为[2],即键盘、鼠标所触发的事件,自动给出元素的定位方式和信息。元素的定位信息具有唯一性,在监听到事件并由框架自动生成出元素的定位信息后,如果框架自动检查的结果是多个界面元素,通过添加自身属性或从其父类元素属性,然后再次进行验证,重复这一过程,直至获得一个最简洁的且是唯一的界面元素。元素定位信息可以设定属性偏好,每个被测系统的开发风格不一致,比如用EasyUI开发的Web前端HTML的格式十分固定,但Id属性的意义不明显,常规的Xpath表达式(像FireFox的FirePath生成的Xpath表达式)生成工具[4]不能解决这个问题。金航数码的开发工具会自动记录属性偏好,可以把这种模式预先保存到框架中,在识别到这种结构时给出预先设定,尤其在用户主动纠正某个Xpath表达式之后。
2.3测试用例自动生成
准备好界面元素定位信息和测试数据后,就可以生成测试用例了。测试用例由测试数据和测试脚本组成。测试数据包括界面元素定位信息和测试过程中用到的数据。测试脚本是使用Java语言编写的代码,按照关键字驱动[3]规则编写,描述了测试执行的流程。测试数据与测试脚本分离的设计,使测试用例形成一个较小粒度的测试程序,在HP ALM中叫做应用程序空间[5]。测试脚本调试的最大困难在于,如何使每一行代码,都能像一个独立的应用程序一样执行。测试执行依赖于被测程序,被测程序的运行依赖于浏览器、模拟器,所以即便开发出来的代码正确,执行成功与否也要取决于被测程序的状态(例如:界面和时效),框架会为这个被测程序创建一个session连接,通过这个链接与被测程序产生关联,这个session在记录被测程序鼠标事件外,还可以通过回放部分已生成的测试代码来进行调试。调试时,只需通过手动调整被测程序,再通过session来操来执行测试。因为设计框架之初采用Java作为脚本语言,所以在测试脚本调试时就需要设计一个这样的流程:把要执行的代码存放在一个Class中→通过JDK 编译成class文件→使用自定义类加载器加载到虚拟机中→实例化执行对象并注入环境变量→建立与被测程序的连接session。
用例自动生成程序会根据记录用户操作的流程和其他测试资源写入不同的数据库中。在远程测试执行的时候,远程测试机根据需要把这些资源下载到本地,编译执行。
由于采用自动定位的方式,使得记录一个元素操作从首次定位、多次迭代到测试脚本的生成过程,处理时间压缩到3秒钟以内(即便处理复杂的多frame页面),只需鼠标点击界面操作,更重要的是这些定位信息和代码都通过了测试验证,由于验证程序和测试执行程序使用同一段代码逻辑,避免了生成的定位信息和代码执行时不匹配的现象,较好的保持了从开发用例到用例执行的一致性。自主研发框架的定位功能还有一个优势就是根据行业产品的特征,可以定制自己的偏好,生成符合产品风格的定位信息。
测试用例自动生成的直观好处可降低开发用例人员的投入成本,开发者无需了解框架底层工具的具体实现,更不用掌握具体测试用例的编写规则以及编程技术,从而更关注测试用例的设计本身。在自动生成测试用例的同时把测试脚本与测试数据分离储存,通过同步测试管理系统,使远程测试部署执行,用例维护起来更加便捷。
测试脚本动态的调试,使每一行测试代码都可以作为单独的测试程序运行,这个测试程序包含了测试数据、定位信息等,这也正是快速迭代开发用例的方式,抛弃旧的调试流程(即:开发一个完整流程的测试用例→整段代码调试→修改错误→恢复被测程序场景→再次执行),改为以极小的代码段进行调试执行,使测试用例开发时间缩短为之前的1/4左右。
元素自动定位、代码自动生成以及脚本动态调试等这些工具所共同构成的用例开发方式,可以明显降低开发自动化测试用例的时间,并且一定程度上降低了自动化测试框架的使用门槛,从而快速反馈软件质量。
[1] Beust.C,Suleiman.H .Next generation Java testing:TestNG and advanced concepts[M].2007.
[2] 姚砺,束永安.基于Java的捕获/回放测试工具的实现[J].计算机工程,2003(15).
[3] 管小娟,周诚,钱炫宇,刘时敏.基于驱动的自动化测试研究与应用[J].计算机技术与发展,2014(02).
[4] 刘斌,张晓婧.Web信息抽取系统的设计[J].微型电脑应用,2013(03).
[5] 王振华.复杂工作流软件自动化测试方法的研究[D].复旦大学,2009.
Research and implementation of test case based on automated testing framework
TP311.1
A
1009-0134(2016)06-0147-02
2016-04-19
朱焕亮(1974 -),男,高级工程师,硕士,主要从事工业软件研发工作。