高效测试用例组织算法pairwise之Python实现(简洁篇)

------------------------------------------本文原创,如有转载请注明出处----------------------------------

开篇:

  正交分析法的优点是测试用例覆盖率100%,缺点测试用例数量庞大,执行用例消耗的人工巨大。

  Pairwise (结对)算法源于对传统的正交分析方法优化后得到的产物,示例:用  【操作系统,浏览器,语言环境】来举例的:

    操作系统: W(Windows),L(Linux),Mac (Mac) ;浏览器:M(Firefox),O(Opera),IE;语言环境:C(中文),E(英文)

  按照正交分析法:会产生3x3x2=18种组合方式 ,测试用例覆盖率100%。

  Pairwise结对测试用例组织法,可压缩到9种组合方式。优点:用例数量少,缺点:是一定会有漏测。

引论:

  Pairwise算法的核心理念

    1、一组测试用例(每个用例有3个参数的值组成,如[W,M,C])中每一个2个元素组合起来,两两组合,就有3种组合方式(有位置的[W,M][W,C][M,C]);

    2、如果这第一组测试用两两组合出的3种组合方式,与其他组合的对比原则是:[W,M]只会和其他组的第一个元素对比,[W,C]只会和其他组中第二个元素对比。。。。;

         如果 [W,M][W,C][M,C]这三个元素分别出现在其余有效组位置相同的元素中,就可以认为这一组Case为多余Case,并进行删除。

      名词解释:【有效组】表示未被删除的组和未被对比过的组。举例:第1,3组被删除,则第4组要对比的有效组为第2,5,6,7...18组。

    3、最终得到测试用例,就是结对算法计算出来的最优测试用例集合。

正文

 一、核心代码

  备注:下文完整的函数代码才是pairwise算法的实现

1 # -*- coding: utf-8 -*-
5 import itertools
10 class utils2 :
11     #1、笛卡尔积 对参数分组全排列
12     def product(self,tuple1):
...... 18 #2、对笛卡尔积处理后的二维原始数据进行N配对处理,得到Pairwise计算之前的数据 19 def get_pairslist(self,lista): 20     
......
28     #3、进行Pirwise算法计算
29     def pairwise(self,listb):
30         sublistlen = len(listb[1])
31         flag = [0]*sublistlen
32         templistb = copy.deepcopy(listb)
33         delmenu = []
34         holdmenu=[]
35         self.pprint (listb)
37         for lb in listb:  #第一for循环
38             for sublb in lb:   #第二for循环
39                 for k in templistb:   #第三for循环
40                     Xa = lb.index(sublb)    #记录横轴坐标
41                     Ya = listb.index(lb)    #记录纵轴坐标
42                     if k != lb and sublb == k[Xa]: # 非当前对比行,且待对比元素与它所在行的其他有效值,有相等的情况
44                         flag[Xa] = 1 #记录元素相同的横坐标位置
45                         break #已经查到相同元素,没必要继续循环。
46                     else:
48                         flag[Xa] = 0
50             if 0 not in flag:   #判断记录元素对比结果保存的列表中,中所有值都是 1(“元素相同”)
51                 num = listb.index(lb)
52                 delmenu.append(num)
53                 templistb.remove(lb) #一行中所有元素在其他有效行中出现,则templistb中删除正在对比的这行数据。
56             else:
57                 num2 = listb.index(lb)
58                 holdmenu.append(num2)
62         print ('保留元素列表:%s \n匹配重复元素列表:%s'%(holdmenu,delmenu))
63 return templistb
...

  代码解读:

  第三for循环代码39~48行,主要是垂直判断 待检测元素 与 相同位置的元素是否有相同的

  第二for循环代码38~48行,把一组测试用例中的两两配对,从左至右分别和同位置的元素作对比

  第一for循环代码37~48行,遍历每一组测试用例。

  第50~58行代码,判断一组用例的两两配对在其他组同位置上从上到下都能找到相同元素,则将改无效Case从templistb中删除,保持templistb的有效性。

 

执行结果:

保留元素列表:[1, 3, 4, 7, 9, 10, 12, 14, 17]         
匹配重复元素列表:[0, 2, 5, 6, 8, 11, 13, 15, 16]     
最终保留测试用例个数:9 个
line 1: [('M', 'W'), ('M', 'E'), ('W', 'E')]
line 2: [('M', 'L'), ('M', 'E'), ('L', 'E')]
line 3: [('M', 'I'), ('M', 'C'), ('I', 'C')]
line 4: [('O', 'W'), ('O', 'E'), ('W', 'E')]
line 5: [('O', 'L'), ('O', 'E'), ('L', 'E')]
line 6: [('O', 'I'), ('O', 'C'), ('I', 'C')]
line 7: [('P', 'W'), ('P', 'C'), ('W', 'C')]
line 8: [('P', 'L'), ('P', 'C'), ('L', 'C')]
line 9: [('P', 'I'), ('P', 'E'), ('I', 'E')]
[Finished in 0.2s]

  完整文章请参考《高效测试用例组织算法pairwise之Python实现(啰嗦篇)》  http://www.cnblogs.com/kuzaman/p/7202146.html

------------------------------------------本文原创,如有转载请注明出处----------------------------------

 

 

  

 

posted @ 2017-07-19 10:23  kuzaman  阅读(2309)  评论(0编辑  收藏  举报