论软件系统的测试

时间:2022-09-29 08:51:21

论软件系统的测试

摘要:随着信息技术的飞速发展,软件产品已应用到社会各个领域,因而其质量成为人们共同关注的焦点。质量不佳的系统不仅使开发商的维护费用和用户的使用成本大幅增加,甚至可能造成灾难性的后果。软件测试是根据被测试对象设计测试用例,组织测试数据,或者说测试是为了发现程序中的错误而执行程序的过程。测试应是尽一切可能查出程序错误的测试,而一个成功的测试是发现至今为止尚未发现的错误的测试。

关键词:软件;系统测试;错误

中图分类号:TP33 文献标志码:A 文章编号:1673-291X(2011)14-0311-02

一、测试前的准备

计算机软件是基于计算机系统的一个重要组成部分,影响软件产品质量的原因主要有:(1)庞大的系统规模,使得软件及系统的复杂性呈指数增长;(2)需求变化引发的项目各部分之间已知或未知的依赖性可能会相互影响导致更多错误的出现;(3)代码文档的贫乏,导致出错率增加;(4)软件开发工具自身的错误带到了软件中;(4)程序设计人员的经验不足引发错误;(6)项目工期紧张,导致出错率增加。

软件开发完毕后应与系统其他合集在一起,此时须要进行一系列系统集成和确认测试。对这些测试的详细讨论已超出软件工程的范围,这些测试也不可能仅由软件开发人员完成。在软件测试之前,软件工程师应完成以下工作:(1)为测试软件系统的输入信息设计出错误处理通路;(2)设计测试用例,模拟错误数据和软件界面可能发生的错误,记录测试结果,为系统测试提供经验和帮助;(3)参与软件测试的规划和设计,保证软件测试的合理性。

二、软件测试的目标

测试的目标是什么?G. Myers给出了关于测试的一些规则,这些规则可以看做是测试的目标和意义。(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误和测试。

从上述规则可以看出,测试的正确定义是“为了发现程序中的错误而执行程序的过程”。这和某些人通常想象的“测试是为了表明程序是正确的”、“成功的测试是没有发现错误的测试”等等是完全相反的。正确认识测试目标是十分重要的,测试目标决定了测试方案的设计。如果为了表明程序的正确而进行测试,就会设计一些不易暴露错误的测试方案。由于测试的目标是暴露程序中的错误,从心理学角度来看,由程序的编写者自己测试是不恰当的。因此,在综合测试阶段通常由其他人员组成测试小组来完成测试工作。

三、软件测试准则

怎样才能达到软件测试的目标呢?为了能设计出有效的测试方案,软件工程师必须深入理解并正确运用指导软件测试的基本准则。主要的测试准则包括:(1)所有发现测试都应能追溯到用户需求。正如软件测试的目标是发现错误。从用户角度来看,最严重的错误是导致程序不能满足用户需求的那些错误。(2)应该远在测试之前就制订出测试计划。实际上,一旦完成了需求模型就可以着手制订测试计划,在建立了模型之后就可以立即开始设计详细的测试方案。因此,在编码之前就可以对所测试的工作进行计划和设计。(3)应该从“小规模”测试开始,并逐步进行“大规模”测试。通常,首先重点测试单个程序模块,然后把测试重点转向在集成的模块中寻找错误,最后在整个系统中寻找错误。(4)穷举测试是不可能的。所谓穷举测试就是把程序所有可能的执行路径都检查一遍的测试。即使是一个中等规模的程序,其执行路径的排列数也十分庞大,由于受时间、人力和资源的限制,在测试过程中不可能执行每个可能的路径。因此,测试只能证明程序中有错误,不能证明程序中没有错误。但是,精心地测试方案,有可能充分覆盖程序逻辑并使程序达到所要求的可靠性。(5)为了达到最佳的测试效果,应该由独立的第三方从事测试工作。所谓“最佳效果”是指有最大可能性发现错误的测试。

四、 以白盒测试技术为例的测试步骤

除非是测试一个小程序,否则一开始就把整个系统作为一个单独的实体来测试是不现实的。测试过程也必须分步骤进行,后一个步骤在逻辑上是前一个步骤的继续。大型软件系统通常由若干个子系统组成,每个子系统又由许多模块组成。因此,本系统设计的测试过程有下述几个步骤组成:模块测试;子系统测试;系统测试;验收测试;平行运行。测试任何产品都有两种方法:如果已经知道了产品应该具有的功能,可以通过测试检验是否每个功能都能正常使用;如果知道产品的内部过程,可以通过测试来检验产品内部动作是否按照规格说明书正常进行。前一种称为黑盒测试,后一种方法称为白盒测试。本系统重点研究后种技术。

白盒测试的前提是可以把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否能按照预定要求正确工作。白盒测试又称结构测试。下例说明本系统模块所应用两种常用白盒测试技术。

(一)逻辑覆盖测试技术

有选择地执行程序中某些最有代表性的通路是对穷尽测试的唯一可行的替代办法。所谓逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试。例如本系统中某模块在测试中所应用的几种覆盖技术。

1.语句覆盖。为了暴露程序中的错误,至少每个语句执行一次。语句覆盖的含义是,选择足够多的测试数据,使被测程序中每个语句至少执行一次。如1图所示的程序流程图描绘了一个被测模块的处理算法。为了使每个语句都执行一次,程序的执行路径应该是sabced,为此只需要输入下面的测试数据(实际上X可以是任意实数)。

本系统某模块测试流程图如图1所示。

A=2,B=0,X=4

2.判定覆盖。判定覆盖又叫分支覆盖,它的含义是,不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,也就是每个判定的分支都至少执行一次。对于模块来说,能够分别覆盖路径sacbd和sabd的两组测试数据,或者可以分别覆盖路径sacbd和sabed 的两组测试数据,都满足判定覆盖标准。例如,用下面两组测试数据就可以做到判定覆盖:

A=3,B=0,X=3 (覆盖sacbd)

A=2,B=1,X=1 (覆盖sabed)

(二)控制结构测试技术

循环测试专注于测试循环结构的有效性。在本系统的程序设计中应用了3种循环,即简单循环、串接循环、和嵌套循环。下面分别针对这3种循环的测试方法。

1.简单循环。应该使用下例测试集来测试简单循环,其中n是允许通过循环的最大次数。

跳过循环。

只通过循环1次。

通过循环2次。

通过循环m次,其中m

通过循环n-1次。

2.嵌套循环。如果把简单循环的测试方法直接应用到嵌套循环,可能的测试数就会随嵌套层数的增加按几何级数增长,这会导致不切实际的测试数目。B.Beizer提出了一种能减少测试数的方法:

从最内层循环开始测试,把所有其他循环都设置最小值。

对最内层循环使用简单测试方法,而使外层循环的迭代参数(例如,循环计数器)取最小值,并为越界值或非法值增加一些额外的测试。

由内向外,对下一个循环进行测试,但保持所有其他外层循环为最小值,其他嵌套循环为“典型”值。

继续进行下去,直到测试完成所有循环。

3.串接循环。如果串接循环的各个循环都彼此独立,则可以使用前述的测试简单循环的方法来测试串接循环。但是,如果两个循环串接,而且第一个循环的循环计数器值是第二个循环的初始值,则这两个循环并不是独立的。当循环不成立时,建议使用测试嵌套循环的方法来测试串接循环。

参考文献:

[1] 伍利.ATE软件测试方法研究及实现[D].成都:电子科技大学,2004.

[2] 张永梅,陈立潮,马礼,郭韶升.软件测试技术研究[J].测试技术学报,2002,(2).

[3] 薛赛男,赵伟.软件测试技术――计量测试技术的新领域[J].计量技术,2003,(5).

[4] 徐巍,谭德荣,文昌俊.测控系统软件质量模型及评价[J].计算机测量与控制,2005,(8).

上一篇:透过朝韩炮击事件看东北亚安全体系的建构 下一篇:后危机时代对日本核危机的制度与结构反思