面向复用的软件测试方法研究
更新日期:2017-12-30     来源:福建师范大学学报(自然科学版)   浏览次数:216
核心提示:欢迎投稿《福建师范大学学报(自然科学版)》

随着计算机应用的日益普及和深化,软件产品的数量以惊人的速度急剧膨胀,软件在现代社会中的作用是必不可少的,软件不可以出错。而在软件生存周期中软件测试占有重要的地位,并且直接影响着软件的质量[1]。然而,确保高质量的软件通常非常昂贵,因为测试是实现质量的主要手段,而实现质量保证工作会消耗50%到60%的软件开发工作量,并且会阻碍整个项目的进程。正因如此,不充分的质量保证,尤其是测试的不足,造成了软件质量的参差不齐。
如何通过适当的技术来减少软件测试的工作同时又不降低软件的质量?1968年的北大西洋公约组织(NATO)软件工程会议上,人们为了解决“软件危机”,第一次引入了复用概念。可以说,软件复用是避免重复劳动、提高软件质量和生产效率的有效解决方案。通过软件复用,消除了包括分析、设计、编码、测试等在内的许多重复劳动,从而提高了软件开发的生产率,同时,通过复用已开发的高质量成果,可以避免重新开发可能引入的错误,从而提高了软件的质量[2]。因此,面向复用的软件测试方法可以有效的减少测试工作,提高软件质量。

1 软件测试与软件复用
1.1 软件测试的基本概念
Glenford J.Myers认为软件测试是为了发现错误而执行程序的过程。IEEE 610.12标准定义为:(1)运行系统或构件在特定的条件下,观察和记录结果,对系统的某些方面作出评判。(2)分析某个软件项来发现现存的结果和要求的条件之间的区别(即错误)并评价此软件项的特性。基于这些认识,我们可以给出软件测试的定义:软件测试是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终评审,是软件质量保证的关键步骤[3]。软件测试的目的不仅仅是为了发现软件的缺陷与错误,也是对软件的质量进行度量和评估,以提高软件的质量。
1.2 软件复用的基本概念
软件复用是指重复使用“ 为了复用目的而设计的软件”的过程。 软件复用是在软件开发过程中避免重复劳动的有效解决方案 , 旨在使应用程序的开发不再“ 从零开始”, 能够在现有的工作基础上, 充分利用过去应用系统开发中积累的软件资产,诸如源代码、设计方案、需求规约以及测试用例等,实现对软件开发过程中可复用成分最大程度的复用[2]。从定义知软件复用是一个从现有软件构件基础上,而非重新创建软件系统的一个过程。在这个过程中,所有使用到复用的软件技术都有一定的共性,即都涉及到抽象、筛选、特化和集成软件构件。
通过复用技术对传统测试过程模型进行重构,即在测试过程模型中整合测试计划、设计、开发、执行和分析/评估活动中的特定抽象模型,由抽象模型筛选、特化出测试构件并集成。由于创建测试构件和测试文档消耗了大量的软件测试工作在软件生命周期中,所以复用测试构件之前,必须确保复用测试构件消耗的测试时间和精力低于从头开发测试构件。

2 面向复用的测试方法
在本节中,我们确定并讨论各领域应用面向复用测试方法,以及通过应用各种面向复用测试方法减少了测试工作。
2.1 应用领域的面向复用测试方法
复用测试最早被认可是在回归测试中,虽然这种测试策略代价很高,但作为至关重要的软件维护活动之一(维护活动消耗大约三分之二的软件生产的总成本),它能够验证所修改代码的正确性,同时对软件的不变部件没有产生不利影响。复用,具体被用于从现有的测试套件中选择回归测试用例来测试修改后的软件。开发测试和回归测试之间的主要区别是开发测试在生成每个测试用例的抽象级别测试各自的产品,而回归测试则是在可能存在复用的回归测试中建立测试套件。
对于重复测试所有的方法体,一种回归测试策略是,基于完全执行的回归测试,但是这种策略可能会消耗大量的时间和资源;另一种回归测试策略是,基于选择技术的回归测试,通过选择初始测试套件中的一些子集,以减少重新测试所需的时间。回归测试选择技术解决了两个问题:1、从现有测试套件中选择 2、确定在何处需要额外的测试。同时,回归测试选择需在重新执行测试用例所需成本和由于修改软件的副作用而引入缺失故障的风险之间做权衡,为了减少软件开发的时间和工作量,迭代开发战略和复用技术经常被采用。这两种方法都需要频繁验证引起以前所写功能变化的相关代码,这就需要高效的回归测试策略。研究人员已经把很多精力投入到寻找符合成本效益的方法进行回归测试,例如基于修改代码的测试以及基于风险用例的回归测试。
回归测试主要研究四个问题:一是找出程序中发生变化及受变化影响的部分,二是重新测试变化及受影响的部分,三是确定要选择的测试用例的标准,四是复用现有的测试用例并进行修改,产生新的测试用例集。
假设P表示某个程序,P'表示经P修改后的程序,T为P的测试用例集。回归测试过程可以描述如下[4]:
(1)选择T '⊂T,其中T '为程序P '运行时用来测试的测试用例集;
(2)利用T '测试程序P ',以确认程序P '在T '上的正确性;
(3)如果必要,建立P '的新增测试用例集T'';
(4)利用T''测试程序P ',以确定P '在T''上的正确性;
(5)根据测试用例集T '和T''产生新的测试用例集T '''。
2.2 面向复用的测试方法
通过文献调查我们确定了集中面向复用的测试方法,通过诸如内置测试、测试模式、测试框架、测试环境、基于模型的测试、基于域的测试等技术,软件复用已经被应用于软件测试中。
表 1 减少测试工作的面向复用测试方法
面向复用的测试方法 方法描述
基于域的测试 一种基于复用概念的命令系统测试生成方法
基于模型的测试 一种从抽象模型中自动化推导出具体测试用例并执行的测试方法
测试模式 模式用于解决在软件测试环境中重复出现的问题,旨在指导测试代码的设计
测试框架 复用可复用的代码段,测试策略和测试脚本用于回归测试和生成复杂的测试场景
内置测试 在传统的面向对象的软件中内置测试能以代码方式被继承和复用
测试环境 促进测试自动化和可复用性,并通过降低测试成本,提高测试准确性和软件质量,提供测试的重现性

2.2.1基于域的测试
基于域的测试是一种基于领域分析和建模概念的命令系统测试生成方法。通过领域分析,为应用程序提供一系列结构化的域模型,并通过由此产生的域模型生成可复用的测试用例而不仅仅是简单的代码复用。因此,基于域的测试提供的是一种用于产生和复用测试用例的结构。在基于域的测试中,域分析和领域建模便于测试用例在三个层次的抽象复用,这种方法的优点如下:
1、分离简化了测试套件生成的每一步。
2、基于域的测试可以用来作为测试生成工具,一个“可重复使用的”测试案例发生器,
或者用来识别回归测试套件。
3、基于域的测试复用体现在对域的复用和测试用例的复用。
同时,基于域的测试在针对修改软件的测试时拥有巨大优势。修改是在软件开发生命周期的维护阶段进行,这些修改可以是增加新的功能和特性、纠正错误、改善软件性能或资源使用的形式。针对修改软件的测试过程涉及回归测试和设置回归测试运行中的回归测试套件,基于域的测试形成了一个家族式的测试生成方法,家族中的每个元素特征一一对应领域分析和建模的每个问题域,因而使用基于域的测试对修改后的软件进行重新测试,可以确保修改和未变动部分功能正常。