PICT如何生成有效的测试用例

PICT是微软的一个免费测试工具,可以生成成对的组合。pairwise是指当输入条件过多,覆盖样例太大时,为了有效的、合理的减少输入条件的组合数,pairwise能够简化问题大大减少组合数。

1. 简单使用

使用PICT生成正交测试用例,首先需要准备一个模型文件,例如,如果您希望为分区和卷创建创建一组测试用例,则可以使用以下参数来描述该域:类型,大小,文件系统,格式化方法,群集大小和压缩

 

模型文件myfolder.txt内容如下(标点符号均为英文):

类型:主要,逻辑,单个,跨度,条纹,镜像,RAID-5

尺寸:10,100,500,1000,5000,10000,40000

格式化方法:快,慢

文件系统:FATFAT32NTFS

簇大小:512,1024,2048,4096,8192,16384,3276865536

压缩:打开,关闭

 

将该文件放到PICT目录下,在cmd命令行下即可生成相关测试用例:

C\ YourFolder> pict ModelFile.txt

输出重定向:

C\ YourFolder> pict ModelFile.txt> OutputFile.txt

也可以将输出文件导入Excel,在Excel中打开它:

C\ YourFolder> pict ModelFile.txt> OutputFile.xls

C\ YourFolder> OutputFile.xls

 

2. 高级特性

2.1 PICT命令选项和参数

【用法】pict 模式文件[选项]

 

【选项】

/o:N   组合数,默认值为2

默认生成二元组的测试用例,即pict生成的测试用例集中最多有两个值与其他测试集是相同的;改为3,则覆盖率会增大,但同时也会生成更多的测试用例;但缺陷大部分发生在参数两两组合的情况下,三个参数组合导致的缺陷并不多见。

/d:C   值与值之间的分隔符,默认为逗号(,

例如一个参数操作系统  winxp,win7,win8 之间会用逗号隔开;

/a:C   别名间的分隔符,默认是管道符(|

例如一个参数(用户名不区分大小写,但为了保证测试的可信度,可以用大小写轮换的方式进行测试)用户名  admin|ADMIN

/n:C   无效数值或者是非法数值的前缀,默认值为(~

例如一个参数(只能取12,为了测试非法值的输入,取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.2 模型文件

模型由三个部分组成

参数定义

【子模型定义】

【约束定义】

三部分顺序不可调换,不可重叠,部分之间不需要任何分隔符,允许出现空行,允许通过#”添加注释。

1) 子模型

子模型允许把参数分组,每组可使用不同的阶数。如果某些参数的组合需要更彻底地测试,或必须与模型中的其他参数分离,可以使用子模型。子模型格式:

{ < paramname1 >< paramname2 >< paramname3 >,…} @ <阶数>

 

例如有一兼容性测试,各因数及其值如下:

 

平台:x86ia64amd64

CPU:单核,双路,四核

内存:128MB1GB4GB64GB

硬盘类型:SCSIIDE

操作系统:macWin7Win10Linux

浏览器:FirefoxGoogleIE8IE10

APPSQLServerExchangeOffice

因为此次测试主要目的是软件在不同硬件的兼容性,所以将硬件归为一组,系统归为一组,并提高硬件的阶数(order),这样技能充分测试硬件的不同组合,又能避免每个硬件与系统的碰撞次数,避免了过多的测试用例。增加子模型后的模型如下:

平台:x86ia64amd64

CPU:单核,双路,四核

内存:128MB1GB4GB64GB

硬盘类型:SCSIIDE

操作系统:macWin7Win10Linux

浏览器:FirefoxGoogleIE8IE10

APPSQLServerExchangeOffice

{平台,CPU,内存,硬盘} @ 3

{操作系统,浏览器} @ 2

 

模型执行过程如下图:

PICT如何生成有效的测试用例

注意:

1. 您可以根据需要定义多个子模型;任何参数都可以属于任何数量的子模型。模型层次结构可以只有一个深度。

2. 子模型的组合顺序不能超过其参数的个数。在上面的例子中,第一个子模型的顺序可以是14之间的任何值。

3. 如果您未指定子模型的订单,PICT将使用默认订单或由/ o选项指定的订单

 

2.3 约束

如果参数间有约束条件,可将约束条件加到模型中,约束语句以;”结束。

【语法】

参数与值可以使用以下关系:=<>>> =<<=LIKELIKE是通配符匹配运算符(* -任何字符,? -一个字符)。

参数分为字符串和数字两种,只有当该参数的所有制都是数字时才认为该参数类型为数字,数字类型的参数只能与数字进行比较,字符串类型的参数只能与字符串进行比较;

字符串比较时默认不区分大小写。需要区分大小写可用/ c 选项。

[Size] < 10000

[Compression] = "OFF"

[File system] like "FAT*"

参数之间也可以进行比较:

#机器1

OS_1Win2000WinXP

SKU_1:专业服务器,数据中心,WinPowered

LANG_1ENDE

 

#机器2

OS_2Win2000WinXP

SKU_2ProfessionalServerDatecenter

LANG_2ENDE

 

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";

IFTHEN ELSE语句可以包含由逻辑运算符NOTANDOR连接的多个语句。圆括号可以用来更改语句优先级:

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值等于ab,则A4值等于m100500

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;  

notor用法  

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"

 

2.4 非法性测试

除了测试有效的组(称为“正向测试”),通常还需要使用允许范围以外的值来测试程序是否正确处理错误。每个“负向测试”测试用例应该只有一个无效值,因为大多数应用程序在检测到第一个错误时会执行一些失败的操作。出于这个原因,一个被称为输入掩蔽的问题,会发生在非法性测试中。一个无效输入阻止另一个无效输入被测试。

考虑以下函数需要两个参数:

float SumSquareRoots( float a, float b )

{

      if ( a < 0 ) throw error;           // [1]

      if ( b < 0 ) throw error;           // [2]

     

      return ( sqrt( a ) + sqrt( b ));

};

虽然函数中,ab可以取任意值,但是只对非负数的计算是有意义的。因此,函数通过[ 1 ][ 2 ] 执行参数验证。现在,假设一个测试用例(A = 1B = - 1)被用来做非法性测试。在这里,a= - 1 其实掩盖了b=-1,因为检查[ 2 ]从来没有得到执行。如果没有单独验证[ 2 ]的用例,这种错误场景将无法被测试到。

为了防止输入屏蔽,重要的是在同一测试用例中不使用两个无效值(两个不同的参数)。默认带前缀~”的任意值都是无效的。可以通过选项/n指定一个其它的前缀。

 

注意:

如果一个值的参数有别名,只有在第一个名称上加前缀会使值非法

2.5 权重

使用权量,可以使PICT倾向于某些取值。权重取值可以是任何正整数,默认为1

File system:    FAT, FAT32, NTFS (10)

权重没有绝对意义,你不能确定你所指定的权重会起作用,因为PICT必须处理两个潜在矛盾的要求:

以最小数量的测试用例覆盖所有组合。

根据权值选择值。

 

(1)总是优先于(2),只有当选择值得目的不是为了满足(1)时,(2)才会被采纳。

2.6 种子

种子有以下两种可能的需求:

1指定必须出现在任意测试用例中的重要的组合。

PICT将使用提供的必选组合初始化输出,然后完成测试用例的其它部分,同时需要确保所有n阶组合都覆盖到。

2当需要修改模型时,它可以使输出的更改最小化。

你可以提供前一次结果给PICTPICT将尽可能重用已有的测试用例。

 

种子行必须在单独的文件(一个种子文件)中定义。使用选项/ e指定文件位置:

pict.exe model.txt / Eseedrows.txt

种子文件和PICT的输出结果必须使用相同的格式以便可以被插入到计算出的测试用例中。使用制表符分割各参数和值,如下:

Ver    SKU    Lang   Arch

Win2K Pro    EN     x86

Win2K        DE     x86        

WinXP Pro    EN     ia64

任何种子行都要给所有参数指定值,也可能省略某些参数的值,如上述种子文件第二行没有SKU的值。在这种情况下,PICT将选择SKU的最佳值。

 

注意:

如果一个种子文件包含一个不在当前模型中的参数,PICT将丢弃该参数所在的列。

如果种子行包含一个不在当前模型中的值,PICT将从种子行删除该值。PICT只会使用种子行中的有效值,一个包含了无效值的种子行将成为不完整的行。

如果一个种子行违反了现行的约束,PICT将忽略该行。

如果(1)或(2)发生, PICT会打印警告信息。

 

PICT中使用种子时,种子文件中如果有下列格式可能会产生歧义:

空白的参数和值名称。

2参数和值名称包含制表符。

对于一个参数,值的名称和别名不是唯一的。

如果在你的模型中存在上述问题,PICT也会打印警告信息。