软件产品开发周期如下图所示:
假定软件开发周期的七个阶段包括了信息的沟通、理解和转换,以及大多数的软件错误都来源于信息处理中的故障,那么现在有三种补充的方法来预防或识别这些错误。
首先,我们可以使软件开发过程更加精密,以防其中出现很多错误。
其次,在每个阶段结束时可以引入一个独立的验证过程,在进入下一个阶段之前尽可能多地发现问题。如,对外部规格说明的验证可以通过与对目标的叙述进行比较。
第三种方法是对不同的开发阶段采用不同的测试方法。将每一个测试过程都重点针对一个特定的转换步骤。这种方法如下图所示:
测试周期是模仿软件开发周期建立起来的,换言之,我们应该能够在开发过程和测试过程之间建立起一对一的联系。
本文我们分别讨论这几种测试的过程。
1、模块测试
(1)测试用例设计
在为模块测试设计测试用例时,需要使用模块的规格说明和模块源代码。模块测试总体上是面向白盒测试的。
模块测试中测试用例的设计过程如下:
使用一种或多种白盒测试方法分析模块的逻辑结构,然后使用黑盒测试方法对照模块的规格说明以补充测试用例。
第一步先列举出程序中所有的条件判断,尝试判定覆盖准则、条件覆盖准则、判定/条件覆盖和多重条件覆盖准则,最终确定一个准则,比如多重条件覆盖准则,来生成模块测试用例。
下一步就是用一组黑盒测试用例来补充上面的测试用例,可使用因果图分析或边界值分析等方法。
(2)非增量测试
作为传统方法的非增量测试是指,先独立测试每个模块,然后再将这些模块组装成完整的程序。
测试独立的模块需要一个特殊的驱动模块(driver module)和一个或多个桩模块(stub module)。举例来说,测试模块B,首先要设计测试用例,然后将测试用例作为输入参数由驱动模块传递给模块B。驱动模块是人们编写的一个小模块,用来将测试用例驱动传输到被测模块中。驱动模块还必须向测试人员显示B的结果。当模块B调用了模块E,还必须使用一个额外的组件,该组件在模块B调用模块E时接受B的控制指令。这就由桩模块来完成,它是一个被命名为「E」的特殊模块,用来模拟E的功能。
(3)增量测试
先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试。
两种增量测试测量:自顶向下的测试和自底向上的测试。
2、集成测试
在这里忽略集成测试,因为集成测试往往并不作为一个独立的测试步骤,而且在进行增量模块测试时,它是模块测试的隐含部分。
3、功能测试
功能测试时一个试图发现程序与其外部规格说明之间存在不一致的过程。除了在小程序中的使用情况之外,功能测试通常是一项黑盒操作,等价类划分方法、边界值分析方法、因果图分析方法和错误猜测方法尤其适合于功能测试。
4、系统测试
系统测试不是测试整个系统或程序功能的过程,那是功能测试的事。系统测试时寻找程序与其目标之间的不一致的过程。系统测试是最困难的测试过程,系统测试采用了一种不同的测试用例设计方法。包括:能力测试、容量测试、强度测试、可用性测试、安全性测试、性能测试、存储测试、配置测试、兼容性/转换测试、安装测试、可靠性测试、可恢复性测试、服务/可维护性测试、文档测试和过程测试。
5、验收测试
这是一种不寻常的测试类型,因为该测试通常是由程序的客户或最终用户来进行。尽管从原则上讲验收测试时客户和最终用户的职责,但明智的开发者会引导客户在开发过程和产品发布之前进行用户测试。
6、安装测试
安装测试应由生产软件系统的机构来设计,作为软件的一部分来发布,在系统安装完成之后进行。测试用例需要检查确认已选的结合互不冲突,系统的所有部件全部存在,所有的文件已经创建并包含必需内容,硬件配置妥当等。
除了软件测试的心理学问题,软件测试中最重要的因素是设计和生成有效的测试用例。测试用例的设计如此重要,原因在于完全的测试是不可能的,对任何程序的测试必定是不完全的。
一般而言,在所有的输入方法中效率最低的是随机输入测试。将黑盒和白盒测试组合起来的测试策略是比较合理的。我们可以通过使用特定的面向黑盒测试的测试用例设计方法,而后使用白盒测试方法对程序的逻辑结构进行检查以补充这些测试用例,借此来设计出一个相当严格的测试。
1、黑盒测试:等价类划分、边界值分析、因果图分析、错误猜测
2、白盒测试:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、多重条件覆盖
参考资料:
1. Glenford J. Myers / Tom Badgett. 《软件测试的艺术》