技术开发 频道

软件测试的新模型

    到底选择哪一种方法,这需要一种折衷和权衡。设计桩模块和驱动模块要付出多少代价?这些模块如何进行维护?子系统是否会由此而掩盖了一些故障?在整个子系统范围内进行排错的困难程度有多大?如果我们的测试直到集成测试时才真正开始,那么一些bug可能较晚才被发现。由此造成的代价同设计桩模块和驱动模块的代价如何比较?等等。

    V模型没有去考虑这些问题,当单元开发完成后就执行单元测试,而当自系统被集中在一起后就执行集成测试,仅此而已。令我奇怪和沮丧的是,人们从不去做一些权衡,他们已经受制于他们的模型。
因此,一个有用的模型应该允许测试人员考虑节省并推迟测试的可能性。

    一个测试,如果要发现一个特定的单元中的bug,最好是在该单元保持独立的情况下执行,并且在其外部辅以特定的桩模块和驱动模块。而另一种方法则是让它作为子系统的一部分来进行测试,该测试的设计主要是为了发现集成的问题。由于一个子系统本身也需要桩模块和驱动模块来模拟该子系统和其它子系统的联系,因此,单元测试和集成测试可能被推迟到至少整个系统已经部分集成的时候。在这种情况下,测试者可能通过产品的外部接口同时进行单元测试、集成测试和系统测试,同样的,其主要目的还是为了减少总体生命周期的成本,对测试成本和延期进行测试及由此造成延期发现bug的代价成本进行权衡。据此而言,“单元测试”、“集成测试”和“系统测试”的区别已经大大削弱了。其结果可参考下图:

(图7--新的方法:在部分阶段延迟进行单元测试和集成测试)

    在上图右边的方块中,最好要改成为“执行某些适当的测试并得到相应的结果”。
    图中的左边会怎样?考虑一下系统测试设计,它的主要根据和信息来源是是规格说明。假设你知道有2个单元处在一个特定的子系统中,它们在运行时相互联系,并且要执行规格说明中的一个特定的声明。为什么不在该子系统被集成时立即对此规格说明中的声明进行测试,就象是在设计完成后立即开始测试的设计一样呢?如果该声明的执行和子系统外的子系统没有任何关系,为什么还要等到整个系统完成以后再测试呢?难道越早发现bug成本越低不对吗?
    在上一张图片中,我们用了向上指的箭头(更有效,但在时间上有延迟)。这里还可以把箭头往下指(在时间上提前):

(图8--新的方法:在不同阶段上提前进行测试设计)

    在这种情况下,左边的方块中最好被标记为:“在当前信息条件和情况下可以做的任何测试设计”。这样,当测试设计得自于系统中某一个组件的描述时,模型必须允许这样的测试在组件被装配之前被执行。我必须承认我的图片非常难看,这些箭头指得到处都是,对此我有2点说明:
    1. 我们所讨论的事情不是创造美,而是想要发现尽可能多的严重错误,同时尽可能地降低成本。
    2. 难看的部分原因也是因为必须按照某些次序来执行的结果,亦即开发人员先提供系统描述文档,然后测试和这些文档进行关联。这些文档就象是坚实的老橡树,而测试设计则象是细细的枝条缠绕在树上。如果我们采用不同的原理来进行组织,图片可能就会变得好看些。但复杂性仍不可避免,因为我们要讨论的问题本身就很复杂。
    V模型失败的原因是它把系统开发过程划分为具有固定边界的不同阶段,这使得人们很难跨过这些边界来采集测试所需要的信息。有些测试应该执行得更早些,有些测试则需要延后进行。而且,它也阻碍了你从系统描述的不同阶段中取得信息进行综合。例如,某些组织有时执行这样的做法,即对完成的工作进行签署。这样的规定也扩展到系统测试的设计。签署表示已经过评估,该测试设计工作已经完成,除非对应的设计文档改变,否则就不会被修订。如果同这些测试相关的信息后来被重新挖掘和认识,例如,架构设计表明有些测试是多余的,或者,详细设计表明有一个内部的边界可以和已存在的系统测试组合在一起进行测试的话,那么实际上还需要继续调整原来的系统测试设计。
    因此,模型必须允许利用不同来源的综合信息进行个别的测试设计。另外,模型还应该允许在新的信息来源出现后重新进行测试的设计。


    一个不同的模型 

    让我们来看本文的第二项内容,一个不同的模型。
    很多时候人们把代码移交给其他人,并且说:“希望你能接受和喜欢它。”这不仅发生在将整个项目放在一张光盘中交给客户的时候,也发生在项目内部。
    例如,一个小组对另一个小组说:“我们已经完成了为COMM库加入了对XML的支持。源代码现在已经放在master库中,可执行库则已经加入到集成与创建的环境中。XARG小组的工作已经没有什么阻碍了,随时去取吧。”
    某个程序员检查了bug的修改并且发出邮件:“我已经修改了Bug列表中的那个Bug,很抱歉!”至此,早先受该问题影响的其它代码就可以继续处理了。
    在这些情况下,人们要把代码移交给其它人,其中有可能会存在一些影响。测试人员需要干预这个过程。在移交之前,测试人员应执行这些代码,发现其中的bug(影响),并且提出问题:“你确实要提交这些吗?”由此,移交的内容可能会被延期,直到bug被修复好。
    尽管你还要做其它的各种测试,这项测试仍然是很基本的测试工作。如果你没有做这样的测试,就不能算是合格的测试人员。
    我们的测试模型必须包含这一重要的现实需要:针对代码移交的测试。由此,测试模型应提示进行针对每一次代码移交的测试。
    就让我以支持XML的COMM库作为例子。这里存在着一个小组把代码移交给XARG小组以进行项目的余下部分。那么谁会遭受影响?

    要将这些支持XML的代码直接进行使用的XARG小组可能会立即受到影响;
    这可能会在稍后影响到市场人员,他们要在一个行业展示会议上为“合作伙伴发行”版本提供产品演示和宣传,而XML支持是影响他们销售的重要部分;
    还有,它可能损害采纳我们的产品的合作伙伴。
    现在我们可以提出一些有趣的关于测试计划的问题了。最简单的可以做的事情是,在移交的时候立即执行XML支持的完整测试。(“完整”的含义是,为此设计尽可能多的测试)但也许一些XML特性并不是XARG小组所需要的,因此可以把它们放在合作伙伴版本封版(下图中的“Partner Release”)的测试中去。这意味着可以把一些XML相关测试放到稍后的移交过程中去。或者基于其它理由,例如在近阶段有其它的测试任务要执行。而XARG小组则要因XML中的bug修复而延迟一小段时间。
    我们的测试计划所表示的进度可以通过在开发的时间线上进行注解的方式来表现,如下图所示:

(图9:添加在开发计划之上的测试计划)

0
相关文章