成对组合覆盖与PICT的应用一、成对组合覆盖简介成对组合覆盖这一概念是Mandl于1985年在测试Aad编译程序时提出来的。Cohen等人应用成对组合覆盖测试技术对Unix中的“Sort”命令进行了测试。测试结果表明覆盖率高达90%以上。可见成对组合覆盖是一种非常有效的测试用例设计方法。成对组合覆盖要求任意两个因素(输入条件)的所有水平组合至少要被覆盖1次。组合覆盖的算法已经被很多工具实现,测试人员可以直接利用这些工具,例如:TConfig、微软的PICT等。下面介绍一下使用PICT设计测试用例的过程。二、PICT的应用(一)PICT概述成对组合覆盖测试工具PICT能帮助你有效地设计软件系统测试用例和测试配置。使用PICT生成的测试用例比手工生成的更有效。在保证测试覆盖率的前提下,尽量缩小参数值组合的。PS:其实pict不单单是成对组合(2阶),其实可以实现多阶组合覆盖,只是默认为2阶(二)使用PICT组合测试用例参数PICT以命令行方式运行。在运行之前,需要准备一份详细描述了测试参数的模型文件。例如,如果你想给分区和卷建立一组测试用例集,在这里需要用到以下几个参数:------------------------------------------------------------------------------类型:Primary,Logical,Single,Span,Stripe,Mirror,RAID-5尺寸:10,100,500,1000,5000,10000,40000格式方法:快,慢文件系统:FAT,FAT32,NTFS簇大小:512,1024,2048,4096,8192,16384,32768,65536压缩:开,关-------------------------------------------------------------------------------这些参数可能的取值组合超过4700个。在合理的时间范围内测试完他们那将是非常困难的一件事情。研究表明,把所有可能的值成对进行组合能做到很好的测试覆盖且测试用例的数量由此也会变得可控。例如,(Primary,FAT)是一对和(10,慢)是另外一对,单个测试用例可以覆盖到多个部分。使用上面的参数运行PICT将产生60个测试用例。Eg:modelfile1.txt(三)运行PICTPICT是一个命令行工具,它接受一个纯文本文件作为输入,然后输出测试用例集。----------------------------------------------------------------------------用法:PICT模型文件路径[选项]选项:/o:N-组合次数(默认:2)/d:C-值之间的分隔符(默认:,)/a:C-别名间的分隔符(默认:|)/n:C-负值前缀(默认:~)/e:file-种子文件/r[:N]-随机生成,N表示产生随机的种子/c-模型计算区分大小写/s-显示模型统计数据-------------------------------------------------------------------------------PICT安装程序将会把PICT安装到指定的路径,然后你可以从指定的目录中运行它。要想查看上面例子的PICT输出,可使用任何像Windows®记事本®的文本编辑器创建模型文件,然后运行下面的命令:(四)模型文件1、模型区域一个模型文件至少包含1个区域,最多包含3个区域:-------------------------------------------------------------------------------参数定义[子模型定义][约束定义]-------------------------------------------------------------------------------模型文件中的区域应始终按照上面所列的先后顺序被显示,且不能重叠。首先是参数定义部分,然后是子模型定义和约束定义部分。它们之间不需要任何特殊的分隔符。空行可以出现在任何地方。可以用“#”开启一行注释。1)、简单模型为了产生一个非常基本的模型文件,你需要列出参数名称,每行一个参数和它可能的取值之间用分号分隔:参数名称:Value1,Value2,Value3,...例如:#这是一个测试创建/删除磁盘卷功能的简单模型文件Size:10,100,500,1000,5000,10000,40000Filesystem:FAT,FAT32,NTFSClustersize:512,1024,2048,4096,8192,16384,32768,65536逗号是默认的分隔符,可使用“/d:”选项指定一个不同的分隔符。(模型文件中的符号都需要用英文输入法半角下输入)Eg:modelfile2.txt2)、成对和高阶生成默认情况下,PICT生成一组成对组合且覆盖所有情况的测试用例集。可以使用选项“/o:N”设置比2更大的排列次数。例如,如果指定“/o:3”,由此生成的测试用例将涵盖所有三个一组的值,产生比成对测试更多的测试用例,这样测试的覆盖范围就更大。对于一个简单的模型文件,PICT选项“/o:N”的最大取值应小于等于模型文件中参数的总量。如果N取值等于参数总量,那参数取值将会涵盖所有可能的组合。同样,指定“/o:1”将产生涵盖所有值一次的测试组合。Eg:modelfile2.txt执行2阶(即成对组合)时,有56个用例。执行3阶时(即全部覆盖,因为只有3个参数),有168个用例执行1阶时,只有8个用例(因为其中一个参数的最多可能值为8)3)、子模型子模型允许你将一些参数绑定到组中,以得到自定义的组合顺序。在某些参数组合需要被更充分测试时,这种方式会很有用。子模型以下面的格式定义:(ParamName1,ParamName2,ParamName3,...)@Order例如,子模型对涉及硬件和软件参数结合在一起的测试用例时是十分有用的。没有子模型,每个测试用例将产生一个新的、唯一的硬件配置。将硬件参数放置到一个子模型中可以产生更少的硬件配置,从而尽可能地降低测试成本。使用创建子模型的命令可带来不少灵活性。------------------------------------PLATFORM:x86,ia64,amd64CPUS:Single,Dual,QuadRAM:128MB,1GB,4GB,64GBHDD:SCSI,IDEOS:NT4,Win2K,WinXP,Win2K3IE:4.0,5.0,5.5,6.0APP:SQLServer,Exchange,Offi{PLATFORM,CPUS,RAM,HDD}@3{OS,IE}@2下图描述了上面的模型是怎么产生的:Eg:modelfile4.txt(60个用例)modelfile5.txt(20个用例)注意:1.你可以定义尽可能多的子模型,一个参数可属于多个子模型。模型层次结构可以只是一个层次。2.子模型order的取值不能超过它所含参数的数量。在上面的例子中,第一个子模型的order可以取1到4之间的值。3.如果你没有给子模型指定order值,PICT会使用默认的order值或使用选项“/o”的值。2、模型选项1)、约束:条件约束、无条件约束约束允许你指定域的限制。在前面的分区例子中,一对(FAT,5000)将至少出现在一个测试用例中。但是,FAT文件系统不能创建大于4096MB的卷。注意,你不能简单地从测试集中删除这样的测试用例,因为这个讨厌的用例可能覆盖一些没有出现在其它用例中但有效的测试情况。为了避免丢失有效的测试情况,你可以在生成的过程中排除不可接受的组合。在PICT中指定一个约束,像下面这样:-------------------------------------------------------------------------------Type:Primary,Logical,Single,Span,Stripe,Mirror,RAID-5Size:10,100,500,1000,5000,10000,40000Formatmethod:quick,slowFilesystem:FAT,FAT32,NTFSClustersize:512,1024,2048,4096,8192,16384,32768,65536Compression:on,offIF[Filesystem]=FATTHEN[Size]=4096;IF[Filesystem]=FAT32THEN[Size]=32000;为了更能看出效果,如下例子:Eg:modelfile6.txt1.条件约束参数及其取值是谓词逻辑的原子部分。它们之间的关系可使用这些符号表示:=,,,=,,=,和LIKE。LIKE是一个通用匹配的操作(*表示任意多个字符,?表示任意一个字符)。约束分为两种:有条件的(if-then-else)和无条件的。[Size]10000[Compression]=OFF[Filesystem]likeFAT*-------------------------------------------------------------------------------操作符IN允许指定一组满足明确关系的值:-------------------------------------------------------------------------------IF[Clustersize]in{512,1024,2048}THEN[Compression]=Off;IF[Filesystem]in{FAT,FAT32}THEN[Compression]=Off;如下面后台的一个检索条件:选择不同的专卖店则有其对应的不同广告标题值(则可用上面的in来明确一组关系值)在IF、THEN、ELSE的语句中可以加入逻辑操作符NOT、AND和OR。可使用圆括号改变它们的运算优先顺序:-------------------------------------------------------------------------------IF[Filesystem]NTFSOR([Filesystem]=NTFSAND[Clustersize]4096)THEN[Compression]=Off;IFNOT([Filesystem]=NTFSOR([Filesystem]=NTFSANDNOT[Clustersize]=4096))THEN[Compression]=Off;参数可以被组合到另一个参数中:----------------------------------------------------------------#Machine1OS_1:Win2000,WinXPSKU_1:Professional,Server,Datacenter,WinPoweredLANG_1:EN,DE#Machine2OS_2:Win2000,WinXPSKU_2:Professional,Server,DatecenterLANG_2:EN,DEIF[LANG_1]=[LANG_2]THEN[OS_1][OS_2]AND[SKU_1][SKU_2];2.无条件约束(不变)一个不变的声明在一个域中总是有效的限制:#至少有一对参数不相等才是有意义的测试用例(使用OR运算符)[OS_1][OS_2]or[SKU_1][SKU_2]or[LANG_1][LANG_2];-------------------------------------------------------------------------------#每对参数必须不相等(使用AND运算符)[OS_1][OS_2]and[S