我们知道软件开发比较经典的模型有很多,比如瀑布模型、螺旋模型、增量模型、智能模型以及基于网络的面向对象模型等。这些模型贯穿软件开发的过程,但是这些模型中没有给予软件测试足够的重视。
虽然软件测试的发展比软件开发要短,但软件测试也已经总结出了很多的模型。这些模型将测试活动进行总结抽象。明确了软件测试与软件开发之间的关系,是测试管理的重要参考依据。
软件测试过程模型是对测试过程的一种抽象,用于定义软件测试的流程和方法。常见的软件测试过程模型有:V模型、W模型、H模型、X模型等。这些测试模型兼顾了软件开发过程,也都把开发过程进行了很好的总结,体现了测试与开发的融合。
V模型是最具有代表意义的测试模型,主要反映测试活动与分析设计活动的关系。
V模型的策略既包括低层测试,又包括高层测试。低层测试是为了确保源代码的正确性,高层测试是为了使整个系统满足用户的需求。如图 3.2 所示,从左到右,描述了基本的开发过程和测试行为。
图中的箭头表示时间方向,左边下降的是开发过程各阶段,与此相对应的是右边上升的部分,即各个测试过程中的各个阶段。
图 3.2 V模型
V模型在测试中的地位,就和瀑布模型在开发中的地位一样,是最基础的一种模型,其他模型都是从这个模型演化来的。V模型指出,单元测试和集成测试应检测程序的执行是否满足软件设计的要求;系统测试应检测系统功能、性能的质量特性是否达到系统要求的指标;验收测试确定软件的实现是否满足用户需要或合同的要求。它非常明确地标明了测试过程中存在的不同级别,强调在整个软件项目开发中需要经历的若干个测试级别,并与每一个开发级别对应。
但是V模型也存在一定的局限性,它把测试作为编码之后的一个阶段,是针对程序运行的寻找错误的活动,而忽视了测试活动对需求分析、系统设计等活动的验证和确认的功能。需求分析等前期产生的错误直到后期的验收测试才能发现,测试的对象不应该仅仅包括程序,没有明确指出对需求、设计的测试。也就是说,V模型没有明确说明早期的测试,不能体现“尽早地和不断地进行软件测试”的原则。
在V模型中增加软件开发各个阶段中应同步进行的验证和确认活动,演化为一种W模型。W模型可以说是V模型自然而然的发展。它强调测试伴随着整个软件开发周期,而测试的对象不仅仅是程序,需求、功能和设计同样要测试。
W模型中测试与开发是同步进行的,从而有利于尽早地发现问题,强调的是过程的正确性和结果的正确性。比如:需求分析完成后,测试人员就可以参与到对需求的验证和确认活动中,以尽早地找出其中的缺陷;同时对需求的测试,也有利于测试人员及时了解项目难度和测试风险,可以及时制订应对措施,这将显著减少总体测试时间、加快项目进度。W模型如图 3.3 所示。
图 3.3 W模型
W模型仍存在局限性。在W模型中把开发活动看成是从需求开始到编码结束的串行活动;另外,测试和开发也保持着一种线性的前后关系,只有上一阶段完全结束,才可以开始下一个阶段的活。W模型不能自发测试以及变更调整,不能支持迭代的开发模型。
通过前面的学习我们知道,V模型和W模型都把软件的开发视为需求、设计、编码等一系列串行活动。但实际情况是,这些开发各阶段活动在很多时候是可以交叉进行的,所以各个测试阶段之间并不存在严格次序关系。同时,各个层次的测试(如单元测试、集成测试、系统测试等)也存在反复触发、迭代的关系。所以上面的两种模型相对于当前软件开发工作复杂多变的情况,均存在一些不完美之处。
为了改善这种情况,有专家提出了H模型。软件测试H模型是一个独立的流程,贯穿于产品的整个生命周期,与其他流程并发进行,将测试准备活动与测试执行活动清晰地体现出来。软件测试原则“尽早准备,尽早执行”,强调测试是独立的,只要测试准备完成,就可以执行测试。H模型如图 3.4 所示。
图 3.4 H模型
图中的流程只表示了在整个生产周期中某个层次上的一次测试的循环。图中右侧所标的“其他流程”可以是任意开发流程。也就是说,只要测试条件成熟了,测试准备活动完成了,测试执行活动就可以进行了。
H模型的缺点过于模型化。比如测试就绪点分析困难:测试很多时候,你并不知道测试准备到什么时候是合适的,就绪点在哪里,就绪点的标准是什么,这就对后续的测试执行的启动带来很大困难。H模型重点在于理解其中的意义来指导实际开发工作,而模型本身并无太多的直接指导执行的作用。
X模型是对V模型的改进,X模型提出针对单独的程序片段进行相互分离的编码和测试,此后通过频繁的交接,通过集成,最终成为可执行的程序。X模型如图 3.5 所示。左边描述的是针对单独程序片段所进行的相互分离的编码和测试,此后将进行频繁的交接,通过集成最终成为可执行的程序,然后再对这些可执行程序进行测试。已通过集成测试的成品可以进行封装并提交给用户,也可以作为更大规模和范围内集成的一部分。多根并行的曲线表示变更可以在各个部分发生。
图 3.5 X模型
由图 3.5 可见,X模型还定位了探索性测试,是指事先没有计划的特殊类型的测试,这一方式往往能帮助有经验的测试人员在测试计划之外发现更多的软件错误。不过探索性测试对测试员的熟练程度和能力要求比较高,否则测试可能造成人力、物力和财力的浪费。
以上介绍的这 4 种模型中,V模型强调了在整个软件项目开发中需要经历的若干个测试级别,但是它没有明确指出应该对软件的需求、设计进行测试,在这一点上,W模型得到了补充。但是W模型和V模型一样没有专门针对测试的流程说明。随着软件测试的不断发展,第三方测试已经独立出来,这个时候,H模型就得到了相应的体现,表现为测试独立。X模型又在此基础上增加了许多不确定的因素处理情况,这就对应了实际情况中项目经常变更的情况。
总而言之,在实际的项目中我们要合理应用这些模型的优点,比如在W模型下,合理运用H模型的思想进行独立的测试,或者参考X模型的一个程序片段也需要相关的集成测试的理论等,将测试和开发紧密结合,寻找最适合的测试方案。