首页 > 范文大全 > 正文

面向服务软件的蜕变测试方法

开篇:润墨网以专业的文秘视角,为您筛选了一篇面向服务软件的蜕变测试方法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

收稿日期:2010-12-20;修回日期:2011-01-28。

基金项目:国家863计划项目(2008AA01Z142);陕西省教育厅资助项目(2010JK299)。

作者简介:路晓丽(1973-),女,陕西西安人,副教授, 博士,主要研究方向:软件测试; 董云卫(1968-),男,陕西西安人,教授,博士,主要研究方向:软件的设计、验证和仿真测试。

文章编号:1001-9081(2011)07-1756-03doi:10.3724/SP.J.1087.2011.01756

(1.西北大学 公共管理学院,西安 710069; 2.西北工业大学 计算机学院,西安 710043)

()

摘 要:在面向服务软件的测试过程中,由于在服务发现之前不可知的交互对象和同一个服务可能会有不同实现,往往出现程序执行结果不能提前预知的Oracle问题。为了有效地解决面向服务软件测试中的Oracle问题,基于面向服务架构(SOA)的特点,提出将蜕变测试方法用于面向服务软件的单元测试和集成测试过程中,依据面向服务软件每个服务的自身性质构造蜕变关系,设计蜕变测试类执行测试用例并验证蜕变关系是否保持,如果蜕变关系被违反了,则发现和报告缺陷,从而有效地支持面向服务软件的测试。

关键词:软件测试;面向服务架构;蜕变测试;蜕变关系

中图分类号:TP311.52文献标志码:A

Testing of service-oriented software: a metamorphic testing approach

LU Xiao-li1,2,DONG Yun-wei2

(1.School of Public Administration,Northwestern University,Xi’an Shaanxi 710069,China;

2.College of Computer Science,Northwestern Polytechnic University,Xi’an Shaanxi 710043,China)

Abstract: During the process of service-oriented software testing, Oracle problem that the program result is unpredictable comes into existence frequently because of issues like the unknown communication partners before the service discovery and the potential existence of non-identical implementations of the same service. In this paper, based on the benefits of the SOA environments, Metamorphic Testing (MT) approach was applied in the phase of unit testing and integration testing of service-oriented software. Metamorphic Relation (MR) can be built according to the service properties. A metamorphic testing class can invoke relevant services to execute test cases and use their metamorphic relations to detect failures. Any violation of any relevant metamorphic relation indicates a failure.

Key words: software testing;Service-Oriented Architecture (SOA);Metamorphic Testing (MT);Metamorphic Relation (MR)

0 引言

面向服务架构(Service-Oriented Architecture,SOA)是以服务为基础的松耦合的分布式应用系统的结构,基于服务的形式功能描述为软件系统的灵活性、可扩展性和开放性提供了基础,有效地支持了异构资源共享、动态升级和演化。随着SOA的应用越来越广泛,确保面向服务软件的质量尤为重要,而软件测试是保证面向服务软件质量的主要手段。

SOA的基本元素就是服务,服务就是一个软件模块,这个软件模块能够描述自己,能够被顶级服务发现和定位,能够使用良好的接口和顶级服务进行交互。由于服务是动态发现的,因此没有必要硬编码,服务松散集成在一起,这种结构会极大地增强构建复杂SOA应用的能力。然而,因为服务松散集成,向一个服务提供另一个服务很难提前确定;而且服务通常在异构环境下开发,并且是由不同组织开发的,知道服务实现的所有细节是不现实的,因此,在面向服务软件的测试过程中更多地使用黑盒测试方法。

然而,在对面向服务软件进行黑盒测试时,存在两个问题:首先,一种服务的不同实现的行为表现不一样,一种特定实现的测试结果并不能被看做其他实现的预期结果;其次,一种服务的期望结果很难预测,或者为了预知结果使用人工方法需要花费较大的代价。这两个问题都带来了测试这类应用程序的挑战,这种程序的执行结果不能预知的现象在测试理论中称为“Oracle问题”。本文提出将蜕变测试方法用于面向服务软件的单元测试和集成测试过程中,依据面向服务软件每个服务的自身性质构造蜕变关系,检测几个输出之间的关系来判断服务的功能是否正确,而不仅仅依赖判定单个输出结果是否正确,从而允许在SOA框架下测试结果的交叉验证,能够有效减少SOA应用测试中的Oracle问题的发生。

1 相关研究

目前,国内外在面向服务软件的测试技术领域已有一些研究,提出了一些测试模型和测试方法,它们之间的侧重点各有不同,各有优缺点。文献[1]讨论了面向服务(SOA)的特殊应用Web Service测试,提出了基于XML信息框架产生测试用例的三个规则,并用一个例子进行了说明,表示78%植入的缺陷被发现。文献[2]提出了一种测试Web服务的递增式分组测试方法,并把测试用例应用于服务的一系列实现中。文献[3]提出利用约定中的概念来指导Web Service的测试,建议定义正式的约定来描述Web服务的功能和交互行为,指出测试工作主要用来测试Web服务和约定的一致性。

针对测试过程中出现的程序的执行结果不能预知的现象(即Oracle问题),文献[4]提出了一种蜕变测试(Metamorphic Testing,MT)方法,可以有效地解决测试过程中的Oracle问题。蜕变测试依据被测软件的领域知识和软件的实现方法建立蜕变关系(Metamorphic Relation,MR),利用蜕变关系来生成新的测试用例,通过验证蜕变关系是否被保持来决定测试是否通过[5]。蜕变关系是指函数的一系列输入及相应输出的关系。假设函数f是待测的函数,{I1,I2,…,In}n>1表示程序f的输入数据,基于输入数据{I1,I2,…,In}n>1给定一个关系r,{I1,I2,…,In}n>1相应的输出{f(I1), f(I2),…, f(In)}必须满足属性rf,即:r{I1,I2,…,In}n>1rf{f(I1), f(I2),…, f(In)}。蜕变关系MRf可以表示如下:

MRf{(I1,I2,…,In, f (I1), f (I2),…, f (In))

|r(I1,I2,…,In)

rf(I1,I2,…,In, f (I1),f (I2),…,f (In))}

假设程序p实现的是函数f在定义域D上的功能,可以通过任何的测试用例选择策略选择一些测试用例,表示为:T {t1,t2,…,tk} D,这些测试用例的执行结果为P(t1),P(t2),…,P(tk)。如果这些测试用例的执行并没有发现缺陷,基于函数f的蜕变关系就可以从这些测试用例生成后续测试用例,表示为:T′ {t1′,t2′,…,tm′} D。以正弦(sine)函数为例,根据该函数的重要性质:对于输入变量x1和x2,如果满足x1+ x2π,那么sin(x1)sin(x2),这就是蜕变测试时找到的蜕变关系,若x1是源测试用例,则依据蜕变关系就可以得到新的后续测试用例x2, x2π- x1。通常,蜕变测试依据蜕变关系生成更多的后续测试用例,测试时就会多次执行目标程序,使得程序可以进一步被验证。蜕变测试方法可以用于数值计算[6-7]、无向图遍历[8]、二叉树查询[9]和中间件软件测试[10]等很多领域。

2 面向服务软件的蜕变测试方法

在面向服务软件的测试过程中,单元测试和集成测试非常重要。在单元测试阶段,软件系统中每一个单个服务都经过测试;在集成测试阶段,对已测试过的服务之间交互进行测试。本章主要介绍面向服务软件的蜕变测试方法,描述蜕变测试类如何帮助测试人员实施单元测试和集成测试。

2.1 单元测试

在对服务进行测试时,主要测试服务是否满足了功能需求。可以对每个被测试的服务构建一个相对应的蜕变测试类,蜕变测试类通过多次执行源测试用例和利用蜕变关系生成的后续测试用例,验证蜕变关系是否保持,如果蜕变关系被违反,则蜕变测试类就会报告发现了缺陷。测试步骤如下所示:

1)为每个要被测试的服务构建相应的蜕变测试类。

2)针对被测服务的功能特性,构建一系列蜕变关系MR,表示为MR1、MR2,…

3)针对被测服务的特定功能,可以使用特殊值测试法或者随机测试法为每个服务构建源测试用例集合TS,集合中的每个源测试用例表示为TCi(i0,1,2,…)。

4)对于测试用例集合TS中的每个源测试用例TCi,基于蜕变关系MRi 产生对应的后续测试用例,表示为TCs。

5)蜕变测试类将TS中的每个源测试用例TCi和相应产生的后续测试用例TCs传递给被测服务去执行。

6)蜕变测试类使用蜕变关系检测缺陷,验证MRi(TCi,TCs,S(TCi),S(TCs)),若蜕变关系MRi被违反,则报告任何检测到的缺陷;若蜕变关系MRi没有被违反,则本次测试通过。

2.2 集成测试阶段

在集成测试阶段,当测试某个服务和其他服务之间的交互是否正确时,可以针对每一个服务,找到一个和这个服务有可能进行交互的服务集合;然后对于这个集合中的每一个服务,基于服务之间交互的特点设计一种或多种蜕变关系应用于二者的交互测试中;可以使用单元测试阶段所构建的被测试服务的源测试用例集合,基于新的蜕变关系生成后续测试用例,在交互执行中验证新的蜕变关系是否被保持。如果新的蜕变关系被违反,则蜕变测试类就会报告服务交互过程中的缺陷。测试步骤如下所示:

1)对于每个S,找到和它交互的服务集合ST。

2)对于ST中的每个服务,设计蜕变关系MRX来测试两者之间的交互。

3)基于被测服务S在单元测试阶段构建的源测试用例集合TS中的TCi,利用蜕变关系MRX产生相应的后续测试用例。这时有两种情况:

a)对于TCi,如果被测服务执行TCi不会产生输出消息,则蜕变测试类会基于TCi和蜕变关系MRX直接计算TCi的后续测试用例,表示为TCcc 。

b)对于TCi,如果被测服务执行TCi会产生输出消息,则蜕变测试类会根据输出的结果S(TCi)和蜕变关系MRX来计算后续测试用例S(TCi)′。

4)针对a)情况,蜕变测试类传递TCi给被测试服务执行,并且依据服务注册情况发现ST集合中的服务T1来处理TCi对应的后续测试用例TCcc;针对b)情况,蜕变测试类依据服务注册情况找到ST集合中的服务T2处理S(TCi),找到服务T3处理S(TCi)′。

5)蜕变测试类从相应服务得到测试结果,针对a)情况,服务S处理TCi后将返回结果S(TCi),服务T1处理后续测试用例TCcc后将返回结果T1(TCcc);针对b)情况,服务T2处理S(TCi) 将返回结果T2(S(TCi)),服务T3处理S(TCi)′将返回结果T3(S(TCi)′)。

6)蜕变测试类使用蜕变关系检测缺陷,针对a)情况,验证MRX (TCi,TCcc,S(TCi),T1(TCcc)) ;针对b)情况,验证MRX (S(TCi),S(TCi)′,T2(S(TCi)),T3(S(TCi)′))。若蜕变关系MRX被违反,则报告任何检测到的缺陷;若蜕变关系MRX没有被违反,则本次测试通过。

3 案例分析

下面以一个外汇兑换交易服务的银行应用软件为例,该应用程序共有五个服务,分别为:交易输入服务S1、 外汇兑换服务S2、竞争对手外汇兑换服务S3、中央银行查询汇率服务S4和其他银行查询汇率服务S5。其中,交易输入服务S1负责兑换交易的输入处理;外汇兑换服务S2负责外汇兑换,本例只限于讨论将美元兑换为人民币。通常,银行会提供买入外汇时使用的汇率和卖出外汇时使用的汇率,例如美元和人民币的兑换汇率是一对值8.2796/8.2797,则8.2796为买入汇率,8.2797为卖出汇率。竞争对手外汇兑换服务S3是竞争对手的相同兑换服务,是动态发现的;中央银行查询汇率服务S4负责动态查询中央银行的汇率,例如人民币兑换时查询中国银行关于人民币兑换汇率;其他银行查询汇率服务S5负责查询其他非中央银行的汇率,也是动态发现的。下面以服务S2的测试为例,使用第2章提到的策略和方法,在单元测试阶段和集成测试阶段构建蜕变测试类,基于蜕变关系MR1、MR2和MR3发现和报告缺陷。

3.1 单元测试

单元测试阶段主要对各个服务进行测试,下面以外汇兑换服务S2的测试为例进行说明。假设S2有这样的预期行为:对于在一天内的任何一笔交易能够提供相同的汇率;假设该服务的实现中存在这样的缺陷:该服务处理交易单时不定地使用了买入和卖出汇率。针对上述的需求,测试人员构建蜕变关系:MR1: n S2(x) S2 (nx)。

对外汇兑换服务S2进行测试时,利用第2章提出的策略,可以对外汇兑换服务S2设计一个蜕变测试类,表示为:M_S2。蜕变测试类M_S2负责根据蜕变关系产生后续测试用例,然后传递后续测试用例给服务S2进行处理,接着检查S2(x)和S2(nx)是否保持了蜕变关系MR1,并根据检查结果报告缺陷。

考虑选择初始测试用例t0为x100$的交易,外汇兑换服务S2正确地使用了买入汇率输出了结果,即: S2(100$)827.968.2796×100。蜕变测试类M_S2依据蜕变关系构建后续测试用例t1为y200$2x的交易,并把t1传递给S2进行处理,这次外汇兑换服务S2错误地使用了卖出汇率输出了结果,即:S2(200$)1655.94200×8.2797。最后,蜕变测试类M_S2依据蜕变关系MR1检查S2(100$)和S2(200$),2×S2(100$)1655.92≠1655.94 S2(200$),这时违背了蜕变关系MR1,蜕变测试类将会报告缺陷。因此,该服务处理交易单时不定地使用了买入和卖出汇率的缺陷将会通过上边的蜕变测试方法被发现。

3.2 集成测试

假设外汇兑换服务S2有这样的预期行为:能够比竞争对手提供更好的至少相同的汇率。由于该需求涉及到竞争对手的汇率服务,因此需要在集成测试阶段进行验证。假设S3是动态发现的竞争对手汇率服务,针对这样的需求,可以构建蜕变关系为:“MR2:n S2 (x)≥ S3(n×x)”。 利用第2章提出的策略,可以针对S2和S3的交互特点构建蜕变测试类M_S2S3,蜕变测试类M_S2S3负责根据蜕变关系MR2产生后续测试用例,然后传递后续测试用例给服务S3进行处理,接着检查S2(x)和S3(nx)是否保持了蜕变关系MR2,并根据检查结果报告缺陷。

选择初始测试用例t2为x200$的交易,依据MR2,蜕变测试类M_S2S3计算后续测试用例ts为y60$0.3×200的交易。竞争对手的汇率服务S3被发现后,蜕变测试类M_S2S3传递y给S3进行处理,假设S3使用的汇率为8.2796,则S3(nx)8.2796×0.3×200496.776。蜕变测试类依据蜕变关系MR2进行验证,有:0.3×S2(200)496.782≥496.776 S3(0.3×200),蜕变关系被保持,因此针对这个用例,蜕变测试类M_S2S3没有报告缺陷。

另外,在交易的执行过程中,外汇兑换服务S2需要不断地检测中央银行的相关兑换汇率,外汇兑换服务S2还有这样的预期行为:S2总是动态地从中央银行检测汇率。假设S2的实现中有这样的缺陷:汇率的提供逻辑存在缺陷,从而引起S2有时会使用最小的汇率而不是最大的汇率进行计算。由于该需求涉及到中央银行查询汇率服务和其他银行查询汇率服务,因此仍需要在集成测试阶段进行验证。为了对汇率进行查询,对于每一笔美元和人民币兑换交易,除了交易数额x,还会相应地产生一个查询美元/人民币汇率的输出消息m。针对这样的需求,可以构建蜕变关系为:MR3:S2 (x,m)> S2(x,m′)。这个蜕变关系表示由中央银行通过汇率查询消息m提供的汇率应该好于任何从其他银行通过汇率查询消息m′提供的汇率。利用第2章提出的策略,可以针对这种交互构建蜕变测试类M_S2S,蜕变测试类M_S2S负责根据蜕变关系产生后续测试用例,然后传递后续测试用例给其他银行查询汇率服务进行处理,接着检查结果是否保持了蜕变关系MR3,并根据检查结果报告缺陷。

针对美元和人民币兑换交易,假设S2动态发现了S4和S5来提供人民币汇率报价,而S4是中央银行查询汇率服务,提供的美元/人民币汇率是8.2796/8.2797,S5是其他银行查询汇率服务,提供的美元/人民币汇率是8.2795/8.2798,这个汇率范围较宽,因此并不好。若S2在处理交易的过程中,错误地使用了S5提供的汇率,则S2将会输出:S2(100$)827.958.2795×100。蜕变测试类M_S2S依据蜕变关系MR3产生m的后续测试用例m′, m′依然为“美元/人民币汇率查询”,该消息接着再由M_S2S传递给动态发现的S5来提供相应的汇率,则有S2(100$,m′)8.2795×100827.95。蜕变测试类M_S2S检查结果后发现S2(100$,m)827.95≯827.95S2(100$,m′),违反了蜕变关系MR3,这时就会报告缺陷,因而S2处理过程中存在的汇率提供逻辑缺陷就会通过上述的蜕变测试方法被发现。

4 结语

随着面向服务架构(SOA)的应用越来越广泛,确保面向服务软件的质量尤为重要。测试面向服务架构的应用时需要处理一些问题,包括:在服务发现之前不可知的交互对象、服务的信息好似一个黑盒并不可知和同一个服务可能会有不同实现。为了有效地解决这些问题, 本文将蜕变测试方法用于面向服务软件的单元测试和集成测试过程中,依据面向服务软件每个服务的自身性质,构造输入与输出之间的蜕变关系,并通过蜕变测试类验证蜕变关系是否保持,从而发现和报告缺陷,有效地支持面向服务软件的测试。未来将重点研究如何为服务构建合适的蜕变关系,并进一步研究当蜕变关系设计好后,如何自动地生成蜕变测试类。

参考文献:

[1] OFFUTT J,XU W. Generating test cases for Web services using data perturbation[J]. SIGSOFT Software Engineering Notes,2004,29(5):1-10.

[2] TSAI W T,CHEN Y,CAO Z,et al. Testing Web services using progressive group testing[C]// Proceedings of Advanced Workshop on Content Computing, LNCS 3309. Berlin: Springer,2004:314-322.

[3] KECKEL R,LOHMANN M. Towards contract-based testing of Web services[J]. Electronic Notes in Theoretical Computer Science,2005,20(3):145-156.

[4] CHEN T Y,CHEUNG S C,YIU S M. Metamorphic testing: A new approach for generating next test cases, HKUST-CS98-01[R].Hong Kong: Hong Kong University of Science and Technology,Department of Computer Science and Engineering,1998.

[5] CHEN T Y,TSE T H,ZHOU Z. Fault-based testing in the absence of an oracle[C]// Proceedings of the 25th Annual International Computer Software and Applications Conference. Washington,DC: IEEE Computer Society,2001: 172-178.

[6] CHAN F T,CHEN T Y,CHEUNG S C,et al. Application of metamorphic testing in numerical analysis[C]// Proceedings of the IASTED International Conference on Software Engineering. Calgary: ACTA,1998:191-197.

[7] CHEN T Y,FENG J,TSE T H. Metamorphic testing of programs on partial differential equations: A case study[C]// Proceedings of the 26th Annual International Computer Software and Applications Conference. Washington,DC: IEEE Computer Society,2002:34-45.

[8] CHEN T Y,KUO F C,TSE T H,et al. Metamorphic testing and beyond[C]// Proceedings of the 11th Annual International Workshop on Software Technology and Engineering Practice. Washington,DC: IEEE Computer Society,2004:94-100.

[9] CHEN T Y,TSE T H,ZHOU ZIQUAN. SemiProving: An integrated method based on global symbolic evaluation and metamorphic testing[C]// Proceedings of the 2002 ACM SIGSOFT International Symposium on Software Testing and Analysis. New York: ACM,2002: 191-195.

[10] CHEN W K,CHEN T Y. Integration testing of context-sensitive middleware-based applications: A metamorphic approach[J]. International Journal of Software Engineering and Knowledge Engineering,2006,16(5): 677-703.