一种自动生成软件测试用例的新方法

2017-11-01 17:14
计算机应用与软件 2017年10期
关键词:测试用例脚本软件测试

董 昕 王 杰

1(成都工业学院计算机工程学院 四川 成都 611730)

2(中国电子科技集团第29研究所系统工程部 四川 成都 610036)

一种自动生成软件测试用例的新方法

董 昕1王 杰2*

1(成都工业学院计算机工程学院 四川 成都 611730)

2(中国电子科技集团第29研究所系统工程部 四川 成都 610036)

泛欧集群通信系统是一种为无线用户提供语音和数据服务的公共安全的大型集群通信系统。作为其核心组成部分,区域控制器在广泛区域内提供无线通信和电话互连互通的呼叫处理服务,其自身也是一个大型软件系统。提出区域控制器软件基于Python方法的软件自动化测试用例生成一种创造性方法。该方法不仅能自动创建测试用例,而且支持将创建的测试用例批量上传到存储器及支持批量运行。测试实践证明,该方法可以大大减少软件测试人员的人工干预,而且较大程度地提高测试效率。设计实现了最大化脚本重用和最小化测试脚本维护修改成本, 值得在大型软件系统的大批量自动化测试环境中推广和部署。

大型软件系统 软件自动化测试 测试用例 Python方法 重用

0 引 言

随着社会进步、科技发展及软件应用范围的增广,软件规模愈来愈大。软件不仅仅是在规模上快速地发展扩大,而且其复杂性也急剧地增加,规模达到千万行的大型软件系统层出不穷[1]。规模及复杂性的与日俱增使其错误产生几率大大增加,其中潜在的缺陷与故障所造成损失不断发生。大型软件系统中的关键构件的质量问题可能造成严重损失或灾难,因此质量问题已为开发软件和应用软件的关注焦点。软件缺陷具有“难以看到”和“难以抓到”的特征,很有必要引入软件测试来提高软件质量。而且软件测试并非一次就能完成,通常需要多次执行,其工作量和时间耗费巨大。对可靠性要求更高的大型软件系统,其测试工作已占到整个软件项目工作量的 50%~60%[2]。传统的手工测试虽然仍为基本方式,但自动化测试得到了越来越广泛的运用。作为软件测试重要策略与技术手段,自动化测试可实现人工测试无法实现或难以实现的测试及更高的测试质量与效率。目前越来越多的软件测试必须引入自动化测试技术才能保障顺利完成。在许多情况下特别是在规模较大及复杂性较高的大型软件系统自动化测试能发挥较大作用。作为自动化测试中的重要组成部分之一的自动化测试用例是指自动化测试执行中引用的具体测试用例。如何高效地实现大型软件系统的自动化测试一直是困扰软件测试行业的一个课题,其中的核心问题在于如何快速并准确地创建自动化测试脚本。本文以数字集群通信系统为例,介绍一种新的方法能有效地解决这一问题并提高测试用例复用性。

1 自动化测试平台

1.1 TETRA数字集群通信系统

在介绍自动化测试平台之前,先简要介绍下被测体大型软件系统——数字集群通信系统,它广泛应用于公共安全、交通运输、能源和物流等领域。TETRA系统作为一种为无线用户提供语音和数据服务的数字集群通信系统,在各行各业的指挥调度中发挥了重要作用, 其系统概述图如图1所示。

图1 TETRA系统概述图

图中左上方的区域控制器ZC(zone controller)作为TETRA系统中的核心组成部分,提供组呼、单呼和电话互连互通的呼叫处理服务[3]。区域控制器的测试对确保整个数字集群通信系统正常运行起着不可或缺的作用,其主要组件达40多个,文件数量13 000多个,实现代码高达95多万行。

1.2 GLS测试平台

区域控制器的自动化测试平台GLS(Generic Link Simulator)是通用链路模拟器的缩写。 它是一个专门为了仿真基于消息协议的通信设备而设计开发的测试平台,如图2所示。

图2 GLS自动化测试平台概述图

从图2可以看出,GLS自动化测试平台由链接过程、消息定义文件、测试用例脚本等组成。链接过程仿真其他连接到区域控制器(ZC)的系统组件的较低协议层,维护已建立的链接,并作为GLS测试用例与区域控制器间的接口。其中MCAST_SC_NETCOM 是ZC与基站之间的链接,IZ_NETCOM 是两个ZC之间的链接。链接过程支持手动启动或终止,也支持全自动或半自动启动或终止。链接过程参数和特性由配置文件管理,比如IP地址、端口号、缓存和变量等。每个配置文件都可看作一个链接过程的可能的实例。消息定义文件包含了消息定义及消息在链接中发送和接收的初始值。每个链接过程都有一个与之相对应的消息定义文件。

1.3 现有测试用例生成技术与方法

作为自动化测试中的重要组成部分之一的自动化测试用例,主要分为两类:结构化脚本和共享脚本。脚本类似于结构化程序含有控制脚本执行的指令。优点是健壮性好,可通过循环和调用减少工作量。缺点是脚本较复杂且测试用例“捆绑”脚本中。共享脚本指脚本可被多测试用例使用,一个脚本可被其他脚本所调用。使用共享脚本可节省脚本生成时间和减少重复工作量,当重复任务变化时只需少量修改。优点在于较少开销实现类似测试,维护开销低于线性脚本,能删除重复并可增加智能。缺点是需跟踪更多脚本,给配置管理带来困难,对每个测试仍需定制,测试脚本维护费用高。

GLS测试脚本综合了结构化脚本和共享脚本的优势,既支持控制脚本执行的指令,健壮性好,可通过循环和调用减少工作量,又支持脚本间的相互调用,可节省脚本生成时间和减少重复工作量,当重复任务变化时只需少量修改。ZC的每个测试用例对应着一个用户场景,每个GLS测试脚本对应着相应的消息序列。测试脚本可以调用其他的脚本文件,并支持并行调用,而且GLS脚本可以用来配置及测试被测体,还可以组成测试集。测试集一般由测试相同或相近功能的测试脚本组合而成。

2 创建自动化测试用例

2.1 现有的问题

大型软件系统有大量的较复杂的功能点需要测试,单纯采用传统的手动测试已变的不合时宜。必须引入自动化测试,并且需要大量的测试用例来检验被测体的有效性,例如区域控制器测试项目就有4 000余个测试用例。测试用例的有效创建、重用和维护是自动化测试中最关键的环节之一。本文给出了一种基于Python的自动创建测试用例的新方法并在集群通信系统中得到了验证。

区域控制器主要处理和生成与呼叫(如单呼、电话互联互通和组呼等)的相关信令。由于要在区域控制器引入新的呼叫架构[4](即端到端的呼叫架构),该重构会引入大量接口改变,比如区域控制器与基站BTS(base transceiver station)的接口。接口改变会引起大量自动化测试用例的变动。所以选择高效的创建测试用例的方法显得至关重要。区域控制器-基站间的接口因为端到端的呼叫架构(P2P架构)而有较大的改动。新架构将使用新的P2P消息的原语。在区域控制器-基站间的接口,单呼和电话互联互通消息被合并成一个单一的新的消息,并定义为P2P消息。作为一般规则,一个“P2P”消息将代替对应的两个单呼(U2U)和电话互联互通(INTerconnect)消息[5],如表1所示。

表1 区域控制器-基站间的接口改动

2.2 创建测试用例的方法

由于P2P功能将合并U2U和INT呼叫类型到一个共同的P2P类型,现有的U2U和INT消息将由新的P2P的消息取代[6],这对现有的单呼和电话呼叫的测试用例有相当大的影响。现有测试用例的功能及场景将保持不变,变化主要是改动现有测试用例的接口,基于已有的测试场景创建新的测试用例。消息的变化将被划分为三类:删除现有域/消息、添加新的域/新消息和更改现有的域/消息。在项目调研阶段,作者发现大概有1 400多个自动化测试用例需要做接口的改动,如果纯手工改动工作量大,项目进度要求紧迫,现有项目不可行。所以决定开发Python方法来完成自动化测试用例创建[7]。删除旧的域/消息、替换旧的域/消息和增加新的域或消息都可以通过自动Python方法,如表2所示。

表2 消息变动类型

3 基于Python的自动创建方法

现有U2U消息和INT的消息转换为P2P的消息,将相应创建新的测试用例。为了减少手工改动繁重的工作量,本文开发一个基于Python语言的方法实现自动化创建测试用例。其主要目的是最大限度实现无需人工参与,完成测试用例自动创建。Python语言是一种面向对象直译式计算机程序设计语言,也是一种功能强大的通用型语言,近几年已成为最受欢迎的动态编程语言之一。Python语言清晰、简洁、易读以及可扩展性,使得使用者从语法细节中摆脱出来,专注于解决问题的方法、分析程序本身的逻辑和算法[8]。经过20多年的发展,Python语言已成为一门重要的程序设计语言,在软件开发领域有着广泛的应用。基于上述这些特点,本文选择Python语言来自动创建和更新测试用例,实现测试用例的重用。

3.1 消息创建实例

这项工作覆盖了78个消息的变化,新的P2P消息取代U2U消息和INT的信息。每一个新消息的变化可分为三种类型:修改现有消息/域、添加新的消息/域、删除现有的消息/域。以手持呼叫设备主动发起和建立呼叫过程的消息U2U_CALL_RQST_TYPE为例,在新P2P构架中将变为P2P_CALL_RQST_SVC_TYPE。如下所示:

Send P2P_CALL_RQST_SVC_TYPE

{

# NETCOM_HEADER_SECTION 不变的域

to_device_type : 8 =$DEV_TYPE_CONTROLLER

to_device_num : 8 = 0x00

from_device_type : 8 =$DEV_TYPE_SITE

from_device_num : 8 = 0x00

pkt_type : 8 = ALSLIP_TYPE_SITE_TO_CTRLR

version_num : 8 =$VERSION_NUMBER

# NETCOM_HEADER_SECTION 域名保持不变,而值变化

pkt_sub_type: 8 =$ALSLIP_SUBTYPE_P2P

pkt_svc_type :8 =$ALSLIP_SVC_P2P_CALL_REQ

# OFFSET_SECTION 域名保持不变,而值变化

id_section_offset : 8 = 0x0C

svc_info_section_offset : 8 = 0x18

msg_info_section_offset : 8 = 0x1E

next_offset : 8 = 0x00

# ID_SECTION 域名将改变

source_id : 24 = 0x00 → calling_id : 24 = 0x00

target_id : 24 = 0x00 → called_id_issi : 24 = 0x00

# 新增的域

called_id_issi : 24 = 0x00

called_id_wacn_id : 24 = 0x00

called_id_system_id : 16 = 0x00

calling_id : 24 = 0x00

…}

其中有部分域的域名保持不变,而值变化; 有部分域的域名将改变; 还有部分域是新加的域。由此可见每个消息都包含几种不同的变化,说明采用人工地更新大量测试用例是不可行的,一是客观上工作量巨大,二是手动操作效率较低,三是可能引入一些不易察觉的错误。因此采用Python方法势在必行。

3.2 Python 方法的软件架构和工作流程

该软件框架如图3所示。此框架可分为两部分:核心和变量部分。其核心部分包括解析器和公用部分; 变量部分包括消息部分和配置元素。其中具体分为以下四个部分:通用部分,包括一些通用的常量和函数;解析器,该自动创建框架的核心部分,其主要职责是创建测试用例,比如找到需要创建的域和消息,修改域值等[9];配置部分,存储一些配置文件,例如新接口定义文件;消息部分,包含所有78个消息变化,是非常重要的组成部分,描述消息改变的具体信息。

图3 Python方法软件构架

为了实现消息自动更新的需求,Python方法将在测试用例首先搜索现有的消息及其域。匹配消息内容后,将执行文本匹配及替换等操作,并写回测试用例[10]。该方法的输入为一个现有的测试用例文件或测试用例所在的文件夹。输出为创建后的测试用例文件和记录变化的filechanged.txt文件。具体解释的流程如图4所示。

图4 Python方法工作流程

3.3 Python方法的使用效果

该方法不仅支持对单个测试用例进行更新,也支持对多个测试用例进行批量操作。图5是经过自动化Python方法创建前后的测试用例例子。左侧为创建前的测试用例,右侧为创建后的测试用例。图中深色区域是更新前后发生变化的部分。

图5 Python方法创建前后的测试用例

在实际项目应用中,创建测试用例后还需要考虑后继的软件配置管理工作,其主要目的在于通过在软件生命周期的不同时间点上对软件配置进行标识,并对这些标识的软件配置项的更改进行系统性控制,达到保证软件产品完整性和可溯性。软件配置管理作为软件工程的关键元素,提供了结构化、有序化、产品化的管理软件工程的方法,并应用于整个软件工程的过程。 软件配置管理工具已出现商业化及开源产品,如IBM Rational ClearCase、开源产品CVS、入门级的Microsoft-VSS等。这些产品能够帮助开发人员和测试人员有效地进行软件配置的管理。其中IBM Rational ClearCase是业界广泛应用的软件配置管理工具。 其功能包括版本控制、工作空间管理、建立管理和过程控制。其特点是能推进并行开发,提供强有力的版本控制,透明的工作区管理,有效的构件管理,有弹性的流程管理[11]。

因此该方法还提供了基于版本管理工具Rational ClearCase的自动批量上传测试用例到存储服务器的功能,能高效完成测试用例版本控制工作,如图6所示。这大大节约了测试人员手动上传的时间,而且避免了无意义的重复劳动和人工操作可能出现的错误。

图6 Python方法自动上传测试用例

通过项目实践,自动化Python方法能够处理80%~90%的域的变化。由以前的100%手动创建降为只有10%~20%需要手工创建,极大地提高了测试用例的创建效率。图7为创建测试用例耗时与测试用例数量的关系图,横坐标为测试用例数量,单位为个,纵坐标为创建测试用例所需时间,单位为人月。从图中可以看出,当测试用例的数量小于临界点(本文测试用例数量的临界点为500)时,由于开发Python方法需要一定的时间,采用手工方法创建测试用例耗时更少;当测试用例的数量恰恰等于临界点时,采用手工方法创建测试用例与采用Python方法耗时相当;当测试用例数量大于临界点时,采用Python方法可以大大提高工作效率,而且测试用例的数量越大节约的时间越多。

图7 耗时与测试用例数量关系图

并且由于引入了自动化Python方法,由之前手动创建测试用例预计需要17.8个人月,最终缩短到7.5个人月就顺利完成,减少了10.3个人月的工作量,极大提高了现有测试用例的创建效率,缩短了测试时间,加快了产品开发周期,使软件产品更快面向市场。该方式不仅本身具有较高的复用性,只需少量的改动就可在不同的测试过程中使用,可推广到性能测试中的内存测试[12]运用,还大大提高了测试用例的可重用性。使用该方法能更好地利用了项目的人力资源,将琐碎的任务赋予自动化方式,可以提高测试工作的准确性和测试人员的积极性,将测试人员解脱出来,更多精力投入到创造性工作中,比如设计探索性的测试用例、分析缺陷的原因和进行软件质量的持续改进等。

4 结 语

综上所述,在软件测试项目实践中特别是大型软件系统项目中建议采用Python方法来创建和更新大批量的测试用例。该新方法可以大大减少测试人员的人工干预程度,而且较大程度地提高测试效率,增强测试用例的重用性,值得在大型软件系统或拥有大量自动化测试用例的测试环境中推广和部署,能起到事半功倍的作用。在今后的工作中,将继续运用和提升该方法,比如不仅支持命令行界面,还要支持更友好、更人性化的图形界面;与现有的GLS自动化测试平台融合,该方法嵌入到测试平台中;与Jenkins等持续集成平台协作[13],提供持续的软件版本发布和测试功能等。

[1] 张友生.软件体系结构[M]. 2版.北京:清华大学出版社,2015.

[2] 贺平.软件测试教程[M]. 3版.北京:电子工业出版社,2014.

[3] European Telecommunications Standards Institute. TETRA Voice plus Data Air Interface Part 2 [R].2013.

[4] European Telecommunications Standards Institute. Call Hold [R]. 2003.

[5] European Telecommunications Standards Institute. General requirements for supplementary services [R].2012.

[6] TETRA and Critical Communications Association. TETRA Interoperability Profile (TIP), Part 1: Core [R].2012.

[7] Derezinska A, Halas K. Experimental Evaluation of Mutation Testing Approaches to Python Programs[C]//IEEE International Conference on Software Testing, Verification, and Validation Workshops. IEEE Computer Society, 2014:156-164.

[8] 刘卫国.Python语言程序设计[M].北京:电子工业出版社,2016.

[9] Jiang C, Liu B, Yin Y, et al. Study on Real-Time Test Script in Automated Test Equipment[C]//2009 8th international conference on reliability,maintainability and safety. 2009:738-742.

[10] Marinescu R, Saadatmand M, Bucaioni A, et al. A Model-Based Testing Framework for Automotive Embedded Systems[C]//Software Engineering and Advanced Applications. IEEE, 2014:38-47.

[11] 赵池龙,程努华.实用软件工程[M]. 4版.北京:电子工业出版社,2015.

[12] 董昕.一种新的数字集群通信系统网关内存测试方法[J].现代电子技术,2015,38(7):34-38.

[13] 兰洋,温迎福.持续集成实践 [M].北京:电子工业出版社,2016.

ANEWMETHODFORAUTOMATICALLYGENERATINGSOFTWARETESTCASE

Dong Xin1Wang Jie2*

1(CollegeofComputerEngineering,ChengduTechnologicalUniversity,Chengdu611730,Sichuan,China)2(DepartmentofSystemEngineering,The29thResearchInstituteofChinaElectronicsTechnologyGroupCorporation,Chengdu610036,Sichuan,China)

TETRA communication system is a public security large-scale cluster communication system that provides voice and data services for wireless users. As a core component, the zone controller provides call processing services for wide area radio communications and telephone interconnect calls in a wide area, which is itself a large software system. This paper presents a creative method to the generation of software automated test cases based on the Python of the zone controller software. This method can not only automatically create test cases, but also support the batch of test cases uploaded to memory and support batch operation. Test practice has proved that the new method can greatly reduce the human intervention of software testers and improve the testing efficiency to a great extent. The design achieves maximum scripting reuse and minimizes maintenance and modification costs of test scripts. It is worth popularizing and deploying in large automated testing environments for large software systems.

Large software system Software automated testing Test case Python method Reuse

TP311.56

A

10.3969/j.issn.1000-386x.2017.10.008

2016-12-12。董昕,副教授,主研领域:大型软件系统设计与体系结构及自动化测试。王杰,高工。

猜你喜欢
测试用例脚本软件测试
酒驾
回归测试中测试用例优化技术研究与探索
安奇奇与小cool 龙(第二回)
基于SmartUnit的安全通信系统单元测试用例自动生成
基于OBE的软件测试课程教学改革探索
航天软件测试模型构建与应用
EXCEL和VBA实现软件测试记录管理
快乐假期
小编的新年愿望
软件测试工程化模型及应用研究