《软件测试基础》读书报告
第四章 输入空间划分
为了更直接地使相同测试需求的值集合是恰好合适,划分输入空间的方式直接的根据输入值的参数来定义输入域。输入参数可能是方法的参数和全局变量,也可能是系统当前的表现状态,或者干脆是用户级给定的一个输入,这都要根据实际情况来划分。总输入域中划分出若干个区域,从这些区域中选出一些值来进行测试。
从参数的域开始,把每个域可能的值划到块里,从块中选取适当的值来组成测试用例的过程就是输入域建模的过程。对于输入与的划分,一般是基于程序相应的某周特性,程序的输入,程序的环境等。
对于某个特性划分域时,一般要求满足两个条件:
- 完整性,划分必须覆盖整个域
- 分离性,块之间不能有重叠
以"输入F的次序"为例,一个看起来有效实际无效的划分可能是这样:
- 按F的排序划分
B1 = 升序排列
B2 = 降序排列
B3 = 任意顺序
这样做既不满足完整性也不满足分离性,升序或者降序都可以算是任意顺序的子块,而且,当F长度为0或者1的时候,F能同时满足三个块。出现这个问题的原因是把升序和降序两个概念放在相同的特性里面,应该将其分离。结果就是下面这个有效的划分:
- 文件F升序
B1 = True
B2 = False
- 文件F降序
B1 = True
B2 = False
当F长度为0或者1的时候,对两个特性都为真。
完整性和分离性的划分是为了使块的划分更加合适,为从块中选择合适的值来组合奠定基础。
输入域建模
输入域建模分三步。
- 识别可以测试的函数。对于一个系统中的函数来说,公共的函数是可以被独立测试的;对几个方法来说,可能他们具有同样的特性,这样就可以对于一个类设计一组共同的特性,再对每个独立的函数具体开发有针对性的测试用;对于一个大的系统来说,可能在设计UML中用例的时候就可以提取出测试来了。
- 识别所有参数。前面说过,参数可以是显式的函数参数或者是全局的变量,或者是当前系统的状态等,关键是看给定的参数是否对与函数行为有影响。被测函数的所有参数构成了输入域。
- 将前面的步骤建模。根据定义,测试输入严格属于每个特性的每一个块,这说明如果分为n个特性,每个特性划分成了B(n)个块,那么要全部覆盖的话,至少有B(1) *…*B(n)个测试,每增加一个特性i, 就会有成B(i) 倍数增长。特征多了,测试数量就会爆炸,所以必须得控制组合的数量。另外,不可避免的,有的值是无效的,那就需要识别、移除无效的字组合。
在建模时,有基于接口和基于功能的两种建模方法。
基于接口的建模测试
孤立地看待每个参数,这种机械的方式的到的结果确实很好,也容易识别,抽象的工作也很简单。但是,并不是所有的可用信息都反映在接口域模型里面,这就意味着这样建立的IDM是不完整的;另外一个问题是对每个参数孤立的分析,会导致一些重要的子组合被遗漏。
基于功能的建模测试
基于功能的建模的想法是通过识别被测系统的功能,将相应的领域知识应用到IDM上。这样的话,从规格说明书语义到IDM的转换,更可能为测试用例产生预期的结果。并且,因为IDM的建立不依赖于具体实现的参数列表,需要的只是规格说明书和领域知识,所以在开发的早期就能着手设计测试。
当然,基于功能的分方法里,识别特征和取值是比较困难的,当系统比较大的时候,这一点体现的更加明显。并且,功能需求严重依赖于规格说明书,如果规格说明书不完整或者不完善,那设计合理的特性就更加困难了。
组合策略标准
- 完全组合覆盖:来自所有特征的所有块都必须被用到
如果直接这样的话,测试数量会爆炸。可以肯定,每个块中有的选择是等价的,这样就存在一些组合策略使得测试减少
- 每个选择覆盖:对每个特征,每个块中一个值至少在一个测试用例中被使用
满足这样标准的测试灵活性很大,这样有的中药组合可能会遗漏
- 成对覆盖:来自每个特征每个快的一个值,必须与来自针对其他特征的每个块的一个值相对结合
- T-Wise覆盖:来自t个特征每个快的一个值必须被组合
- 基本选择覆盖
- 多个基本选择标准
|--->T-Wise覆盖 -----> Pair-Wise覆盖------ ---|
完全组合覆盖 ------| |------> 每个选择覆盖
|--->多个基本选择覆盖 ---> 基本选择覆盖--------|