孙 立 哲
(公安部第三研究所eID事业部 上海 201204)
随着现代软件业竞争日趋激烈,软件系统更新频繁,软件测试周期不断缩短。在这种情况下,自动化测试[1]作为能有效提高测试效率的一种手段显得尤为重要,而自动化测试框架在自动化测试实施中起着关键作用。某后端服务产品接口多,接口内部处理逻辑复杂且均支持十几套不同的测试数据,多版本迭代测试时需执行的测试用例数多达上万条,以手动测试方式难以满足短时间版本频繁迭代的测试需求。为了对该产品实现自动化测试,本文基于面向对象技术[2]、XML文档设计与DOM开发技术[3]、HTML文档设计与CSS和JS开发技术[4],借鉴Junit的分层思路[5-6],设计了一套实用性较强的轻量级接口自动化测试框架[7]。该框架具有易于扩展、便于维护、结构清晰等特点,同时具有自动生成内含测试集描述、测试用例描述、接口请求参数和返回数据以及测试结果等详细信息的测试结果数据文件的功能,并支持将测试结果数据以Web页面的形式进行个性化展示与浏览。通过在实际产品中进行自动化测试实践,展示了其能在短时间内高效、准确地完成多个版本、上万条测试用例的快速执行,极大地提高了测试效率,有效地解决因版本短时间频繁迭代所带来的测试压力。同时自动生成的测试结果信息详尽,有利于对测试失败的情况快速地作原因分析。
本文设计的自动化测试框架主要包含两部分。一部分是基于面向对象技术和XML文档DOM开发等技术的自动化测试执行模块,主要实现对测试数据批量配置、测试脚本设计、测试脚本批量执行以及自动生成测试结果数据文件。另一部分是集XML技术、HTML设计、CSS技术和JS开发技术的测试结果统计分析与展示模块,主要实现对测试结果数据文件内数据的统计分析并以Web页面的形式作个性化展示。
自动化测试执行模块基于Eclipse开发平台[8]采用Java编程语言来实现。自动化测试执行模块由测试基类、测试用例集类、测试执行类、测试数据集类、单测试数据类、测试辅助类和测试结果类构成。测试用例集类可以有多个,一个测试用例集类对应一个接口。自动化测试执行模块类图如图1所示。
图1 自动化测试执行模块类图
测试基类是抽象类,包含类构造方法、执行所有测试方法、执行正向测试方法、执行反向测试方法、正向测试方法、反向测试方法。其中,正向测试方法和反向测试方法是抽象方法。
测试数据集类内含一个Map对象属性和一个类构造方法。Map对象属性用于存储各测试数据集,类构造方法用于对Map对象初始化,即用于配置各测试数据。
单测试数据类内含各数据项属性和一个类构造方法。各数据项为接口调用前请求参数数据或用于组装请求参数的可配数据项,类构造方法用于对各数据项初始化。
测试结果类内含文件名配置项属性、XML文档对象属性、XML文档根元素属性、XML测试集元素属性、测试集标识属性、类构造方法、初始化方法、添加测试集方法、添加测试用例方法和写数据到文件方法。文件名配置项用于设定生成的结果文件所在目录及文件名。XML文档对象用于存储整个文档数据。XML文档根元素用于存储所有测试集数据。XML测试集元素用于存储测试用例及其结果数据。测试集标识用于存储测试集唯一标识,以接口名作测试集唯一标识。初始化方法用于创建XML文档并添加根元素。添加测试集方法用于将测试集添加到根元素。添加测试用例方法用于将测试用例及结果添加到测试集。写数据到文档方法用于将XML文档对象中所有数据写入XML文档。对应的测试结果XML文档DOM树结构设计如图2所示。
图2 测试结果XML文档DOM树
测试用例集类继承测试基类,包含测试数据集类对象属性、单测试数据类对象属性、测试用例标识属性、类构造方法、正向测试子方法、反向测试子方法,并实现测试基类的四个抽象方法。正向测试方法中主要完成实例化测试数据集类对象,根据接口支持的测试数据类型提取数据用于实例化单测试数据类对象,基于单测试数据类对象先后执行所有正向测试子方法。反向测试方法中所含操作与正向方法类似,区别是执行所有反向测试子方法。若接口支持测试数据集中所有数据类型,则循环提取数据并执行各子方法。正向测试子方法中包含各正向测试用例脚本,反向测试子方法中包含各反向测试用例脚本。根据接口支持的业务模块分类情况,可以设定一个或多个子方法,便于后期脚本维护。每个测试用例脚本对应一次接口调用。单个测试用例中包含初始化测试用例标识、组装接口请求数据、解析接口返回数据、检查接口返回数据正确性和将用例数据写入测试集。用例数据包括测试用例标识、接口请求数据、接口返回数据、用例执行成功与否等信息。
测试辅助类内含从数据库读取数据方法、向数据库写数据方法、组装接口请求数据方法、解析接口返回数据方法和检查接口返回数据正确性方法以及其他辅助性方法。
测试执行类是整个测试程序的执行入口,内含测试结果类对象属性、主方法、执行所有测试方法、执行正向测试方法和执行反向测试方法。主方法完成对测试结果对象的初始化,配置测试范围(0代表执行所有测试,1代表执行正向测试,2代表执行反向测试),执行测试结果对象的初始化方法,根据测试范围配置执行对应测试,执行测试结果对象的写数据到文件方法。执行所有测试方法中包含初始化测试结果对象的测试集标识、执行测试结果对象的添加测试集方法、实例化各测试用例集类对象并分别调用其执行所有测试方法。执行正向测试方法、执行反向测试方法内部处理过程与执行所有测试方法类似,区别是二者分别调用其执行正向测试方法和执行反向测试方法。
自动化测试执行模块各类之间的调用关系以及业务处理流程如图3和图4所示。反向测试方法内部处理流程和正向测试方法内部处理流程类似,区别是执行测试用例集类的反向测试子方法和生成反向请求数据。
图3 测试执行业务总流程图
图4 正向测试方法内部业务流程图
测试结果统计分析与展示模块由HTML文件、CSS文件、JS文件和XML文件构成。XML文件由自动化测试执行模块自动生成,作为统计分析的数据源。HTML文件定义结果展示主界面整体布局。主界面整体层叠样式通过CSS文件定义,部分样式通过JS文件中脚本作动态更新。CSS文件和JS文件在HTML文件头部引入。主界面主要由概要区、结果汇总区、结果细节区构成。各区内的部分数据通过JS脚本动态更新。概要区展示测试用例执行总数、用例执行成功总数和用例执行失败总数。结果汇总区展示各测试集名及其下所含测试用例执行总数、用例执行成功总数和用例执行失败总数,其中测试集名为超链接。结果细节区默认隐藏,点击某个测试集名超链接后,结果细节区显现且显示该测试集下所有测试用例及其结果信息。点击某测试集名超链接后的主界面效果如图5所示。
图5 点击某测试集名超链接后的测试结果主界面
JS文件中JavaScript脚本主要完成加载XML文件、读取XML文件数据、对全部测试结果作概要统计分析、对某个测试集下的测试结果作统计分析并将相关数据及其显示样式动态更新到HTML文件。其中,对全部测试结果作概要统计分析和对某个测试集下的测试结果作统计分析封装为两个方法,分别在HTML文件加载时和点击某个测试集名超链接时触发调用。对全部测试结果作概要统计分析主要完成概要区和结果汇总区所要展示的各数据统计并动态更新相应数据内容及个别样式(如用例执行成功总数绿色字体突出显示,用例执行失败总数红色字体突出显示)。对某个测试集下的测试结果作统计分析主要完成结果细节区所要展示的各数据提取并动态更新相应数据及个别样式(如结果为Pass时绿色字体突出显示,Fail红色字体突出显示)。
某Web后端服务产品由近三十个接口构成,接口请求数据组装时需作加密或签名处理,接口内部业务逻辑比较复杂,部分接口之间存在一定的关联关系,单套测试数据下覆盖的测试用例总数为二百多条。按业务需求,每个接口均需支持十五套不同的测试数据类型,即需要测试每个接口在所有测试数据类型下的执行情况,因此,单个版本迭代中实际需要覆盖的测试用例总数共计达三千多。若进行手动测试,以每日完成执行三百条用例为例,每一次迭代,测试需一人十日才能完成。如遇产品需短时间紧急上线情况,或版本短时间频繁迭代时,手动测试则显得捉襟见肘。自动化测试能够以更有效、可重复的自动测试环境代替繁琐的手工测试,而且能在更少的时间内完成更多的测试工作[9]。因此,引入自动化测试成为提高测试效率的必然手段。
采用本文的自动化测试框架,针对每个接口开发对应的测试用例集类,配置测试数据集,在测试执行类中实例化测试用例集类并配置执行所有测试用例,进行自动化测试。自动化测试执行以及结果统计分析等总共耗时仅为三个小时。与手动测试相比,自动化测试耗时极少,在测试效率上有着显著优势。测试结果实例如图6所示。
图6 接口自动化测试结果实例效果图
针对某后端服务产品接口多,功能复杂,多版本迭代时测试用例覆盖多达上万条,以手动测试无法满足测试需求的情况,本文基于面向对象技术、XML文档DOM开发技术以及HTML和JS等Web页面开发技术,采用Java编程语言,设计并实现了一套比较有实用性的轻量级接口自动化测试框架。该框架集数据配置、测试用例分类设计、测试批量执行、结果自动归类收集以及统计分析和个性化展示为一体,支持全用例测试、正向测试和反向测试三种测试范围配置;支持测试数据批量配置以及单数据下测试执行和批量数据下测试执行;支持自动生成内含测试集描述、测试用例描述、接口请求参数和接口返回参数以及测试结果等详细信息的测试结果数据文件;支持将测试结果在HTML文件借由JavaScript脚本以约定的CSS样式进行个性化展示与浏览。测试结果个性化展示页面中概要信息简单明了,各测试集汇总信息分类清晰,测试集下各用例信息及对应结果详尽,整个测试结果一目了然,便于浏览。框架本身具有良好的可扩展性和可移植性。数据配置可扩展设计为由XML文档分类存储各测试数据并由测试数据集类构造方法读取XML文档加载各测试数据,适于大数据量测试情况。测试用例集类 具有相对独立性,可在基本不对整个框架作改动的基 础上灵活扩增。该框架的设计思路可移植到其他支持 面向对象技术和XML 文档DOM 开发技术的开发语言 平台,适用不同语言平台下的接口测试。