课件
测试用例的重要性
测试用例的设计是测试活动的基础和关键,它可以指导人们系统地进行测试,对于测试的执行起到事半功倍的作用。
1、降低软件测试成本
测试不可能是完备的,它会受到时间的约束,测试用例可以帮助我们分清先后主次,以便更有效地组织测试的工作,从而提高测试效率,降低测试成本。
2、保证测试工作质量
在测试的过程中,临时性地发挥也许会有灵感出现,但是大多数情况下我们会感觉思维混乱,可能有一些功能没有测到,而另一些功能已经重复测过几遍,测试用例可以帮助我们理清头绪,避免重复和遗漏。
3、评估和检验测试效果
测试用例的通过率和软件缺陷的数量是检验软件质量的量化标准,通过对测试用例的分析和改进,可以逐步地完善软件的质量。另外测试用例也可以用于衡量测试人员的工作量、进度和效率,从而更有效地管理和规划测试的工作。
测试用例的概念
测试用例是为了一个特定的目标而设计的一组测试输入、执行条件和预期结果,它的目的是测试某个程序路径是否正确,或者何时程序是否满足某个特定的需求。
测试用例一般包括以下部分:
1、测试用例值:是测试需要的一些输入值
2、期望结果:是程序满足预期行为而应当产生的结果,我们要验证一个程序是否正确,就要事先明确这个程序应该满足的期望行为,如果测试结果和期望结果相符,那么我们就认为它是正确的。
3、前缀值:测试的时候需要预先设定软件处于测试输入的一个稳定状态,前缀值就是把软件置于合适的状态,来接受测试用例值的任何必要条件
4、后缀值:就是测试用例值输入以后,为了查看结果或者终止程序,而需要的任何输入。后缀值又可以再细分为验证值和结束命令两种类型
举例,比如我们测试一个移动电话软件,如下图所示:
- 测试用例值:可以是多种电话号码
- 期望结果:就是接通或者未接通
- 前缀值:电话开启并进入拨号界面
- 后缀值:按下“呼叫”或“取消”按钮
测试用例设计的要求
测试用例设计的要求应该考虑下面的因素:
1、具有代表性和典型性:因为穷举测试是不可行的,所以我们必须要选择少量有代表性的数据,使每一个测试用例都能覆盖一组范围或者特定情况。
2、寻求系统设计和功能设计的弱点:测试用例要确切地反映系统设计中可能存在的问题,要根据需求规格说明并且结合各种可能情况,来综合考虑测试用例。
3、既有正确输入也有错误或异常输入:测试不能只考虑正确输入情况,还要考虑错误或异常输入,并且分析怎么才能产生这些错误和异常。
4、考虑用户实际的诸多使用场景:测试用例要基于用户的实际使用情况,从用户的角度来模拟测试的输入
黑盒测试技术
黑盒测试是把测试对象看成是一个黑盒子,根据需求说明来检查程序是否符合功能要求,本章节我们重点讲解等价类划分和边界值分析这两种方法。
等价类划分
等价类划分是把输入域划分成尽可能少的若干子域,并且要求这些子域是两两不相交的,那么每一个子域就称为一个等价类。
来看这个图,它显示两种划分:
那么哪一种划分是等价类划分呢?左边图里面的子域两两不相交的,右边的 1 和 2 是有交集的,根据上面的定义,左边是等价类划分,右边不是。
需要注意的是:
- 对于同一个域来说,可能会存在不同的划分方法。
- 在等价类划分中,我们用同一个等价类中的任何输入对软件进行测试的时候,软件都会输出相同的结果,所以只需要从每一个等价类中选取一个输入作为测试用例,就可以构成软件一个完整的测试用例集。
- 对于相同的等价类划分,不同的测试人员所选取的测试用例集可能是不同的。那么良好的选择需要经验的积累。
等价类类型
等价类可以分为有效等价类和无效等价类:
- 有效等价类:是有合理的输入数据构成的集合,它能够检验程序是否实现了规格说明中预先规定的功能和性能。
- 无效等价类:是不合理输入数据构成的集合,它可以发现程序异常处理的问题,来检查程序是否具有一定的容错性。
我们设计测试用例的时候,要同时考虑这两种等价类,因为软件不仅要能够接收合理的数据,也要能够经受意外的考验。
如何划分
下面我们结合一些常见的不同数据类型来简单说明如何进行等价类的划分。
1、取值范围类型
对于一般的简单数值变量来说,如果输入规定了取值范围,那么范围内是一个有效等价类,范围外是两个无效等价类:
举例:程序的输入参数 X 是小于 100 大于 10 的整数,根据上面的方法
- 有一个有效等价类,就是 10 < X <100
- 有两个无效等价类,即 X ≤ 10 和 X ≥ 100
2、字符串类型
对于字符串变量,如果规定了输入字符遵守的规则,那么我们可以确定有一个有效等价类(符合规则)和若干无效等价类(从不同角度违反规则)。
举例:姓名是长度不超过 20 的非空字符串,且只由字母组成,数字和其他字符都是非法的。
- 一个有效等价类:满足了上述所有条件的字符串
- 无效等价类:有几个呢?我们可以看长度是一个因素,组成字符串的字符也是一个因素,那么长度可以是 0 或者超过 20,然后其他是非字母的字符,这样我们就得到了三个无效等价类:
- 空字符串
- 长度超过 20 的字符串
- 包含了数字或其它字符的字符串(长度不超过 20)
3、枚举类型
对于枚举类型,如果规定输入数据是一组值,假定 n 个,并且程序要对每一个输入值分别处理,那么就可以确定有 n 个有效等价类和 1 个无效等价类。
举例:某程序根据不同的学历分别计算岗位工资,其中学历可以是专科、本科、硕士、博士等四种类型。
- 有效等价类:显然就有四个有效等价类,分别是专科、本科、硕士、博士
- 无效等价类:还有一个无效等价类就是其他学历
4、数组类型
数组是一组具有相同类型元素的集合,那么数组的长度和类型都可以作为等价类划分的依据。
举例:假设某程序的输入是一个长度为3的整数数组 int oper [3],那么根据数组的长度,我们可以划分成
- 一个有效等价类:就是长度是 1 到 3 的所有合法数组,如{-10,20}
- 还有两个无效等价类:
- 空数组
- 所有长度大于3的数组,如{-9,0,12,5},这个数组因为长度是 4 所以是一个无效等价类
如果我们对于数组的元素还有其他的附加的约束,例如数组 oper 元素的取值范围是[-3,3],则需要增加相应的等价类。
5、复合数据类型
复合数据类型是包含两个或两个以上相互独立的属性的输入数据,在进行等价类划分时需要考虑输入数据的每个属性的合法和非法取值。
举例:
struct student {
string name;
string course[100];
int grade[100];
}
student 这个结构它是包括了 name、course 和 grade 三个属性,那么在进行等价类划分的时候,先对每一个元素进行划分,然后再把这些等价类进行组合,最终得到了这个student结构的整个的等价类划分。
等价类组合
一般的测试对象都会有多个输入的参数,我们会把这些参数的等价类进行组合来设计测试用例,这个时候就要考虑如何进行组合以便保证等价类的覆盖率。
首先,所有参数有效等价类的每一个组合就构成一个有效的测试用例:
其次,任一个参数的无效等价类与其他参数的有效等价类进行组合,构成一个无效的测试用例:
举例:判断三角形类型
首先进行等价类划分:
第一种方法是按照输入的取值进行划分,把 ABC 都划分成
这样的等价类。
第二种方法是按照输出的几何特性进行划分,划分成
四个等价类。显然第二种方法最合适。
在多数情况下,等价类是根据输入域进行划分的,但并不是说不能从输出来反过来划分,事实上对于三角形这个问题,输出域的划分是最简单的方法。
等价类划分之后,来设计测试用例,根据等价类的性质,每一个等价类只需要选取一个有代表性的输入作为测试用例。这样我们就得到了4个有效的测试用例:
我们还可以补充一些无效测试用例,根据前面提到的组合原则,每一个测试用例只有一个参数是无效的,其余保持有效,这样就形成了健壮等价类的测试用例:
边界值分析
边界值分析是对输入或输出的边界值进行测试的一种方法,通常也作为等价类划分的一个补充。
- 首先要确定边界:等价类的边界就是测试的重点
- 然后选取正好等于、刚好大于或刚刚小于边界的值作为测试数据
实践表明,大多数故障往往发生在输入定义域或输出值域的边界上,因此,针对边界情况设计测试用例,通常会取得良好的效果。
列举几个边界值分析的例子:
- 第一个例子是一个文本输入区,它允许输入 1 到 255 个字符,那么空串长度为1、255 和 256 的字符串都是边界条件值。
- 第二个例子是要求输入 5 位十进制整数,我们可以使用刚好小于 5 位和大于 5 位的数值作为边界条件。
- 第三个例子是磁盘空间,这个边界值的选取和整数值方法类以。
边界值分析方法认为故障往往出现在程序输入的边界值附近,但是它是基于单故障假设的,也就是说两个或两个以上故障同时出现而导致失效的情况很少发生。用这种方法设计测试用例的时候,每次只保留一个变量取边界值,其余的变量取正常值,如上图所示这样。
举例:判断三角形类型
按照前面提到的单故障原则,可以设计一些边界值的测试用例,如图所示,边界值分别取了1、22、99和100。
健壮性测试
健壮性测试是对边界值分析的一个简单扩充,它除了边界内的五个取值外,还增加了刚好超过边界的两个取值,像上图所示,这种方法可以检查超过极限值的时候系统的情况。
错误推测法
测试经验对于软件测试是非常重要的,人们可以经验或者直觉推测出程序中可能存在的各种错误,然后有针对性地编写检查这些错误的测试用例。实际上,软件缺陷具有空间聚集性,对于代码的高危多发地段,投入更多的精力进行测试往往可以发现更多的错误。