一种面向交互代码的构件合约化测试方法*
2014-05-22赵艳妮郭华磊
赵艳妮,郭华磊
(1.陕西职业技术学院 计算机科学系,陕西 西安710100;2.西安通信学院信息服务系,陕西西安710106)
0 引言
构件技术是目前实现软件复用的关键技术,构件测试是构件故障发现的重要手段之一[1]。与传统的软件测试不同之处在于:构件的开发者和复用者必须联合起来,才能实现对构件的充分测试,以确保它在新环境中正常工作[2]。由于合约在构件开发者和复用者之间能建立起交流的通道,这种良好的特质,使得基于合约的测试已经成为目前一种重要而独特的构件测试方法[3]。
就目前构件故障检测的研究现状来看,构件化软件的故障包含两种类型:构件本身的故障[4]和构件化软件集成时的故障。对于构件本身的故障,由于构件开发者熟悉构件源代码,因此可以利用传统的测试手段对构件进行测试,这在目前国内外都已经是相当成熟的技术,也都取得了很好的效果,在本文中也不多加阐述。但对于后者,即构件化软件集成时的故障,由于构件的封装性,构件在集成时,构件复用者在构件被用来组装阶段才能发现,也就是说,构件化软件系统的故障,只能被构件系统集成者观察到,而构件集成者对于构件源代码等并不熟悉,这也是构件集成测试中的难点之一。构件集成过程中离不开粘贴代码,在构件集成测试中,粘贴代码也起到了至关重要的作用。为此,根据粘贴代码与构件的交互关系,本文将构件集成测试故障依据构件合约定义的权利和义务划分为构件本身故障和粘贴代码(交互代码)故障,其中,构件本身故障责任在于构件开发者,构件复用者在这种情况下,需要及时的更新构件版本或是要求构件开发者修改当前使用的构件即可;而基于粘贴代码的构件故障的检查目前研究甚少,这也是本文研究的主要内容。本文对基于粘贴代码的构件故障进行讨论,提出了一种面向粘贴代码的构件合约化测试方法,分析了基于粘贴代码的构件测试中的四种故障类型,针对这四种故障类型,给出了合约的适应性,阐述了基于XML的合约构造机理,并以网络购物系统为应用实例验证了该方法的有效性。该方法为捕捉错误,抛出异常信息,快速定位构件集成中的故障位置,准确发现故障原因提供了一种非常有效的途径。
1 基于粘贴代码的合约构造
1.1 合约与粘贴代码的交互机理
为解决软件模块交互问题,B.Meyer把交互的规则定义为合约,并提出了合约化软件理论[5]。合约描述了软件具体的功能。从构件交互角度看,构件扮演两种角色:客户方和服务方。在交互过程中,客户方向服务方请求服务,而服务方向客户方提供服务。合约描述了客户方与服务方相互的责任和义务,合约内容主要包含:前置条件、后置条件和不变式。其中,前置条件是客户方向服务方请求服务前必须满足的条件;后置条件是服务方向客户方提供服务后必须满足的条件;不变式是描述构件正确性、完整性的规则,它是构件交互过程中必须一直保证的规则[6]。通过构件合约划分构件出现故障时的责任:如果违反前置条件,责任在客户方;如果违反后置条件或不变式,责任在服务方。面向交互代码的构件合约化测试过程如图1所示。
图1 构件合约化测试图Fig.1 Component contract testing diagram
图2描述了构件在集成测试过程中粘贴代码、合约检查代码和构件之间的关系,粘贴代码与构件的交互通过合约检查代码验证构件合约的正确性实现[7]。粘贴代码调用构件方法之前,合约检查代码检查合约前置条件,如满足则调用构件方法,否则抛出异常;构件方法调用结束后,合约检查粘贴代码对返回值进行后置条件验证,如满足则说明构件方法调用成功,否则抛出异常。其中,构件动态测试是文中方法的关键研究内容。
图2 粘贴代码与合约构件交互图Fig.2 Interaction diagram of the paste code and contract component
1.2 故障的划分
通过粘贴代码体现出来的构件故障就是构件复用者利用粘贴代码集成测试时发生的与构件上下文关联的故障,主要发生在构件接口消息关联和构件运行状态关联两个方面,具体有以下4种故障[8]
1 )粘贴代码调用构件的某个方法时,传递的参数数量与构件定义的参数数量不一致,或传递的某个参数类型与构件定义的参数类型不一致;
2 )粘贴代码调用构件的某个方法时,返回值类型与构件定义的方法类型不一致,或与测试用例定义的期望值有差异;
3 )粘贴代码中创建构件对象,对象与消息绑定时,发生消息不存在或消息不属于该对象的错误;
4 )粘贴代码调用构件对象时,该对象未被初始化,出现空指针异常。
1.3 合约的构造
构件以文档形式向用户提供属性和方法的描述,由于构件开发语言和开发者编程习惯等因素,构件描述文档的格式缺乏统一标准,粘贴代码无法自动提取构件的测试用例。而XML作为一种标准通用标记语言,具有配置灵活、交互性和统一数据存取格式等优点,在许多领域得到广泛应用。文中使用XML来描述构件的粘贴代码合约和测试用例。测试用例描述包含:测试用例编号、测试用例名称、测试合约编号、测试合约名称和测试报告配置文件等。构件合约描述包含:构件合约编号、构件合约名称、构件测试类名称、构件测试方法名称、前置条件(方法参数个数、参数类型和形参数值等)、不变式和后置条件(返回值类型或期望值等)。
构件集成测试目的是发现构件交互错误和构件互操作性错误,粘贴代码作为构件集成测试中交互的主体,粘贴代码合约的构造至关重要。粘贴代码合约主要根据上述粘贴代码与构件交互的四种故障构造。文中以Java语言构造粘贴代码合约,具体如下
1 )粘贴代码与构件交互的形式参数数量、形式参数类型、方法返回值类型等信息,可以利用Java语言的反射机制读取构件(.jar)的类、类的属性、类的方法、方法的参数信息等[9],将信息嵌入到粘贴代码合约XML文档的相应标记中,集成测试时产生合约检查代码。
2 )粘贴代码与构件交互过程中有时要对参数取值范围、参数格式等进行检查,可以在粘贴代码合约的XML文档中通过边界或正则表达式进行判断。
3 )粘贴代码中构件对象未被初始化和对象与消息绑定错误等故障,通过在粘贴代码合约的XML文档中设置异常捕捉,及时发现错误,抛出异常,同时定位故障位置。
4 )构件方法被调用的次序或构件调用其它方法的次序,可以在粘贴代码的XML文档中定义调用次序,集成测试时动态解析合约XML文档[10],转换成相应代码,按照预定义次序调用。
2 基于合约的构件集成测试
2.1 静态测试和动态测试
构件集成测试主要考虑构件接口交互行为[11],确认构件与系统粘贴代码之间的耦合性,根据需要构建系统需求的构件,以发现构件功能性和非功能性故障,是构件测试的核心。构件集成测试包括静态测试和动态测试[12]。
静态测试主要实现构件粘贴代码的静态分析[13]。粘贴代码与构件交互过程中,测试驱动构造依靠反射原理,对构件源代码进行词法和语法解析,获取构件中类、属性、方法和参数等相关信息,构造测试驱动,解析构件合约,转换为可执行的合约检查代码,调用构件实现,通过合约检查代码验证构件静态信息,测试粘贴代码的故障。
动态测试主要包含测试驱动构造、粘贴代码插桩,合约检查代码产生、测试引擎。在保证粘贴代码正确的基础上,利用反射原理提取构件相应信息并分析,然后以源代码插桩的方式在构件接口的入口和出口出插入粘贴代码,实现构件合约集成测试。插桩技术动态测试主要步骤如下
1 )静态测试构件获取粘贴代码插桩位置;
2 )根据粘贴代码插桩位置获取相应构件合约检查代码;
3 )对粘贴代码进行插桩,动态测试构件。
前置条件检查代码主要在粘贴代码调用构件方法入口处插桩,后置条件在粘贴代码调用方法返回处插桩。通过传递参数的形式,调用构件方法、创建构件对象、引用构件对象等,获取构件动态交互结果,利用合约检查代码中的期望值验证,测试构件在集成测试环境中是否存在故障[14]。
2.2 基于合约检查的测试过程
提出的基于合约检查的构件化软件测试建立在Bertrand Meyer的合约理论上,构件合约文档是构件开发的需求说明,也是测试的出发点。
首先,需要设计构件接口合约文档[15]。从该合约文档出发,从中提出合约元素。针对不同的粘贴代码实现语言,产生合约检查代码,合约检查代码验证合约的正确性,是合约检查的核心内容[16]。其次,通过“白盒”测试技术,通过反射原理获取构件相关信息,通过构件源代码的词法语法分析,确定粘贴代码与构件接口交互位置,将粘贴代码插入到该位置。然后,解析构件合约文档,提取相关合约信息,并转化为相应语言代码插入到集成测试粘贴代码中[17]。最后,动态执行粘贴代码,调用构件相应接口,检查验证构件合约的正确性,捕捉异常,定位故障位置,记录测试结果,生产测试报告。该测试状态如图3所示。
图3 基于合约检查的构件测试过程图Fig.3 Component testing process diagram based on contract checking
利用“黑盒”验证构件与粘贴代码的耦合性,利用“白盒”分析构件集成测试中的粘贴代码,检查构件合约,定位故障位置,划分构件故障的责任。该方法避免传统构件测试方法的不足,是一种可行的构件“灰盒”测试方法[18]。
2.3 构件测试用例验证
本文以网络购物系统(Online Shopping system,简称CSS)作为研究实例。该系统包含3个构件:第三方支付构件(Third-party payment,简称TPP)、商家构件Business、消费者构件Customer和系统运行环境CSS Context。图4是网络购物系统构件的UML交互图。
图4 网络购物构件交互图Fig.4 Interaction diagram of network shopping component
以商家构件与第三方支付构件的pay方法间的交互为例,描述基于合约检查的构件测试过程。假如消费者在第三方支付账户余额是300,测试配置体系部分的主要工作是定义一系列的XML文件。
1 )网络购物系统构件OSS合约描述为
2 )测试用例的检查描述为
3 )测试结果
测试用例中输入了一个申请支付金额参数“500.00”,合约检查比较余额小于支付金额,捕获到支付失败信息,抛出自定义的无法支付异常。测试结果见表1.
表1 测试结果Tab.1 Testing result
用户根据需求,可在测试报告中定义错误信息类型和输出格式,并根据合约编号、测试用例编号和抛出异常信息,快速定位构件集成测试故障位置,准确找出故障的原因。
3 结论
文中提出一种面向交互代码的构件合约化测试方法,以合约定义粘贴代码与构件的交互准则,通过验证构件集成测试合约,捕捉错误,抛出异常信息,快速定位故障位置,准确找出故障原因。该测试方法减少了构件集成测试粘贴代码的冗余,提高了测试灵活性,缩短了开发周期,降低了开发成本。
References
[1] 史浩辉,何 炜.基于构件的指控软件复用[J].计算机技术与发展,2011,21(2):159 -161.
SHI Hao-hui,HE Wei.Component-based command control software reused[J].Computer Technology and Development,2011,21(2):159 -161.
[2] Briand L C,Labiche Y,Swka M M.Automated,contractbased user testing of commercial-off-the-shelf compo-nents[C]//Proceedings of the 28th International Conference on Software Engineering ACM,2006:92 -101.
[3] 余金山,刘志伟.一种基于内置合约检查和可配置接口的软构件测试技术[J].计算机应用研究,2011,28(5):1 756-1 760.
YU Jin-shan,LIU Zhi-wei.Software component testing technique based on built-in contract checking and configurable interface[J].Application Research of Computers,2011,28(5):1 756 -1 760.
[4] 刘友生,陈剑平,陈一平.自适应Web后台数据管理构件的设计与实现[J].西安科技大学学报,2008,28(4):766-770.
LIU You-sheng,CHEN Jian-ping,CHEN Yi-ping.Design and realization of management component of adaptive background data based on Web[J].Journal of Xi’an University of Science and Technology,2008,28(4):766- 770.
[5] Meyer B.Object-oriented software construction[M].Prentice Hall,1997.
[6] 叶婷婷,王映辉.一种基于AOP的构件合约化测试方法与实现[J].计算机技术与发展,2012,22(6):71-74.
YE Ting-ting,WANG Ying-hui.A Contract testing method and implementation based on AOP for component software[J].Computer Technology and Development,2012,22(6):71 -74.
[7] 陈锦富,卢炎生,谢晓东.软件错误注入测试技术研究[J].软件学报,2009,20(6):1 425 -1 443.
CHEN Jin-Fu,LU Yan-Sheng,XIE Xiao-Dong.Research on software fault injection testing[J].Journal of Software,2009,20(6):1 425 -1 443.
[8] 韦 群,王 珏.软件缺陷及其对软件可靠性的影响分析[J].计算机应用与软件,2011,28(1):145-149.
WEI Qun,WANG Jue.Software defects and analysis of its impact upon software reliability[J].Computer Applications and Software,2011,28(1):145 -149.
[9] 赵 硕.构件的形式化描述及其组合研究[D].杭州:浙江师范大学,2012.
ZHAO Shuo.Research on component formal semantic and combination[D].Hangzhou:Zhejiang Normal University,2012.
[10]戚艳军,龚尚福.用户角色的XML动态加密方法研究[J].西安科技大学学报,2012,32(1):101 -106.
QI Yan-jun,GONG Shang-fu.Dynamic encryption of XML based on user roles[J].Journal of Xi’an University of Science and Technology,2012,32(1):101 -106.
[11]丁雪芳,张 锐.一种基于场景的轻量级软件架构分析方法[J].西安科技大学学报,2011,31(5):636 -641.
DING Xue-fang,ZHANG Rui.A scenario-based software architecture analysis method[J].Journal of Xi’an University of Science and Technology,2011,31(5):636 -641.
[12]付立东.一种对分划分的复杂网络社团检测方法[J].西安科技大学学报,2012,32(5):648 -651.
FU Li-dong.Detecting of communities in complex networks with two partitioning approach[J].Journal of Xi’an University of Science and Technology,2012,32(5):648-651.
[13]张毅坤,叶 涛,邢传玉.面向构件化软件的合约检查测试框架[J].计算机工程,2006,32(20):78 -80.
ZHANG Yi-kun,YE Tao,XING Chuan-yu.Contractchecking test framework for component-based software[J].Computer Engineering.2006,32(20):78 -80.
[14]丁晓明.基于构件的软件开发关键问题研究[D].重庆:西南大学,2012.
DING Xiao-ming.Research about key problems of component based on software development[D].Chongqing:Southwest University,2012.
[15]蔡立志,阎 婷.大数据背景下软件测试的挑战与展望[J].计算机应用与软件.2014,31(2):5 -8.
CAI Li-zhi,YAN Ting.Challenge and prospect on software test under big data background[J].Computer Applications and Software,2014,31(2):5 -8.
[16]付剑平,陆民燕.软件测试性设计综述[J].计算机应用,2008,28(11):2 915 -2 918.
FU Jian-ping,LU Min-yan.Survey of software design for testability[J].Computer Applications,2008,28(11):2 915-2 918.
[17]王世安.基于敏捷开发的构件化软件可靠性研究[J].微电子学与计算机,2011,28(3):119 -122.
WANG Shi-an.Research on component-based software reliability based on agile development[J].Microelectronics & Computer,2011,28(3):119 -122.
[18]林海波.多参数模拟密封舱测控系统与参数影响分析[J].西安科技大学学报,2010,30(6):744 -749.
LIN Hai-bo.Multi-parameter simulate hermetic cabin control system and its parameters impact analysis[J].Journal of Xi’an University of Science and Technology,2010,30(6):744 -749.