赞
踩
“软件测试是为了证明程序是正确的,即测试能发现程序中所有的错误”。(x)
事实上这是不可能的。要通过测试发现程序中的所有错误,就要穷举所有可能的输入数据。
例如:(1) 对于一个输入三个16位字长的整型数据的程序,输入数据的所有组合情况有2**48 ,如果测试一个数据需1ms,则即使一年365天一天24小时不停地测试,也需要约1万年。
(2)对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。例如一个小程序的流程图,它包括了一个执行20次的循环,其循环体有五个分支。这个循环的不同执行路径数达5**20条,如果对每一条路径进行测试需要1毫秒,那么即使一年工作365 × 24小时,要想把所有路径测试完,大约需3170年。
“程序测试是证明程序正确地执行了预期的功能”。(x)
实际上,一个程序不仅要完成它所需完成的功能,而且不应完成它不该做的事。
例:三条边相等的三角形是等边三角形。
如不能把边长为0、0、0的三条边判断为等边三角形。
Glen Myers给出的软件测试目的:
根据这个测试目的,我们应该排除对测试的错误观点,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误。
Davis提出了一组指导软件测试的基本原则 :
其他的测试原则:
白盒测试(又称为结构测试)把测试对象看作一个透明的盒子,测试人员根据程序内部的逻辑结构及有关信息设计测试用例,检查程序中所有逻辑路径是否都按预定的要求正确地工作。(对照设计)
白盒测试主要用于对模块的测试,包括:
黑盒测试(又称行为测试)把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能需求。(对照需求)
黑盒测试可用于各种测试,它试图发现以下类型的错误:
常用的百盒测试方法有:
定义:逻辑覆盖主要考察使用测试数据运行被测程序时对程序逻辑的覆盖程度。通常希望选择最少的测试用例来满足所需的覆盖标准。
主要的覆盖标准有:
循环分为4种不同类型:简单循环、嵌套循环、串接循环、非结构循环
按照下列规则设计测试用例:
按照下列规则设计测试用例:
如果串接的各个循环互相独立,则可以分别用简单循环的方法进行测试;但如果第一个循环的循环变量与第二个循环控制相关,则两个循环不独立,此时,把第一个循环看作外循环,第二个循环看作内循环,然后用测试嵌套循环的办法来处理。
这一类循环应该先将其结构化,然后再测试
确定等价类
根据软件的规格说明,对每一个输入条件(通常是规格说明中的一句话或一个短语)确定若干个有效等价类和若干个无效等价类。
可使用如下表格:
输入条件 | 有效等价类 | 无效等价类 |
---|---|---|
确定等价类的规则:
如果输入条件规定了取值范围,则可以确定一个有效等价类(输入值在此范围内)和两个无效等价类(输入值小于最小值及大于最大值)
设计测试用例
在确定了等价类之后,建立等价类表,列出所有划分出的等价类。并为每个有效等价类和无效等价类编号。
边界值分析也是一种黑盒测试方法,是对等价类划分方法的补充。
人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,其揭露程序中错误的可能性就更大。
边界值分析方法选择测试用例的规则如下:
(姐系靠估)
V模型:描述软件开发各阶段与测试策略之间的对应关系。
(原来V模型在这- -)
Tom Gilb指出实现一个成功的软件测试策略必须涉及的问题:
集成测试 也称组装测试、联合测试
经单元测试后,每个模块都能独立工作,但把它们放在一起往往不能正常工作。
主要问题在于:
集成方式有两种
增量式集成又可分为自顶向下集成和自底向上集成
回归测试集(已经过测试的子集)包括三种不同类型的测试用例:
确认测试的结果可分为两类:
软件配置评审也称软件审计(audit),其目的是保证软件配置的所有成分都齐全,各方面的质量都符合要求,具有维护阶段必需的细节,而且已经编排好分类目录。
软件配置主要包括计算机程序(源代码和可执行程序),针对开发者和用户的各类文档,包含在程序内部或程序外部的数据。
压力测试也称强度测试,它是在一种需要非正常数量、频率或容量的方式下执行系统,其目的是检查系统对非正常情况的承受程度。
例如:
性能测试用来测试软件在集成的系统中的运行性能。它对实时系统和嵌入式系统尤为重要。
性能测试可以发生在测试过程的所有步骤中
性能测试常常需要与压力测试结合起来进行,而且常常需要一些硬件和软件测试设备,以监测系统的运行情况。
面向对象软件的测试目标仍然是用最少时间和工作量来发现尽可能多的错误
但面向对象软件的性质改变了测试的策略和测试战术。面向对象软件的测试也给软件工程师带来新的挑战。
继承、封装、多态性、基于消息的通信等概念都是面向对象软件的重要特征,它们对面向对象测试有很大的影响。
适用于面向对象测试的两种单元定义
类是面向对象软件中的单元
由于属性和操作被封装在类中,因此测试时很难获得对象的某些具体信息(除非提供内置操作来报告这些信息),从而给测试带来困难。
测试了父类的操作后,并不表示其子类就不必对继承的操作进行测试。
在测试时,应覆盖反映多态的所有实现方法。
面向对象软件是通过消息通信来实现类之间的协作,它们没有明显的层次控制结构,因此,传统的自顶向下和自底向上集成策略不适用于面向对象软件测试。
把类作为面向对象软件的单元,传统的单元测试等价于面向对象中的类测试,也称类内测试。它包括类内的方法测试和类的行为测试。
面向对象中的类间测试(interclass testing)相当于面向对象的集成测试。它有两种集成策略:
因为无法判定当前查出的错误是否是最后一个错误,所以决定什么时候停止程序测试就成了最困难的问题,但是测试最后一定要停止的。
几种实用的测试完成标准:
Musa和Ackerman提出了一个基于统计标准的答复:“不,我们不能绝对地认定软件永远也不会再出错,但是相对于一个理论上合理的和在试验中有效的统计模型来说,如果一个在按照概率的方法定义的环境中,1000个CPU小时内不出错运行的概率大于0.995的话,那么我们就有95%的信心说,我们已经进行了足够的测试”。
标准:
测试的目的是发现错误,调式(也称排错)的目的是确定错误的原因和准确位置,并加以纠正
回溯法是从错误的征兆出发,人工沿着控制流程往回跟踪,直至发现错误的根源。这种方法适用于小型程序,对大型程序,由于回溯的路径太多,难以彻底回溯。
原因排除法又可分为归纳法和演绎法。
归纳法:是一种从特殊推断一般的系统化思考方法。其基本思想是:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误的原因。
演绎法:演绎法从一般原理或前提出发,假设所有可能出错的原因,排除不可能正确的假设,最后推导出结论。
修改一个错误常常会引入新的错误。
在为纠正某个错误而修改程序之前应该回答三个问题:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。