目录
成对组合法
PICT
基础使用
选项
Constraint(约束条件)
weight值
MPLS-TE FRR使用举例
SNMP使用举例
成对组合VS正交表
成对组合法
软件中存在很多由于条件condition/维度/输入input/因素factor的等价类/值/水平的组合导致的bug。但是完全组合可能数目太多,统计数据显示由于三个或者更多个条件的组合导致的bug比例很小,所以一种高性价比的暴露组合型bug的方式是覆盖成对组合。
成对组合:每个条件中的每个等价类都和其它条件中的每个等价类同时出现过。即order为2的组合。
等待类的组合和数学中所说的组合不是一个概念。数学中的组合是一个集合内值的组合,等价类的组合是多个集合之间值的组合。
一旦成对组合测试发现了组合型的bug,可以考虑进一步加大组合的order。
人工列出等价类的成对组合,工作量很大,我们可以使用PICT来帮助我们自动生成成对组合。
PICT
PICT(Pairwise Independent Combinatorial Testing)是微软开发的一个免费的命令行工具。用来自动生成符合成对组合要求的compact的组合方式。虽然结果不是唯一的正确答案,但是却一定满足成对组合原则。其实,PICT可以生成任意order的组合。Pairwise Testing in the Real World: Practical Extensions to Test-Case Scenarios | Microsoft Learn有作者对PICT的介绍,自带帮助文档对用法进行了说明。
Windows上可以从Pairwise Testing | Combinatorial Test Case Generation下载msi文件进行安装。
Linux上安装和使用:
# git clone https://github.com/microsoft/pict.git
# cd pict
# make
# cp pict /usr/local/bin
# pict就可以运行程序了
基础使用
使用方法非常简单,首先按照要求构造输入文件。
输入文件格式要求:每一行写一个parameter。格式:parameter_name: value1,value2,value3。Parameter和vlaues之间用英文冒号隔开,value之间用英文逗号隔开。Parameter也可以叫做condition(条件)、factor(因素/因子)、input(输入),value常常是不同的等价类。
支持汉字。
Parameter、value前后的空格、tab键不影响功能。
允许任何位置的空行,空行对结果没有影响。
“#”开头的行是注释。
注意:一行中最后一个value后面不要加英文逗号,否则软件理解为最后有一个值为空的value。
使用命令pict生成组合,比如# pict input.txt > output.txt,pict从input.txt中读取内容,成对组合的结果就放在了output.txt中了。会自动创建output.txt,如果output.txt已经存在,则覆盖原有内容,写入新结果。
举例:
input.txt的内容为
Operate System: Window XP,Window 7,Vista
Language: Chinese,English,German
IE: 5.0,6.0,7.0
则output.txt的内容为:
Operate System Language IE
Window 7 German 5.0
Vista Chinese 7.0
Window XP English 5.0
Vista German 6.0
Window XP Chinese 6.0
Window 7 English 7.0
Vista Chinese 5.0
Window XP German 7.0
Window 7 Chinese 6.0
Vista English 6.0
完全组合有27种,成对组合有10种。
也可以将结果放在excel文档里,例如C:\Program Files\PICT>pict input.txt > output.xls。
但是不能使用excel文档作为输入文件。
选项
选项以/开头,注意选项的“/”前面有空格!!!
缺省相同的input文件,得到的组合完全相同。
/r选项使得每次输出的组合不一样,程序反馈使用的seed。例如:
C:\Program Files\PICT>pict input.txt /r > output12.xls
Used seed: 1573
C:\Program Files\PICT>pict input.txt /r > output13.xls
Used seed: 1576
output12.xls和output13.xls包含的组合的数目相同,但是因为使用的seed不同,所以内容不相同。使用相同的seed得到的组合就完全相同。
C:\Program Files\PICT>pict input.txt /r:1573 > output14.xls
Used seed: 1573
output14.xls的内容就和output13.xls的内容完全相同。
如果修改了input.txt的内容,但是想生成的组合变化尽量小,那么可以在每次生成组合时指定相同的seed。
/e
指定一个文件,其中有一定要覆盖的组合。
第一行是parameter,之间使用tab隔开。其余行是value,之间也用tab隔开,如果某个parameter的value不做限定,则用tab代替。例如下面第二行中没有指定语言。
Operate System Memory CPU Language IE
Window XP 2G single English 5.0
Window 7 512M quad 7.0
将xls的内容贴到seed.txt可以不做修改直接使用。
可以直接使用xls文件作为seed文件,效果和使用txt seed文件相同。例如:
C:\Program Files\PICT>pict input.txt /e:seed.xls > output.xls
Order of combinations
实际上PICT不只可以生成成对组合。它还允许修改order of combination。例如:
C:\Program Files\PICT> pict input1.txt /o:3 > output1.txt
生成order of combination为3的组合。
/o:max等效于/o:number_of_factors。
可以设置部分参数的order of combination不同于整体的。如果部分参数之间的相互作用更紧密,或者经验表明某部分参数的组合出现了更多问题,可以设置这部分参数组合的order大于整体的order。例如input文件的内容为:
factor1 @3: 1,2,3,4
factor2 @3: 1,2,3
factor3 @3: 1,2
factor4: 1,2,3
factor5: 1,2,3,4,5
前三个参数order of combination是3。
Constraint(约束条件)
可以设置约束条件(依赖关系dependency/相互关系interaction)
支持语句if、then、else(不区分大小写)
支持
逻辑运算符:not、and、or(不区分大小写)
关系运算符:=、<>、>、<、>=、<=
支持使用圆括号改变运算符的优先级
使用parameter时要加方括号,调用字符串类型的value需要加双引号,调用数字类型value时不加双引号。
例1:要求操作系统为Vista时,内存只能为2G。
Operate System:Window XP,Window 7,Vista
Memory:512M,1G,2G
CPU:Single,dual,quad
if [Operate System] = "Vista" THEN [Memory] = "2G";
例2:数据中心SDN网络中,如果两个vm属于不同的VPC,那么它们一定属于不同的subnet。
diff_server: True,False
diff_subnet: True,False
diff_vcp: True,False
primary_fip_diff_domain: True,False
secondary_fip_diff_domain: True,False
if [diff_vcp] = "True" THEN [diff_subnet] = "True";
如果存在约束条件,一定要在输入文件中写明,否则会产生无效的组合,这可能导致部分应被覆盖的组合没有被覆盖到。
weight值
在产生组合数量不变的基础上,可以让PICT侧重使用某个参数的某个值:默认weight值是1,weight值越高使用的次数越大。
input.txt内容如下:
CRC位数:CRC16,CRC32(10000)
帧封装格式:SDH(10000),SONET
数据类型:IP数据(10000),MPLS数据
接口速率:155M,622M,2.5G,10G,40G
factorx:1,2,3
则尽量多的使用CRC32、SDH和IP数据。
Weight使用指南:
想让PICT略多的使用某个值,将这个值的weight设置为10,如果想尽可能的多用这个值,则把weight设置为10000。
值越少的参数设置weight越有效,值最多的参数设置weight可能等于没有设置(因为没有调整取值的余地)。
MPLS-TE FRR使用举例
MPLS-TE FRR组合因素和等价类:
接口类型:以太,POS
LSP建立方式:手动,自动
IGP:ospf,isis
引流方式:静态路由,PBR,igp-shortcut
保护类型:链路保护,节点保护
Egress空标签类型:显式空,隐式空
MP空标签类型:显式空,隐式空
PLR和ingress重合:是,否
MP和egress重合:是,否
限制条件:因为DUT空标签类型是全局设置的,所以MP和egress重合时,Egress空标签类型和MP空标签类型一定相同。
if [MP和egress重合]="是" then [Egress空标签类型]=[MP空标签类型];
全组合,PICT生成576种组合。
order为2时,PICT生成9种组合。
接口类型 | LSP建立方式 | IGP | 引流方式 | 保护类型 | Egress空标签类型 | MP空标签类型 | PLR和ingress重合 | MP和egress重合 |
以太 | 手动 | ospf | 静态路由 | 节点保护 | 显式空 | 显式空 | 否 | 否 |
POS | 自动 | isis | 静态路由 | 链路保护 | 隐式空 | 隐式空 | 是 | 是 |
POS | 自动 | ospf | igp-shortcut | 节点保护 | 隐式空 | 显式空 | 是 | 否 |
以太 | 自动 | isis | PBR | 节点保护 | 隐式空 | 隐式空 | 否 | 是 |
POS | 手动 | ospf | PBR | 链路保护 | 显式空 | 隐式空 | 是 | 否 |
以太 | 手动 | isis | igp-shortcut | 链路保护 | 隐式空 | 隐式空 | 否 | 是 |
以太 | 自动 | isis | PBR | 链路保护 | 显式空 | 显式空 | 是 | 是 |
POS | 手动 | isis | igp-shortcut | 链路保护 | 显式空 | 隐式空 | 否 | 否 |
以太 | 自动 | ospf | 静态路由 | 节点保护 | 显式空 | 显式空 | 是 | 是 |
SNMP使用举例
input.txt的内容
view type: include(100), exclude
auth type: noauth, authonly, priv
hash type: no type, md5, sha
trap version: v1, v2c
trap type: all, interface, sys-start
trap-source: default, loopback
if [auth type] = “noauth” then [hash type] = “no type”;
if [auth type] in {“authonly”, “priv”} then [hash type] in {“md5”, “sha”};
不考虑约束条件时,全组合3*3*3*2*2*2*=216种
PICT生成的成对组合只有9种。
view type | auth type | hash type | trap version | trap type | trap-source |
exclude | priv | sha | v1 | all | loopback |
include | noauth | no type | v2c | all | default |
exclude | authonly | md5 | v2c | interface | default |
include | authonly | md5 | v1 | all | loopback |
exclude | authonly | sha | v1 | sys-start | default |
include | noauth | no type | v1 | interface | loopback |
exclude | noauth | no type | v2c | sys-start | loopback |
include | priv | sha | v2c | interface | default |
include | priv | md5 | v1 | sys-start | loopback |
成对组合VS正交表
正交表也能满足成对组合的要求。这里对比一下成对组合和正交表。
成对组合(以PICT为例) | 正交表 | |
组合数 | 所有因子水平数相同时,组合数通常多于正交表,但是差距不大。因子水平数不同时,组合数通常少于正交表。 | 所有因子水平数相同时,组合数通常少于PICT。因子水平数不同时组合数通常多于PICT。 |
生成组合的方便程度 | 软件自动生成组合,非常方便 | 不方便,需要查找、套用、裁剪正交表。 |
是否支持因子之间的约束条件 | 支持 | 不支持,如果有约束条件,正交表将很难应用。 |
值的侧重 | 支持(可以指定侧重使用哪些值) | 不支持 |
值分布的均衡性 | 差一些(虽然可以设置值的weight值相同,但有些时候仍然不够均衡) | 非常均衡(对于寻找最佳配置、最佳化学反应的条件等应用非常合适) |
结论:
如果所有因子水平数相同,并且因子之间没有约束条件,不需要设置值的侧重,则可以使用正交表,否则使用PICT。
要寻找最佳配置、最佳化学反应条件时,建议使用正交表。