一、PICT简介
1、结对测试
结对测试(Pairwise Testing)这一概念是曼德尔在测试Aad编译程序时提出来的一种测试思想,它能在保证测试覆盖率的前提下控制测试用例的数量。官网 http://www.pairwise.org/ 对pairwise testing的解释是:
Pairwise (a.k.a. all-pairs) testing is an effective test case generation technique that is based on the observation that most faults are caused by interactions of at most two factors. Pairwise-generated test suites cover all combinations of two therefore are much smaller than exhaustive ones yet still very effective in finding defects.
生成pairwise testing测试用例的工具有很多,http://www.pairwise.org/tools.asp 有详细的介绍。
2、PICT工具简介
PICT全称Pairwise Independent Combinatorial Testing tool,是微软开发的一款结对测试用例生成工具,现在已经对外提供,可以在互联网上下载到。PICT 可以有效地按照两两测试的原理,进行测试用例设计。在使用PICT时,需要输入与测试用例相关的所有参数,以达到全面覆盖的效果。
二、PICT工具安装
通过官网 http://download.microsoft.com/download/f/5/5/f55484df-8494-48fa-8dbd-8c6f76cc014b/pict33.msi 可以下载到PICT的安装包,下载安装即可。
1、双击“pict33.msi”安装程序;
2、一直点击next按钮;
3、可以给PICT设置安装路径后继续点击next;
4、点击install按钮进行安装,再点击finish完成安装;
PICT的安装程序会自动配置环境变量,因此可以在系统的任意目录中执行使用它,而不必进入pict的安装目录。(如果没有自动配置环境变量,可以进行手动配置)
三、PICT工具使用
1、简单使用
(1)使用PICT生成正交测试用例,首先需要准备一个模型文件,如下图所示的一个txt文件;
(2)文件的内容为:
PS:注意文件中的标点符号均为英文;
(3)使用cmd命令进入到test.txt文件所在的目录处;
(4)使用命令:
- 直接在cmd中输出结果:pict test.txt
E:\pict>pict test.txt
类型 尺寸 格式化方法 文件系统 簇大小 压缩
镜像 10 快 FAT 32768 关闭
RAID-5 10 慢 FAT32 512 打开
条纹 500 快 NTFS 512 关闭
跨度 1000 慢 NTFS 1024 打开
主要 100 快 FAT32 16384 关闭
单个 1000 慢 FAT 8192 关闭
主要 5000 慢 FAT 2048 打开
RAID-5 40000 快 NTFS 8192 打开
逻辑 10 慢 NTFS 65536 打开
跨度 100 快 FAT 65536 关闭
镜像 10000 慢 FAT32 65536 打开
逻辑 1000 快 FAT32 512 关闭
逻辑 40000 慢 FAT 4096 关闭
单个 1000 快 NTFS 4096 打开
条纹 500 慢 FAT32 32768 打开
镜像 100 快 NTFS 2048 关闭
跨度 10 慢 FAT32 4096 关闭
单个 40000 快 FAT32 65536 关闭
RAID-5 5000 快 FAT 65536 关闭
条纹 1000 慢 FAT32 2048 打开
主要 10000 快 NTFS 8192 关闭
跨度 10000 慢 FAT 16384 打开
主要 1000 慢 FAT32 65536 打开
单个 5000 快 FAT32 1024 关闭
RAID-5 100 慢 FAT 1024 打开
单个 500 慢 NTFS 2048 关闭
镜像 500 快 FAT 1024 打开
条纹 100 快 FAT 4096 打开
主要 40000 快 FAT32 1024 关闭
单个 10 快 NTFS 16384 打开
逻辑 5000 慢 NTFS 32768 关闭
条纹 10 慢 FAT 1024 关闭
主要 500 慢 NTFS 4096 关闭
镜像 1000 快 FAT 16384 打开
条纹 40000 快 FAT 16384 关闭
镜像 10 慢 FAT32 8192 打开
跨度 40000 快 NTFS 32768 关闭
逻辑 10000 慢 NTFS 1024 关闭
跨度 5000 快 FAT 512 打开
逻辑 100 慢 FAT32 8192 打开
RAID-5 500 快 NTFS 16384 打开
条纹 5000 慢 NTFS 8192 关闭
镜像 5000 慢 NTFS 4096 关闭
跨度 500 快 FAT 65536 关闭
跨度 10000 慢 NTFS 2048 打开
条纹 10000 快 FAT32 65536 关闭
主要 10 快 FAT 2048 关闭
RAID-5 10000 慢 NTFS 4096 打开
主要 10000 快 NTFS 32768 打开
RAID-5 1000 快 FAT32 32768 打开
主要 10000 快 FAT 512 关闭
镜像 40000 慢 FAT32 512 打开
单个 100 慢 NTFS 512 关闭
逻辑 500 快 FAT32 16384 关闭
单个 100 慢 NTFS 32768 打开
镜像 5000 快 FAT32 16384 关闭
跨度 500 慢 FAT 8192 打开
RAID-5 40000 慢 FAT 2048 关闭
逻辑 10 快 FAT 2048 关闭
单个 10000 慢 FAT32 65536 打开
- 输出重定向为另一个txt文件:pict test.txt>output_test.txt(返回没有报错,且在同级目录下生产output_test.txt文件)
在同级目录下生产的output_test.txt文件则为输出的测试用例;
- 输出重定向为另一个xls文件:pict test.txt>output_test.xls(返回没有报错,且在同级目录下生产output_test.xls文件)
在同级目录下生产的output_test.xls文件则为输出的测试用例;
2、高级使用
(1)PICT命令选项和参数
- 用法:pict 模式文件[选项]
- 选项:
/o:N 组合数,默认值为2
默认生成二元组的测试用例,即pict生成的测试用例集中最多有两个值与其他测试集是相同的;改为3,则覆盖率会增大,但同时也会生成更多的测试用例;但缺陷大部分发生在参数两两组合的情况下,三个参数组合导致的缺陷并不多见。
/d:C 值与值之间的分隔符,默认为逗号(,)
例如一个参数操作系统 winxp,win7,win8 之间会用逗号隔开;
/a:C 别名间的分隔符,默认是管道符(|)
例如一个参数(用户名不区分大小写,但为了保证测试的可信度,可以用大小写轮换的方式进行测试)用户名 admin|ADMIN;
/n:C 无效数值或者是非法数值的前缀,默认值为(~)
例如一个参数(只能取1、2,为了测试非法值的输入,取0,但又不希望0和其他参数的每隔值都配一次对,为了减少测试集的数量,在0前面加一个~)即参数 ~0,1,2;
/e:file 定义种子文件,作用是可以指定组合方式
例如在种子文件seed.txt中指定一个组合方式,在执行1.txt时,命令:pict 1.txt /e:seed.txt 生成的测试集中会包含seed中指定的组合集(当然指定的组合集有一定条件)。(此参数目前的理解可能会有误区);
/r[:N] 随机生成,N -种子
通过/r参数,可以使每次生成的测试集不同;
/c 参数的值完全区分大小写
/s 显示模型统计数据
(2)模型文件
模型由三个部分组成:参数定义、【子模型定义】、【约束定义】
三部分顺序不可调换,不可重叠,部分之间不需要任何分隔符,允许出现空行,允许通过“#”添加注释。
1)子模型
子模型允许把参数分组,每组可使用不同的阶数。如果某些参数的组合需要更彻底地测试,或必须与模型中的其他参数分离,可以使用子模型。子模型格式:
{ < paramname1 >,< paramname2 >,< paramname3 >,…} @ <阶数>
例如有一兼容性测试,各因数及其值如下:
平台:x86,ia64,amd64
CPU:单核,双路,四核
内存:128MB,1GB,4GB,64GB
硬盘类型:SCSI,IDE
操作系统:mac,Win7,Win10,Linux
浏览器:Firefox,Google,IE8,IE10
APP:SQLServer,Exchange,Office
因为此次测试主要目的是软件在不同硬件的兼容性,所以将硬件归为一组,系统归为一组,并提高硬件的阶数(order),这样技能充分测试硬件的不同组合,又能避免每个硬件与系统的碰撞次数,避免了过多的测试用例。增加子模型后的模型如下:
平台:x86,ia64,amd64
CPU:单核,双路,四核
内存:128MB,1GB,4GB,64GB
硬盘类型:SCSI,IDE
操作系统:mac,Win7,Win10,Linux
浏览器:Firefox,Google,IE8,IE10
APP:SQLServer,Exchange,Office
{平台,CPU,内存,硬盘} @ 3
{操作系统,浏览器} @ 2
模型执行过程如下图:
注意:
1. 您可以根据需要定义多个子模型;任何参数都可以属于任何数量的子模型。模型层次结构可以只有一个深度。
2. 子模型的组合顺序不能超过其参数的个数。在上面的例子中,第一个子模型的顺序可以是1到4之间的任何值。
3. 如果您未指定子模型的订单,PICT将使用默认订单或由/ o选项指定的订单。
(3)约束
如果参数间有约束条件,可将约束条件加到模型中,约束语句以“;”结束。
语法:参数与值可以使用以下关系:=,<>,>,> =,<,<=和LIKE。LIKE是通配符匹配运算符(* -任何字符,? -一个字符)。
参数分为字符串和数字两种,只有当该参数的所有制都是数字时才认为该参数类型为数字,数字类型的参数只能与数字进行比较,字符串类型的参数只能与字符串进行比较。
字符串比较时默认不区分大小写。需要区分大小写可用/ c 选项。
#
#机器1
#
OS_1:Win2000,WinXP
SKU_1:专业服务器,数据中心,WinPowered
LANG_1:EN,DE
#
#机器2
#
OS_2:Win2000,WinXP
SKU_2:Professional,Server,Datecenter
LANG_2:EN,DE
IF [LANG_1] = [LANG_2]
THEN [OS_1] <> [OS_2] AND [SKU_1] <> [SKU_2];
运算符IN 允许指定一组满足条件的值:
IF [Cluster size] in {512, 1024, 2048} THEN [Compression] = "Off";
IF [File system] in {"FAT", "FAT32"} THEN [Compression] = "Off";
IF,THEN 和ELSE语句可以包含由逻辑运算符NOT,AND和OR连接的多个语句。圆括号可以用来更改语句优先级:
IF [File system] <> "NTFS" OR
( [File system] = "NTFS" AND [Cluster size] > 4096 )
THEN [Compression] = "Off";
IF NOT ( [File system] = "NTFS" OR
( [File system] = "NTFS" AND NOT [Cluster size] <= 4096 ))
THEN [Compression] = "Off";
例:参数文档test.txt内容如下:
A1:a,b,c
A2:100,200,300,400,500
A3:aaa,bbb,ccc
A4:m100,m200,m300,500
A5:150,300
1)无条件约束
A2小于200:
[A2] <200;
A3值为aaa
[A3] = "aaa";
A4取为m+任意字符的值(*代表任意字符)
[A4] like "m*";
2)条件约束
如果A1值等于a或b,则A4值等于m100或500
IF [A1] in {"a", "b"} THEN [A4] in {"m100", "500"};
如果A2值等于300,则A4值不等于m200
IF [A2] = 300 THEN [A4] <> "m200";
如果A1值等于a,则A2值小于等于300
IF lA1] = "a" THEN [A2] > 300;
not与or用法
if [A1]="a" or( [A1]="a" and [A2]>300) then [A4]="m100"
If not[A1]="a" or([A1]="a" and not[A2]<=300 then [A4]="m100";
A1值等于类A2值时,A3值等于ccc(类之间的约束)
If [A5]=[A2]then [A3]="ccc"
(4)非法性测试
除了测试有效的组(称为“正向测试”),通常还需要使用允许范围以外的值来测试程序是否正确处理错误。每个“负向测试”测试用例应该只有一个无效值,因为大多数应用程序在检测到第一个错误时会执行一些失败的操作。出于这个原因,一个被称为输入掩蔽的问题,会发生在非法性测试中。一个无效输入阻止另一个无效输入被测试。
考虑以下函数需要两个参数:
float SumSquareRoots( float a, float b )
{
if ( a < 0 ) throw error; // [1]
if ( b < 0 ) throw error; // [2]
return ( sqrt( a ) + sqrt( b ));
};
虽然函数中,a和b可以取任意值,但是只对非负数的计算是有意义的。因此,函数通过[ 1 ]和[ 2 ] 执行参数验证。现在,假设一个测试用例(A = 1,B = - 1)被用来做非法性测试。在这里,a= - 1 其实掩盖了b=-1,因为检查[ 2 ]从来没有得到执行。如果没有单独验证[ 2 ]的用例,这种错误场景将无法被测试到。
为了防止输入屏蔽,重要的是在同一测试用例中不使用两个无效值(两个不同的参数)。默认带前缀“~”的任意值都是无效的。可以通过选项/n指定一个其它的前缀。
注意:如果一个值的参数有别名,只有在第一个名称上加前缀会使值非法。
(5)权重
使用权量,可以使PICT倾向于某些取值。权重取值可以是任何正整数,默认为1。
File system: FAT, FAT32, NTFS (10)
权重没有绝对意义,你不能确定你所指定的权重会起作用,因为PICT必须处理两个潜在矛盾的要求:
① 以最小数量的测试用例覆盖所有组合。
② 根据权值选择值。
① 总是优先于②,只有当选择值得目的不是为了满足① 时,②才会被采纳。
(6)种子
种子有以下两种可能的需求:
①指定必须出现在任意测试用例中的重要的组合。
PICT将使用提供的必选组合初始化输出,然后完成测试用例的其它部分,同时需要确保所有n阶组合都覆盖到。
②当需要修改模型时,它可以使输出的更改最小化。
你可以提供前一次结果给PICT,PICT将尽可能重用已有的测试用例。
种子行必须在单独的文件(一个种子文件)中定义。使用选项/ e指定文件位置:
pict.exe model.txt / E:seedrows.txt
种子文件和PICT的输出结果必须使用相同的格式以便可以被插入到计算出的测试用例中。使用制表符分割各参数和值,如下:
Ver SKU Lang Arch
Win2K Pro EN x86
Win2K DE x86
WinXP Pro EN ia64
任何种子行都要给所有参数指定值,也可能省略某些参数的值,如上述种子文件第二行没有SKU的值。在这种情况下,PICT将选择SKU的最佳值。
注意:
1.如果一个种子文件包含一个不在当前模型中的参数,PICT将丢弃该参数所在的列。
2.如果种子行包含一个不在当前模型中的值,PICT将从种子行删除该值。PICT只会使用种子行中的有效值,一个包含了无效值的种子行将成为不完整的行。
3.如果一个种子行违反了现行的约束,PICT将忽略该行。
如果(1)或(2)发生, PICT会打印警告信息。
在PICT中使用种子时,种子文件中如果有下列格式可能会产生歧义:
1.空白的参数和值名称。
2.参数和值名称包含制表符。
3.对于一个参数,值的名称和别名不是唯一的。
如果在你的模型中存在上述问题,PICT也会打印警告信息。