目前,软件的正确性证明尚未得到根本的解决,软件测试仍是发现软件错误和缺陷的主要手段。
大量统计资料表明,目前软件测试所花费用已超过软件开发费用的30%以上。
1.软件测试的目的
软件测试的目的就是在软件投入生产运行之前,尽可能多地发现软件产品(主要是指程序)中的错误和缺陷。
为了发现程序中的错误,应竭力设计能暴露错误的测试用例。测试用例是由测试数据和预期结果构成的。一个好的测试用例是极有可能发现至今为止尚未发现的错误的测试用例。一次成功的测试是发现了至今为止尚未发现的错误的测试。
高效的测试是指用少量的测试用例,发现被测软件尽可能多的错误。
软件测试所追求的目标就是以尽可能少的时间和人力发现软件产品中尽可能多的错误。
2.测试分类
软件测试通常可分为单元测试、集成测试和系统测试。
1)单元测试
单元测试(Unit Testing),也称模块测试,通常可放在编程阶段,由程序员对自己编写的模块自行测试,检查模块是否实现了详细设计说明书中规定的功能和算法。单元测试主要发现编程和详细设计中产生的错误,单元测试计划应该在详细设计阶段制定。
单元测试期间着重从以下几个方面对模块进行测试:模块接口、局部数据结构、重要的执行通路、出错处理通路和边界条件等。
测试一个模块时需要为该模块编写一个驱动模块和若干个桩(stub)模块。驱动模块用来调用被测模块,它接收测试者提供的测试数据,并把这些数据传送给被测模块,然后从被测模块接收测试结果,并以某种可以看见的方式(例如显示或打印)将测试结果返回给测试者。桩模块用来模拟被测模块所调用的子模块,它接受被测模块的调用,检验调用参数,并以尽可能简单的操作模拟被调用的子程序模块功能,把结果送回被测模块。顶层模块测试时不需要驱动模块,底层模块测试时不需要桩模块。
模块的内聚程度高可以简化单元测试过程。如果每个模块只完成一种功能,则需要的测试方案数目将明显减少,模块中的错误也更容易预测和发现。
2)集成测试
集成测试(Integration Testing),也称组装测试,它是对由各模块组装而成的程序进行测试,主要目标是发现模块间的接口和通信问题。例如,数据穿过接口可能丢失,一个模块对另一个模块可能由于疏忽而造成有害影响,把子功能组合起来可能不产生预期的主功能,个别看来是可以接受的误差可能积累到不能接受的程度,全程数据结构可能有问题等。集成测试主要发现设计阶段产生的错误,集成测试计划应该在概要设计阶段制定。
集成测试的方式可分为非渐增式和渐增式。
非渐增式集测试成是先测试所有的模块,然后一下子把所有这些模块集成到一起,并把庞大的程序作为一个整体来测试。这种测试方法的出发点是可以"一步到位",但测试者面对众多的错误现象,往往难以分清哪些是"真正的"错误,哪些是由其他错误引起的"假性错误",诊断定位和改正错误也十分困难。非渐增式集成测试只适合一些非常小的软件。
渐增式集成测试是将单元测试和集成测试合并到一起,它根据模块结构图,按某种次序选一个尚未测试的模块,把它同已经测试好的模块组合在一起进行测试,每次增加一个模块,直到所有模块被集成在程序中。这种测试方法比较容易定位和改正错误,目前在进行集成测试时已普遍采用渐增式集成测试。
渐增式集成测试又可分为自顶向下集成和自底向上集成。自顶向下集成先测试上层模块,再测试下层模块。由于测试下层模块时它的上层模块已测试过,所以不必另外编写驱动模块。自底向上集成先测试下层模块,再测试上层模块。同样,由于测试上层模块时它的下层模块已测试过,所以不必另外编写桩模块。这两种集成方法各有利弊,一种方法的优点恰好对应于另一种方法的缺点,实际测试时可根据软件特点及进度安排灵活选用最适当的方法,也可将两种方法混合使用。
3)系统测试
系统测试是软件测试中的最后的、最完整的测试,它是在单元测试和集成测试的基础上进行的,它从全局来考察软件系统的功能和性能要求。系统测试计划应该在需求分析阶段制定。
通常,系统测试包括确认测试(Validation Testing)和验收测试(Acceptance Testing)。
确认测试,主要依据软件需求说明书检查软件的功能、性能及其他特征是否与用户的需求一致。
软件配置复查是确认测试的另一项重要内容。复查的目的是保证软件配置的所有成分都已齐全,质量符合要求,文档与程序完全一致,具有完成软件维护所必须的细节。
如果一个软件是为某个客户定制的,最后还要由该客户来实施验收测试,以便确认其所有需求是否都已得到满足。由于软件系统的复杂性,在实际工作中,验收测试可能会持续到用户实际使用该软件之后的相当长的一段时间。
如果一个软件是作为产品被许多客户使用的,不可能也没必要由每个客户进行验收测试。绝大多数软件开发商都使用被称为α(Alpha)测试和β(Beta)测试的过程,来发现那些看起来只有最终用户才能发现的错误。
α测试由用户在开发者的场所进行,并且在开发者的指导下进行测试。开发者负责记录发现的错误和使用中遇到的问题。也就是说,α测试是在"受控的"环境中进行的。
β测试是在一个或多个用户的现场由该软件的最终用户实施的,开发者通常不在现场,用户负责记录发现的错误和使用中遇到的问题并把这些问题报告给开发者。也就是说,β测试是在"不受控的"环境中进行的。
经过系统测试之后的软件通常就可以交付使用了。
3.测试方法
1)白盒测试
白盒测试,又称结构测试,主要用于单元测试阶段。它的前提是可以把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法。这种方法按照程序内部逻辑设计测试用例,检测程序中的主要执行通路是否都能按预定要求正确工作。
2)黑盒测试
黑盒测试,又称功能测试,主要用于集成测试和确认测试阶段。它把软件看做一个不透明的黑盒子,完全不考虑(或不了解)软件的内部结构和处理算法,它只检查软件功能是否能按照软件需求说明书的要求正常使用,软件是否能适当地接收输入数据并产生正确的输出信息,软件运行过程中能否保持外部信息(例如文件和数据库)的完整性等。
3)灰盒测试
灰盒测试,介于白盒测试和黑盒测试之间,主要用于集成测试阶段。它把软件看做一个半透明的灰盒子,结合考虑软件的内部结构和外部功能设计测试用例。
本文作者:网友 来源:其它 |