测试用例设计方法之组合测试法

简介

组合测试(Combinatorial Test)是众多测试方法中的一种,适用于有限取值的多因素系统:
两因素(Pairwise)组合测试生成的测试用例集能够覆盖任意两因素所引发的缺陷;
多因素(N-Way,N>2)组合测试生成的测试用例集理论上能够覆盖所有多因素所引发的缺陷,但是测试集会随着N的增加呈指数增长,测试成本很高;
因此两因素组合测试能够达到测试成本和缺陷检测能力之间的平衡。

组合测试可用方法:

1.正交表

(或者笛卡尔乘积)生成测试用例:此方法能够保证每个因素在样本空间均匀分布,能够达到等概率,主要用于进行正交试验中各因素影响检测。
用于软件测试会导致测试成本高且缺陷检测能力较一般。

2.PICT(The Pairwise Independent Combinatorial Testing tool)

微软内部使用的测试集生成工具,能够在保证缺陷覆盖率的情况下减少测试成本,现已开放能够下载:

PICT的使用:

1.下载和安装:

a.下载地址:
官方下载地址>>
备用下载地址>>
b.双击pict33.msi进行安装,注意安装路径。

2.Demo:

a.Windows命令行定位到安装文件夹;
b.在该文件夹下建立Modle.txt文件,格式如下:
pict-model-type
c.命令行执行pict model.txt;
demo1
d.或者这样输出到文件:
pict model.txt > testcase.txt
pict1
pict model.txt > testcase.xls
pict2

3.约束条件:

对于存在对立关系的两个因素中需要通过在model文件中添加约束条件来防止测试集中产生无效用例:
IF Compound THEN Compound ELSE Compound;
pict-yueshu

4.非法值过滤-哨兵(Guard)语句覆盖

考虑代码健壮性,会存在很多哨兵语句来过滤非法输入,此时若不在model中添加限制,则可能生成的测试集会有很大一部分直接被过滤掉:
pict

5.指定因素组合数-子模型:

针对关键业务流程,往往是缺陷多发地需要强化该处的测试,此时有两种方法才实现:
a. 在命令行中使用/o:N (N为组合数)来指定自组合数,例如/o:就是生成三因素的测试集:
pict-3yinsu

b.针对需要着重测试的部分或者某几个因素可以建立子模型(Sub-Models)来加强:
{<ParamName1>, <ParamName2>, <ParamName3>, ... } @ <Order>
子模型会针对花括号中所列的元素进行N元素组合(N=Order)。
pict-sub_model

6.随机种子:

若将组合测试用例集加入回归测试,在软件生命周期中复地执行,不妨每次生成新的组合测试用例集,一方面满足两因素或多因素覆盖的测试标准,另一方面扩大测试对程序状态空间的覆盖。
在PICT中,参数”/r[:N]”可以为测试用例生成引入随机种子(N是作为随机种子的整数),以生成不同的测试用例。例如,执行如下命令,就可以当前日期为种子,生成测试用例集。第一条语句从当前日期中获得年、月、日信息(%date的格式随Windows系统设置而变化,该语句只适用于特定Windows系统),放入变量seed中。第二条语句以变量seed为种子,生成测试用例。于是,测试用例集的具体内容随日期变化,在保证两因素覆盖的前提下,扩大了对被测试应用的状态覆盖。

1
2
set seed=%date:~4,2%%date:~7,2%%date:~10,4%
pict model.txt /r:%seed%

7.覆盖最重要的的取值组合:

为了避免漏测,测试人员应该利用领域知识和测试技能,发掘出一批他认为必须测试的取值组合。然后,基于这些取值组合生成组合测试用例集。
a.将默认设置对应的因素取值组合加入核心用例集。
b.对于默认设置,每次修改其中一个单选框,获得一批取值组合。将它们加入核心用例集。
c.考虑到大多数用户不修改默认设置或只修改1个设置,核心用例集已经“足够好”,可以将其用于测试执行。
d.如果还有测试资源,可以将核心用例集作为“种子”,利用PICT生成组合测试用例集。例如,命令pict.exe model.txt /e:seedrows.txt生成的组合测试用例集就包含种子文件(seedrows.txt)所指定的取值组合。
关于组合测试可能错过最重要的的组合的文章:Pairwise Testing: A Best Practice That Isn’t

7.组合测试只是测试工具箱中的一员

组合测试最适用的场景是配置测试,包括硬件兼容性测试、浏览器兼容性测试等。在配置测试中,待组合的配置项天然就是可枚举的离散值,不存在划分等价类、从等价类中选择可用值等手工操作,避免了测试者引入的错误。在配置测试中,大部分缺陷是由两个配置项不兼容所导致的,所以组合测试的错误检测能力较强。

对于功能测试,将组合测试作为探索式测试的补充是不错的做法。在一轮测试中,建议按照如下步骤应用组合测试:
a.实施探索式测试,迭代地展开测试活动:阅读规格说明,运行被测试程序,应用不同的测试策略反复尝试,标记已经探索过的区域,记录已发现的缺陷。在这一过程中,可以获得一批高质量的测试用例,形成回归测试用例集。通常这批回归用例包括两类测试用例。第一类是正面(Positive)用例,它们检查了程序在主流场景(Scenario)下的行为。只要它们通过,我就有自信认为程序可以满足正常使用的需要。第二类是负面(Negative)用例,它们往往来自暴露了程序缺陷的探索式测试。这些用例检查了程序在极限或罕见场景中的行为,是程序在现实世界中正常工作的保证。
b.实施组合测试。基于探索式测试,我已经知晓某些因素的取值组合是很重要的。我可以将其传递给PICT,让它基于已有的测试用例生成组合测试用例集。例如,在命令行上执行pict.exe model.txte:rows.txt,就可以基于文件rows.txt,生成测试用例集,以完成两因素组合覆盖。
c.通过阅读代码或运行测试覆盖率工具,以发现测试遗漏。寻找未被发现的卫哨语句,修改测试策略,再次测试。寻找未被测试覆盖的语句或分支,增加新的测试用例,以提高代码覆盖率。

PICT语法声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Constraints :: =
Constraint
| Constraint Constraints
Constraint :: =
IF Compound THEN Compound ELSE Compound;
| Compound;
Compound :: =
Clause
| Clause LogicalOperator Compound
Clause :: =
Term
| ( Compound )
| NOT Compound
Term :: =
ParameterName Relation Value
| ParameterName LIKE PatternString
| ParameterName IN { ValueSet }
| ParameterName Relation ParameterName
ValueSet :: =
Value
| Value, ValueSet
LogicalOperator : :=
AND
| OR
Relation :: =
=
| <>
| >
| >=
| <
| <=
ParameterName : := [String]
Value :: =
"String"
| Number
String :: = whatever is typically regarded as a string of characters
Number :: = whatever is typically regarded as a number
PatternString : := string with embedded special characters (wildcards):
* a series of characters of any length (can be zero)
? any one character

参考:

实施组合测试>>

Ethan wechat
欢迎扫一扫关注~
坚持原创技术分享,您的支持将鼓励我继续创作!