编者按:在开发模型中,测试常常作为亡羊补牢的事后行为,但也有以测试为中心的开发模型。在本文中,让我们对V模型进行考察,看看它有没有问题? 为你分析在软件测试中不可忽略的重要阶段,以达到事半功倍的效果。
   
软件开发的几十年历程业已证明,在开发生命周期中划分阶段的做法是很有好处的。在经典的瀑布模型基础上,还有螺旋模型和过程迭代方法,快速软件开发(RAD)以及较新的Rational统一过程(RUP),但在这些过程方法中,并没有充分强调测试的价值,也没有给测试以足够的重视。

象开发有开发模型一样,测试也有测试模型,尽管这些方法鲜为人知。部分原因是因为很多测试人员已经在他们的工作中积累了大量的经验,利用这些经验可以做好他们的工作。总的来说,测试往往要占据整个开发周期的时间,但即使在很多正规的大学中,也没有为那些即将开始软件生涯的学生们设置软件测试课程。

软件专家们不断在提供新的开发模型,这也是实际开发需要使然,与此同时,在开发过程中也不断感受到这些已存在的方法的不足,例如,还没有比RUP更充分的方法,但RUP也存在一些明显的不足,例如,RUP没有对测试计划进行定位。

V-模型

V模型只得到软件业内比较模糊的认可。V-模型宣称测试并不是一个事后弥补行为,而是一个同开发过程同样重要的过程。

V模型早由已故的Paul Rook在80年代后期提出,V模型被包含在英国计算中心文献中发布,旨在改进软件开发的效率和效果。V模型在欧洲尤其是英国被接受,并被认为是瀑布模型的替代品,而在美国则被误解为是又一种瀑布模型。

在传统开发过程中,仅仅把测试过程作为在需求分析、概要设计、详细设计及编码之后的一个阶段,事实上,V模型的推出也是对此所进行的改进。在瀑布模型中,确实给人们造成了这样的不良影响,即在很多重要开发活动完成后,测试只是收尾工作,而不是主要的过程,尽管有时测试会占据项目周期一半的时间,很多项目主管却仍然还是坚持这么认为。

测试是一项意义显著的工作

V模型描述了一些不同的测试级别,并说明了这些级别所对应的生命周期中不同的阶段。如模型图中所示,左边下降的是开发过程各阶段,与此相对应的是右边上升的部分,即各测试过程的各个阶段。请注意在不同的组织中,对测试阶段的命名可能有所不同。

在模型图中的开发阶段一侧,先从定义业务需求开始,然后要把这些需求不断地转换到概要设计和详细设计中去,后开发为程序代码。在测试执行阶段一侧,执行先从单元测试开始,然后是集成测试、系统测试和验收测试。

V模型的价值在于它非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系:

? 单元测试的主要目的是针对编码过程中可能存在的各种错误,例如用户输入验证过程中的边界值的错误。

? 集成测试主要目的是针对详细设计中可能存在的问题,尤其是检查各单元与其它程序部分之间的接口上可能存在的错误。

? 系统测试主要针对概要设计,检查了系统作为一个整体是否有效地得到运行,例如在产品设置中是否达到了预期的高性能。

? 验收测试通常由业务专家或用户进行,以确认产品能真正符合用户业务上的需要。

在不同的开发阶段,会出现不同类型的缺陷和错误,所以需要不同的测试技术和方法来发现这些缺陷。

发现缺陷的艺术

大多数测试人员比较容易接受V模型的观点,即测试和开发在开发过程中是平等的。即使是开发人员也同样很欣赏V模型所提出的测试级别和开发过程相对应的方式,但很少有人去充分利用V模型的全部威力。很多人认为测试只是在编码或者系统某个部分完成后会发生什么,并且错误地将测试看作为“执行测试”。这样,他们知道要开始执行测试的时候才真正想到了测试。

测试不仅仅是测试。测试过程还包括确定要测试什么(测试范围和条件)以及产品如何被测试(制作测试用例),建立测试环境,执行测试,后再评估测试结果,检查是否达到已完成测试的标准,并报告进展情况。而且,仅有这些还不够,根据很多测试者的经验,当你认为什么地方有问题时,你很可能会在那里发现问题。如测试专家Boris Beizer在他经典的测试著作《Software Testing Techniques (Thomson Computer Press, 1990)》中所说,测试设计可以发现缺陷和错误。

而且,如果你把测试设计放在后阶段,错过了发现构架设计和业务逻辑设计中存在的严重问题的时机,到那时,要修复这些缺陷将很不方便,因为缺陷已经扩散到系统中去了,所以这样的错误将很难寻找和修复,并且代价更高。