在测试过程中,测试人员经常需要将测试对象的各种输入参数进行组合之后进行测试。有时候,将各种输入参数进行组合,得到的测试用例数目将是非常庞大的。由于测试时间和成本的限制,无法对测试对象输入值的所有组合进行测试。下面是某个网站测试的要求:
------------案例描述:开始-------------
某网站需要支持
● 不同的浏览器:IE5.0、IE5.5、IE6.0、Netscape6.0、Netscape6.1、Netscape7.0、Mozilla1.1和Opera7;
● 不同的插件:RealPlayer、MediaPlayer或者没有任何插件None;
● 不同的客户端操作系统:Windows95、Windows98、WindowsME、、WindowsNT、Windows2000和WindowsXP;
● 不同的Web服务器软件:IIS、Apache和WebLogic;
● 不同的服务器端操作系统:WindowsNT、Windows2000和Linux。
这种情况下,需要针对不同的组合进行测试:
● 8种浏览器
● 3种插件
● 6种客户端操作系统
● 3种Web服务器软件
● 3种服务器端操作系统
如果考虑所有参数不同取值的组合,那么需要设计和执行的测试用例的数目是1296(8 x 3 x 6 x 3 x 3 = 1296)。
------------案例描述:结束-------------
在软件测试过程中,这种类型的组合是非常普遍的。每种情形都可能有庞大的组合需要进行测试,假如不对它们进行测试,可能会存在较大的风险;而如果对所有组合进行测试,测试时间和资源又不允许。测试人员在面对这种情况的时候,可以采用以下几种常用的策略:
● 尝试测试所有输入的组合,延期项目,导致的后果可能是失去产品的市场。
● 选择一些容易设计和执行的测试用例,而忽略其是否能够提供产品质量的信息。
● 罗列所有的组合,并随机选择其中的子集进行测试。
● 采取特殊的测试技术,选择能发现大部分缺陷的子集进行测试。
如果采用最后一个策略,那么使用结对测试技术是一个很好的选择。采用结对测试的技术,测试并不针对输入值的所有组合进行测试,而只是针对所有输入值的两 两组合。结对测试技术可以显著地减少测试用例的数目,同时保证较高的测试质量。下面是应用结对测试技术减少测试用例数目的例子:
● 假如软件系统有四个不同的输入参数,每个参数有3个不同的输入值,得到的完全组合数目是34即81。假如采用结对测试的技术,只需要9个测试用例即可覆盖所有参数的两两组合。
● 假如软件系统有13个不同的输入参数,每个参数有3个不同的输入值,得到的完全组合数目是313即1594323。假如采用结对测试的技术,只需要15个测试用例即可覆盖所有参数的两两组合。
● 假如软件系统有20个不同的输入参数,每个参数有10个不同的输入值,得到的完全组合数目是1020。假如采用结对测试的技术,只需要180个测试用例即可覆盖所有参数的两两组合。
结对测试技术能够发现所有的单模式失效(Single-mode Fault)和双模式失效(Double-mode Fault)。但是,结对测试并不一定适合于发现测试对象中的多模式失效(Multimode Fault)。
● 单模式失效:失效是由单个参数引起的,只要针对所有独立参数进行测试,就能够发现该失效。
● 双模式缺陷:失效是由两个参数共同引起的,必须针对所有参数的两两组合进行测试,才能够确保发现此类缺陷。
● 多模式缺陷:失效是由三个或三个以上参数共同引起的,采用结对测试技术也可能发现多模式缺陷,但是不能保证测试的充分性。
下面的几个数据可以说明结对测试技术的有效性:
● 根据AT&T在对其基于局域网的邮件系统进行的测试中,应用结对测试技术得到的1000条测试用例比其原有的1500条测试用例多发现了20%的缺陷,而测试工作量却减少了50%。
● National Institute of Standards and Technology在一项对医疗设备测试所进行的15年追踪中发现,有98%的软件缺陷可以通过结对测试技术发现。
● 根据对Mozilla网页浏览器的缺陷分析显示,76%的缺陷可以通过结对测试技术发现。
具体的结对测试,可以通过不同的测试技术来得到,包括正交矩阵(Orthogonal Arrays)的方法、James Bach提供的Allpairs方法,也可以通过分类树方法。表1得到的测试用例是通过Allpairs方法实现的,详细的内容以及其他测试技术的实现方 法,可以参考《软件测试设计》原著。
图1 使用Allpairs得到的测试数据
假如测试数据列表中的某个参数的取值以~开头,那么说明该参数取值已经有两两组合了。以~开头的参数取值,可以用该 参数的任何其他取值来代替,而不会影响其两两组合的覆盖率。因此,可以将以~开头的参数取值,用更关键的或者经常使用的参数值来代替。同时,使用 Allpairs得到的测试数据中,还罗列了所有的两两组合,并且统计了每个两两组合出现的次数,以及每个测试用例所包含的两两组合数。
从上面的结果可以看到:通过采用合适的测试技术,测试用例数目原来需要1296个,而目前只需要48个进行覆盖,测 试用例数目减少了96%。前面已经提到了,结对测试可以发现所有的单失效模式和双失效模式的缺陷,而实践过程中,大部分的失效是单失效模式和双失效模式, 多失效模式占的比例很少。因此,通过采用合适的结对测试,可以大大降低测试用例数目,减少测试工作量,同时可以实现较好的测试覆盖率,保证测试质量。