软件测试
什么是软件测试?
软件测试:为了发现程序的错误而执行程序的过程。
发现了未发现的错误的测试是好的、成功的测试
软件测试的原则
- 测试用例的预期结果必须进行定义
- 应由第三者进行程序的测试,而不是程序的编写者
- 彻底检查每个测试的执行结果
- 测试用例应该包括无效输入情况
- 检查是否未做应该做的仅是测试的一半,测试的另一半是检查程序是否做了不应该做的
- 测试用例不能用后即弃,保留测试用例进行回归测试
- 程序某部分发现更多错误的可能性与已发现错误的数量成正比。当你发现一只蟑螂的时候……
- 软件测试是给付创造性智力挑战性的工作。
黑盒测试和白盒测试
黑盒测试:把程序看作一个黑盒,不考虑其内部结构,对程序接口进行测试。只检测程序功能是否能按照规格说明说正常使用,能否接收输入并产生正确的输出。黑盒测试又称功能测试。
白盒测试:按照程序内部逻辑测试程序。检测程序中每条通路是否按照预定要求正确工作。又称为结构测试。
软件测试的步骤
- 模块测试(单元测试):检查编码和详细设计中的错误
- 子系统测试:测试模块接口
- 系统测试(集成测试):检查软件设计中的错误
- 验收测试:再用户积极参与下进行的的测试与系统测试基本类似,主要检查系统需求说明书中的错误
- 平行运行:新的软件再验收测试后并不立即投入生产性运行,要经过一段时间的平行运行。让用户属性新的系统,准生产模式全负荷测试,验证性能指标。
单元测试
检查编码和详细设计上的错误,可以采用白盒测试
单元测试主要考虑5个特性:
- 模块接口
- 局部数据结构
- 重要的执行通路
- 错误处理通路
- 边界条件
单元测试需要由驱动程序,模拟主程序调用某个单元。
集成测试
检查接口和软件设计中的错误。
自顶向下:可以在早期对主要的控制或关键的抉择进行检验。采用深度优先可以在早期测试一个完整功能。
自底向上:从原子模块出发,先测试一个子系统,再把
子系统进行组装成一个更大的子系统进行测试。
改进型(混合法):对中下层采用自底向上,对上层采用自顶向下。
验收测试
用户积极参与,测试系统能否按照用户希望的那样进行测试,检验需求说明中的错误。一般采用黑盒测试。
设计测试方案
通常用黑盒设计基本的测试方案,再用白盒方法补充一些方案
白盒测试-逻辑覆盖
- 语句覆盖:每条语句至少执行一次
每条语句执行一次对判定不敏感,只关心判定表达式的取值,并不关心每个结构是否都取到。
上例中A=2,B=0, X取任意值就可以让每条语句执行一遍。 - 判定覆盖
在每个语句都执行一次的情况上,每个判定所有可能的结果都应执行一次。
对于上例:
A=2,B=0, x=2
A=3,B=1,x=3
两个测试用例即可让所有语句都执行一遍,并且每种判定结果都执行了一次。
3.条件覆盖:
判定覆盖只关心判定表达式的整体取值,子表达式的取值并不关心。条件覆盖就是在语句覆盖的基础上让每个子条件的各种结果都取到。
对于上例:
A=1,B=0, x=1
A=2,B=2, x=2
即可满足条件覆盖 - 判定/条件覆盖
判定覆盖只关系整体条件取值,子条件的各种情况取不到,条件覆盖只关心子条件的取值情况,可能导致整体条件的所有取值并不能取到。
判定条件覆盖就是既满足判定,所有整体条件的取值都取到,又满足条件,所有子条件的取值也都可以取到。
A=1,B=1,x=1
A=2,B=0,x=2
但是依然无法覆盖全部路径
5.条件组后覆盖
让所有子条件取值的组合情况都取到。 - 点覆盖:即语句覆盖
- 边覆盖:判定覆盖
8.路径覆盖:
让程序的每条可能路径都至少执行一次,如果有环则要求每个环至少执行一次
路径覆盖并没有检验表达式中各种子条件取值的组合情况,路径覆盖与条件覆盖结合,可以设计除较强测试数据。
基本路径覆盖
在程序控制流图的基础上,通过分析程序控制流图的环路复杂性,导出基本可执行路径的集合。
复杂度:边数-点数+2,判定节点数加一,闭合区域数加开放区域数。复杂度即最少的独立路径数,最少应该有多少个测试用例。
程序控制流图的分支节点应该是单条件判断,复合条件要拆分为多个单条件判断节点
独立路径:至少包含一条其它路径不包含的路径
黑盒测试
等价类划分
把输入数据(有效,无效)划分为若干等价类,每个等价类取一组数据(假定同类的不同测试用例取值效果相同)
- 如果划定了输入的范围,则有两个无效等价类和一个有效等价类。小于最小值,大于最大值,范围内
- 划定了输入数据的个数也可以划分两个无效等价类和一个有效等价类
- 如果规定了输入数据的一组值,而且程序对不同输入做不同处理,则每个允许的输入值是一个有效等价类,还有一个无效等价类(任一个不允许输入)
- 如果输入为整数,可划分为正整数,0,负整数三个有效类
边界值分析
边界值是程序最容易发生错误的地方。
首先确定边界值,选取刚好等于,稍小于,稍大于的数据。
错误推断
列举程序中可能出错或容易出错的情况
软件可靠性
可靠性:给定时间间隔内,按照规格说明书的规定成功运行的概率。
可用性:给定时间点,成功运行的概率