在cmm的发展进程中,曾经提议将软件评价与测试(evaluation and test)作为cmm的一个kpa加入到cmm中,虽然这一提议最终未获通过,但通过对这一提议的讨论,我们可以得到很多与软件测试相关的一些有益的东西。
一、软件评价与测试在整个软件生命周期中的作用
评价是对软件开发过程中产生的各种系统规格和模型进行的验证活动。测试则是一种基于机器的对代码执行、确认的活动。大部分组织对评价和测试的定义都相对狭义,一般是指对代码执行物理测试用例的活动。事实上,很多公司甚至直到编码已经开始时才指定或安排测试人员。更有甚者,他们将这一活动的范围仅仅限于功能测试,也许有时做一下性能测试。这种观点在目前的cmm有关评价与测试的描述中被进一步强调,这就是spe,软件产品工程kpa。在spe kpa活动中,活动5、6、7,仅仅用了基于代码的测试作为例子,只明确地提到了功能测试。其他类型的测试只是用一句非常含糊的话来指代:“保证软件满足软件需求 ”。
另一方面,建造摩天大厦的人们,则远在砌第一块砖之前就将评价和测试集成到了开发过程之中。通过建模来验证稳定性、防水性、照明布置以及电源的需求等等,从而实施评价。而目前,组织所使用软件评价和测试方法就像是设计师一直等到大楼已经建成才进行测试,而此时的测试只是能保证给水和照明可以工作而已。
cmm只是进一步将评价和测试的部分思想进行融合,用一个特殊的评价技术来代替,这个技术就是cmm中的一个kpa,同行评审。这也意味着,在提交代码之前,唯一可干的评价就是同行评审,且已经足够了。事实上,对于一件事情的评价和测试的步骤包括:(1)定义成功准则;(2)涉及覆盖这些准则的用例;(3)执行用例;(4)验证结果,验证所有的内容都已覆盖。同行评审只是提供了一个基于纸面的测试机制。它既不能从根本上提供成功准则,也不能提供任何正式的机制以支持用例定义以用于同行评审中。同行评审本质是主观的,因此,基于误解使程序员将缺陷引入产品,而到同行评审时,基于同样的误解,也使得人们无法发现这些缺陷。
评价和测试的一个相对坚固的内涵范围必须包括项目在开发周期每一个阶段的每一个交付产品。它也必须考虑每个交付产品的每一个预期特性。而且必须包括每一个评价/测试步骤。下面我们看两个例子:评价需求和对一个设计的评价。
一个需求文档必须是完备的、一致的、正确的和清晰的。那么第一步就是基于项目/产品目标(即为什么要做这个项目的说明)对需求进行确认。这能够保证我们定义了正确的功能集。下一步评价就是遍历use-case脚本走查各功能规则,如果可能的话,最好用一些原型工具(screen prototype)作为辅助工具。第三步评价是有领域专家进行的对文档的同行评审。第四步是由非领域专家进行的正式的含糊性评审(他们无法读懂文档里的功能知识,这将帮助确保各种规则是明确定义的,而不是隐含定义)。第五步评价是将需求转换为布尔逻辑图。这可以鉴别规则之间的顺序问题,同时也能发现漏掉的用例(cases)。第五步评价是在case工具的辅助下进行的逻辑一致性检查。第七步评价是由领域专家进行的对测试脚本的评审,这些脚本是从需求导出来的。
对设计的评价一样可以进行一系列补救。一个是对照需求对设计文档进行走查。另一评价是构建一个模型来验证设计的完整性(例如构造一个操作系统的资源分配模式来保证不会发生死锁)。第三种评价是建立模型来验证性能特征。第四种是将形成的设计与其他公司的现成系统进行对比,以确保所设计的配置能够处理预期的处理规模和数据规模。
上面的评价只有一部分可以用同行评审来完成,没有一个是基于代码的。而且上边的例子中没有一个评价是穷尽的,必要时我们可以进行的其他评价。关键是我们输出一个交付产品(如需求文档),在我们能够正式称它是完备的并可被下一开发步骤使用之前,我们必须基于预期的特征对之进行评价。而进行这些评价需要比进行同行评审更加复杂的技术。
这就是评价和测试的关键所在。一个特征的预定义集合,尽可能被明确定义,用来对一个交付产品来进行确认。例如,当你在学校,进行了数学测验,老师会拿你的回答与预期答案相对比。老师不会仅仅说他们看上去也是合理的,或者他们更加准确。答案是9.87652,要么它对,要么不对。同时,老师也不会等到学期结束才将在课程早期交上来的进行判卷,在他们做出来之际就得到了测试。目前我们软件开发承担更加大风险,难道我们还可以有任何的不严格和不及时吗?
这些应当进行评价和测试的交付产品应当包括需求规格说明书,设计规格说明书、数据转换规格和数据转换代码、数据库设计说明书、培训资料、硬件/软件安装规格、用户手册和应用程序代码等等。当然这并不是一个完整的列表。问题的关键是,在你的项目生命周期中的每一个交付产品都必须被测试。
对于一个给定交付产品的评价和测试可能会延续项目生命周期的多个阶段。越来越多的软件组织开始从瀑布式模型向迭代式模型转变。例如,设计规格可能会经过三个迭代才能产生。第一个迭代定义体系结构—它是人工的还是自动的,是集中的还是分散的,是在线的还是批命令式的,是直接文件存储还是通过关系性数据库等等。第二个迭代则可能继续推动设计,来鉴别所有的模块和模块间的数据交换机制。第三个迭代则定义模块内部的伪代码。每个迭代都应当基于适当的特性来进行评价与测试。
评价和测试的类型必须是鲁棒的、坚固的。这包括对功能、性能、可靠性-可用性/实用性-可服务性、易用性、可移植性、可维护性和可扩展性等的验证,但绝不仅限于此。
总之,每个阶段的每个交付产品必须通过正式的、训练有素的技术来对适当的属性进行评价和测试。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器