APP下载

面向复用的软件测试方法研究*

2016-04-20石金周汪海涛

计算机与数字工程 2016年3期

石金周 汪海涛 姜 瑛 陈 星

(昆明理工大学信息工程与自动化学院 昆明 650500)



面向复用的软件测试方法研究*

石金周汪海涛姜瑛陈星

(昆明理工大学信息工程与自动化学院昆明650500)

摘要根据研究表明,测试工作消耗了超过半数的软件开发工作量,而这正是阻碍软件质量保证的重要因素之一。软件复用技术在提高软件质量和生产率的同时缩短了软件产品的上市时间。论文讨论面向复用的测试方法,用来减少测试工作。从而进一步在整个面向复用的开发过程中呈现最先进的面向复用的软件测试方法。当前基于软件复用测试的软件开发趋势是朝着内置测试和基于模型的软件测试方向发展。

关键词面向复用的测试方法; 基于模型的测试; 内置测试; 框架和构件

Reuse-oriented Software Testing Method

SHI JinzhouWANG HaitaoJIANG YingCHEN Xing

(Faculty of Information Engineering and Automation, Kunming University of Science and Technology, Kunming650500)

AbstractAccording to the study that testing effort consumes more than half of all development effort and is one of important factors, which obstruct quality assurance. Software reuse enhances quality and productivity and at the same time reduces the time-to-market of the software products. In this paper, reuse-oriented test approaches are discussed, which are used to reduce the testing effort. Further, the state-of-the-art in reuse-oriented test approaches employed in reuse-oriented development processes is presented. The paper believes that the current trend is towards built-in test and model based testing in the applications developed through reusable software.

Key Wordsreuse-oriented test approaches, model based testing, built-in-tests, frameworks and components

Class NumberTP311.5

1引言

随着计算机应用的日益普及和深化,软件产品的数量以惊人的速度急剧膨胀,软件在现代社会中的作用是必不可少的,软件不可以出错。而在软件生存周期中软件测试占有重要的地位,并且直接影响着软件的质量[1]。然而,确保高质量的软件通常非常昂贵,因为测试是实现质量的主要手段,而实现质量保证工作会消耗50%~60%的软件开发工作量,并且会阻碍整个项目的进程。正因如此,不充分的质量保证,尤其是测试的不足,造成了软件质量的参差不齐。

如何通过适当的技术来减少软件测试的工作同时又不降低软件的质量?在1968年的北大西洋公约组织(NATO)软件工程会议上,人们为了解决“软件危机”,第一次引入了复用概念。可以说,软件复用是避免重复劳动、提高软件质量和生产效率的有效解决方案[2]。通过软件复用技术,消除了包括分析、设计、编码、测试等阶段在内的大量重复劳动,提高了软件开发的生产率,与此同时,复用已开发的高质量成果,还可以避免重新开发时可能引入的错误,从而提高了软件的质量。因此,面向复用的软件测试方法可以有效减少测试工作,提高软件质量。

2软件测试与软件复用

2.1软件测试的基本概念

Glenford J.Myers认为软件测试是为了发现错误而执行程序的过程。IEEE 610.12标准定义为: 1) 运行系统或构件在特定的条件下,观察和记录结果,对系统的某些方面做出评判。 2) 通过分析某些软件项来发现现存的结果和所要求的条件之间的区别(即错误)并以此评价该软件项的特性[3]。基于IEEE 610.12的标准定义,可以给出软件测试的定义:软件测试是在软件投入运行前,对软件需求分析、设计规格说明和编码的最终评审,是软件质量保证的关键步骤[3]。不难发现,作为软件质量保证的关键步骤,软件测试的目的就是在发现软件的缺陷与错误的同时,也要对软件的质量进行度量和评估。

2.2软件复用的基本概念

软件复用是指“以复用为目的而设计软件”的过程。软件复用是在软件开发过程中避免重复劳动的有效解决方案,旨在使应用程序的开发不再“从零开始”,能够在现有的工作基础上,充分利用过去系统开发中积累的软件资产,诸如源代码、设计方案、需求规约以及测试用例等,实现对软件开发过程中可复用成分最大程度的复用[2]。从定义不难发现,软件复用是一个从现有软件构件基础上,而非重新创建软件系统的一个过程。在这个过程中,所有使用到复用的软件技术都有一定的共性,即都涉及到抽象、筛选、特化和集成软件构件。

通过复用技术对传统测试过程模型进行重构,即在测试过程模型中整合测试计划、设计、开发、执行和分析/评估活动中的特定抽象模型,由抽象模型筛选、特化出测试构件并集成。由于创建测试构件和测试文档消耗了大量的软件测试工作在软件生命周期中,所以复用测试构件之前,必须确保复用测试构件消耗的测试时间和精力低于从头开发测试构件。

3面向复用的测试方法

本节确定并讨论各领域应用面向复用测试方法以及通过应用各种面向复用测试方法减少了测试工作。

3.1应用领域的面向复用测试方法

复用测试最早被认可是在回归测试中,虽然这种测试策略代价很高,但作为至关重要的软件维护活动之一(维护活动消耗大约三分之二的软件生产的总成本),它能够验证所修改代码的正确性,同时对软件的不变部件没有产生不利影响。复用,具体被用于从现有的测试套件中选择回归测试用例来测试修改后的软件。开发测试和回归测试之间的主要区别是开发测试在生成每个测试用例的抽象级别测试各自的产品,而回归测试则是在可能存在复用的回归测试中建立测试套件。

对于重复测试所有的方法体,一种回归测试策略是,基于完全执行的回归测试,但是这种策略可能会消耗大量的时间和资源;另一种回归测试策略是,基于选择技术的回归测试,通过选择初始测试套件中的一些子集,以减少重新测试所需的时间。回归测试选择技术解决了两个问题: 1) 从现有测试套件中选择; 2) 确定在何处需要额外的测试。同时,回归测试选择需在重新执行测试用例所需成本和由于修改软件的副作用而引入缺失故障的风险之间做权衡,为了减少软件开发的时间和工作量,迭代开发战略和复用技术经常被采用。这两种方法都需要频繁验证引起以前所写功能变化的相关代码,这就需要高效的回归测试策略。研究人员已经把很多精力投入到寻找符合成本效益的方法进行回归测试,例如基于修改代码的测试以及基于风险用例的回归测试。

回归测试主要研究四个问题: 1) 找出程序中发生变化及受变化影响的部分, 2) 重新测试变化及受变化影响的部分, 3) 确定要选择的测试用例的标准, 4) 复用现有的测试用例并进行修改,产生新的测试用例集[4]。

假设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‴。

3.2面向复用的测试方法

通过文献调查确定了集中面向复用的测试方法,通过诸如内置测试、测试模式、测试框架、测试环境、基于模型的测试、基于域的测试等技术,软件复用已经被应用于软件测试中。

表1 减少测试工作的面向复用测试方法

3.2.1基于域的测试

基于域的测试是一种基于领域分析和建模概念的命令系统测试生成方法。通过领域分析,为应用程序提供一系列结构化的域模型,并通过由此产生的域模型生成可复用的测试用例而不仅仅是简单的代码复用。因此,基于域的测试提供的是一种用于产生和复用测试用例的结构。在基于域的测试中,域分析和领域建模便于测试用例在三个层次的抽象复用,这种方法的优点如下:

1) 分离简化了测试套件生成的每一步。

2) 基于域的测试可以用来作为测试生成工具,一个“可重复使用的”测试案例发生器,或者用来识别回归测试套件。

3) 基于域的测试复用体现在对域的复用和测试用例的复用。

图1 基于域的测试过程

同时,基于域的测试在针对修改软件的测试时拥有巨大优势。修改是在软件开发生命周期的维护阶段进行,这些修改可以是增加新的功能和特性、纠正错误、改善软件性能或资源使用的形式。针对修改软件的测试过程涉及回归测试和设置回归测试运行中的回归测试套件,基于域的测试形成了一个家族式的测试生成方法,家族中的每个元素特征一一对应领域分析和建模的每个问题域,因而使用基于域的测试对修改后的软件进行重新测试,可以确保修改和未变动部分功能正常。

3.2.2基于模型的测试

基于模型的测试是一种从抽象的形式化模型中自动化推导出具体的测试用例并执行的测试方法。基于模型的测试允许从系统的行为描述生成大量的测试用例,基于相同的测试用例描述和运行,许多不同类型的脚本可以被执行,同时,测试模型也大面积覆盖了被测应用程序,从而使得测试过程更加高效。模型代表了系统的行为,尽管随着时间的推移,软件的版本规格可能会发生改变,但系统的大部分行为信息依然可以在测试中被复用。

随着统一建模语言(Unified Modeling Language,UML)的普及与发展,基于模型的测试也越来越发挥着重要作用。通常一个良好模型的建立,可以自动生成高质量的测试用例,同时极大方便测试用例的共享和复用。与其他测试技术相比,基于模型的测试具有以下特点[5]:

1) 根据被测试应用程序的分析设计模型,生成测试模型,进而产生测试用例并执行,对测试结果进行分析评价。

2) 测试用例可以利用模型自动生成,大大提高了测试的自动化,同时测试依据覆盖准则,提高了测试的效率。

3) 一定程度上解决了测试失效辨识问题,善于发现其他测试技术难以发现的故障和问题,保证了软件质量。

4) 有利于测试用例的共享和复用。

图2 基于模型的测试过程

3.2.3内置测试

内置测试是一种在构件中插入测试点,并在测试点处预设代码,收集执行信息,从而将测试机制在测试之前内置到构件中去,简化了测试,减少了测试代价[6]。内置测试为构件增加一种“测试/维护”模式,在该模式下可以激活测试点处的预设代码,极大地方便了构件测试。

内置测试将测试作为软件的内在固有属性,把内置测试代码作为成员函数写入源代码,它与对象中的构造函数和析构函数具有相同的语法功能,大大增强了软件系统中自包含的概念。得益于构件复用技术的发展,内置测试构件也可以被继承和复用,极大地增强了软件的可维护性、再工程软件资产的可维护性,并确保了软件运行的一致性。内置测试过程具有如下特点:

1) 开发构件时,在构件内部一些程序关键语句前后建立测试点,同时给每个测试点编号,用来唯一标识该测试点。

2) 测试点即在构件中插入的测试位置,用于引入测试数据或输出测试结果。

3) 通过选择测试点的方法对构件内部全部或部分重要功能和细节算法加以测试。

将测试用例永久的嵌入对象或构件内部,通过扩展机制继承构件的功能,再以附加的测试接口调用这些测试用例。构件使用者在构件正常运行模式下,通过常规的接口来访问构件的功能,在测试/维护模式下访问附加的测试接口并执行内置的测试用例。

下面是一个简单具有内置测试接口的对象的示例:

Class class-name{

//接口(附加)

Data declaration;

Constructor declaration;构造函数声明

Destructor declaration;析构函数声明

Function declaration;自定义函数声明

Tests declaration;//内置测试声明

//具体实现

Constructor;

Destructor;

Functions;

Test Cases;//内置测试用例

}BIT Object;

图3 内置测试过程

3.3复用测试在面向对象框架和组件中的应用

面向对象的测试框架的概念类似于面向对象的应用程序框架。在面向对象的应用程序框架中,框架具有丰富的复用机制,它可以从不同的角度复用代码、设计和分析[7]。一般框架复用代码可以从两个方面来讲,一是利用框架从一个现有的组件库生成应用程序,二是新组件可以从抽象超类中继承大多数的实现。当然,框架能复用代码的最主要原因是其复用了设计。框架提供了可复用的抽象算法和高级的设计方法,从而把一个大系统划分成小的组件,并描述组件间的相互作用。通过标准接口能轻易利用少量现存的组件,来构建一个多层次的系统[7]。基于此,在一个面向对象的测试框架中,可重复使用的代码段是测试脚本或测试策略,目标是重用测试脚本进行回归测试并产生复杂的测试方案。采用基于框架的软件测试方法,可以用框架作为复用组件的基本单位来实现软件产品线,有效地降低软件测试的成本,提高生产效率和软件可靠性。

文献[8]提供了一种基于类的可复用测试用例框架,这种框架可以在应用的工程设计阶使用。而内置测试在对象和面向对象框架的水平上重点介绍了面向对象的框架设计,因此,可以扩展面向对象框架从代码的可复用概念构建测试。在一个面向对象的环境中添加面向对象的内置测试代码,有利于创建可复用、易于维护、健壮的测试代码。嵌入内置测试代码的软件有两种操作模式:正常模式(程序执行)和测试模式(测试和维护)。在正常模式下,内置测试代码是非激活状态,但可以在测试/维护模式下激活。在测试/维护模式下,利用测试封装技术,将测试代码作为内置测试构件嵌入到框架的测试点。这种方法有助于检测由于修改和扩展框架造成的缺陷。嵌入内置测试代码的主要优点如下:

1) 在没有获得任何代码或功能行为的变化情况下,增加了框架的可控制性和可观察性,

2) 测试组件如果需要可以在运行时动态地从框架中添加/分离。

图4 基于类的可复用测试用例框架结构图

4结语

尽管在许多研究文献中存在质量保证技术、单元测试技术、自动化和故障预测模型,对减少测试工作有过系统性的研究。但出人意料的是,没有文献调查研究过面向复用的方法减少了测试工作。其中,首次确认复用测试的应用领域是回归测试(在开发生命周期的维护阶段进行)、测试子类、测试使用的类库、测试面向对象的应用程序框架和组件。

本文第一个目标是找到现有的面向复用的测试方法,以帮助减少测试工作。经过文献调查确定了基于域的测试、基于模型的测试、测试模式、内置测试、测试框架和测试环境等面向复用的测试方法。本文第二个目标是要找到合适的技术来减少测试工作,而不会降低软件的质量。最近的趋势是朝内置测试和基于模型的测试的方向发展。内置的测试和基于模型的测试中使用不同的方式来测试框架、组件并使用框架和组件开发应用程序,例如软件产品线。

参 考 文 献

[1] 马海云,张少刚.软件质量保证与软件测试技术[M].北京:国防工业出版社,2011.

MA Haiyun, ZHANG Shaogang. Software Quality Assurance and Software Testing Technology[M]. Beijing: National Defense Industry Press,2011.

[2] 杨芙清,梅宏.面向复用的软件资产与过程管理[M].北京:清华大学出版社,2008.

YANG Fuqing, HONG Mei. Asset and Process Management for Software Reuse[M]. Beijing: Tsinghua University Press,2008.

[3] 郁莲.软件测试方法与实践[M].北京:清华大学出版社,2008.

YU Lin. Software Testing Methods and Practice[M]. Beijing: Tsinghua University Press,2008.

[4] 周晓波.构件回归测试方法研究与实现[D].昆明:昆明理工大学,2012:8-9.

ZHOU Xiaobo. Research and Implementation for Method of Component Regression Testing[D]. Kunming: Kunming University of Science and Technology,2012:8-9.

[5] 吴艳,张惠.基于模型的软件测试方法研究[J].计算机系统应用,2008(8):87-90.

WU Yan, ZHANG Hui. Software Testing Method based on Model Studies[J]. Computer System & Application,2008(8):87-90.

[6] 高媛,陈立潮,张永梅.软件构件内置测试技术研究[J].自动化技术与应用,2007(7):28-30.

GAO Yuan, CHEN Lichao, ZHANG Yongmei. The Research on Software Component Built-in Testing[J]. Techniques of Automation and Applications,2007(7):28-30.

[7] 包龙翔,曹抗震.设计面向对象的软件框架[J].计算机应用研究,2003(3):27-30.

BAO Longxiang, CAO Kangzhen. Design of Object-oriented Software Framework[J]. Applications Research of Computers,2003(3):27-30.

[8] Wang, Y., King, G., Fayad, M., et al. 2000. On Built-in Test Reuse in Object-Oriented Framework Design[J]. ACM Journal on Computing Surveys,1998,23(23):60-64.

版 权 声 明

本刊已许可万方数据库、中国学术期刊(光盘版)电子杂志社在中国知网及其系列数据库等产品中以数字化方式复制、汇编、发行、信息网络传播本刊全文。著作权使用费与本刊稿酬一并支付。作者向本刊提交文章发表的行为即视为同意我编辑部上述声明。

《计算机与数字工程》编辑部

中图分类号TP311.5

DOI:10.3969/j.issn.1672-9722.2016.03.017

作者简介:石金周,男,硕士研究生,研究方向:软件工程。汪海涛,女,硕士,副教授,硕士生导师,研究方向:软件工程。姜瑛,女,博士,教授,硕士生导师,研究方向:软件工程。陈星,男,硕士,讲师,研究方向:软件工程。

基金项目:国家自然科学基金(编号:61462049)资助。

收稿日期:2015年9月4日,修回日期:2015年10月27日