# -*- coding: utf-8 -*-
from datetime import *
import random,os,copy,time
import logging
import itertools
'''
#Author:Kuzaman
#Time:2017-07-18
'''
class utils2 :
#1、笛卡尔积 对参数分组全排列
def product(self,tuple1):
newlist=[]
for x in eval('itertools.product'+str(tuple(tuple1))):
newlist.append(x)
return newlist
#2、对笛卡尔积处理后的二维原始数据进行N配对处理,得到Pairwise计算之前的数据
def get_pairslist(self,lista):
pwlist = []
for i in lista:
subtemplist = []
for sublista in itertools测试数据binations(i, 2):
subtemplist.append(sublista)
pwlist.append(subtemplist)
return pwlist
#3、进行Pirwise算法计算
def pairwise(self,listb):
sublistlen = len(listb[1])
flag = [0]*sublistlen
templistb = copy.deepcopy(listb)
delmenu = []
holdmenu=[]
self.pprint (listb)
print ('--'*25)
for lb in listb:
for sublb in lb:
for k in templistb:
Xa = lb.index(sublb)
Ya = listb.index(lb)
if k != lb and sublb == k[Xa]:
# print (sublb,'===>' ,k[Xa],'相等了。。。')
flag[Xa] = 1
break
else:
# print (sublb,'===>' ,k[Xa],'不不不等了。。。')
flag[Xa] = 0
# print ('下标%d,子元素 %s 双匹配对比结果flag:%s'%(listb.index(lb),lb,flag))
if 0 not in flag:
num = listb.index(lb)
delmenu.append(num)
templistb.remove(lb)
# print ('下标为%d行应删除,内容=%s,'%(num,lb))
# print ('delmenu:',delmenu)
else:
num2 = listb.index(lb)
holdmenu.append(num2)
# print ('下标为%d行应保留,内容=%s,'%(num2,lb))
# print('holdmenu=',holdmenu)
# print ('***'*20)
print ('保留元素列表:%s \n匹配重复元素列表:%s'%(holdmenu,delmenu))
return templistb
def pwresult(self,slist,delmenu):
for x in delmenu:
slist.remove(slist[x])
return slist
def pprint(self,list):
for i in list:
print ('line %d:'%(list.index(i)+1),i)
if __name__ == '__main__':
u2 = utils2()
allparams=[['M','O','P'],['W','L','I'],['C','E']]#,'K'],[1,2,3],['Yes','No']]
str = u2.product(allparams)
strpc = u2.get_pairslist(str)
finallist = u2.pairwise(strpc)
print('最终保留测试用例个数:%d 个'%(len(finallist)))
u2.pprint(finallist) line 1: [('M', 'W'), ('M', 'C'), ('W', 'C')] <---第二个函数get_pairslist(self,lista)处理后的两两配对组合
line 2: [('M', 'W'), ('M', 'E'), ('W', 'E')] <---同第一行解释
line 3: [('M', 'L'), ('M', 'C'), ('L', 'C')]
line 4: [('M', 'L'), ('M', 'E'), ('L', 'E')]
line 5: [('M', 'I'), ('M', 'C'), ('I', 'C')]
line 6: [('M', 'I'), ('M', 'E'), ('I', 'E')]
line 7: [('O', 'W'), ('O', 'C'), ('W', 'C')]
line 8: [('O', 'W'), ('O', 'E'), ('W', 'E')]
line 9: [('O', 'L'), ('O', 'C'), ('L', 'C')]
line 10: [('O', 'L'), ('O', 'E'), ('L', 'E')]
line 11: [('O', 'I'), ('O', 'C'), ('I', 'C')]
line 12: [('O', 'I'), ('O', 'E'), ('I', 'E')]
line 13: [('P', 'W'), ('P', 'C'), ('W', 'C')]
line 14: [('P', 'W'), ('P', 'E'), ('W', 'E')]
line 15: [('P', 'L'), ('P', 'C'), ('L', 'C')]
line 16: [('P', 'L'), ('P', 'E'), ('L', 'E')]
line 17: [('P', 'I'), ('P', 'C'), ('I', 'C')]
line 18: [('P', 'I'), ('P', 'E'), ('I', 'E')] <----同第一行解释
--------------------------------------------------
保留元素列表:[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] i[0] i[1] i[2]
listb.index(i)=0 : [('M', 'W'), ('M', 'C'), ('W', 'C')]
listb.index(i)=1 : [('M', 'W'), ('M', 'E'), ('W', 'E')]
listb.index(i) : [('M', 'L'), ('M', 'C'), ('L', 'C')]
listb.index(i) : [('M', 'L'), ('M', 'E'), ('L', 'E')]
listb.index(i) : [('M', 'I'), ('M', 'C'), ('I', 'C')]
listb.index(i) : [('M', 'I'), ('M', 'E'), ('I', 'E')]
listb.index(i) : [('O', 'W'), ('O', 'E'), ('W', 'E')]
listb.index(i) : [('O', 'L'), ('O', 'C'), ('L', 'C')]
listb.index(i) : [('O', 'L'), ('O', 'E'), ('L', 'E')]
listb.index(i) : [('O', 'I'), ('O', 'C'), ('I', 'C')]
listb.index(i)=n : [('O', 'I'), ('O', 'E'), ('I', 'E')] 二维列表 listb ,其中的行(发音:hang,二声。横着的那排)从上到下就是第一层for循环 ;每一行中的i[0],i[1],i[2]就是第二层for循环从左至右;第三次for循环元素i[x]从上之下与有效组 templistb通位置元素的对比。
1、第n行的i[0]要和有效templistb的其他行的i[0]元素对比(第三for),如果有相等的,记录一个标识 如 flag1=True,如果没有相等的记录falg1=False;
2、直到第二for中的i[0],i[1],i[2]都进行对比后,会得到 [flag1,flag2,flag3 ],所有flag=True则该行为无效用例
3、第一for遍历全部组合,最终得到保留下来的有效templistb
见图:
完结篇
以上是自己编写的pairwise的全部内容,此算法共耗时3天:
第一天在确定这究竟是什么算法,看了很多学术文献,看不懂;
第二天开始写程序,for的嵌套循环设计耽误很久;
第三天程序成型,有执行结果,发现与参考文章结论不同,随后再仔细研读参考文章,发现掉坑里了。重新推翻代码按照正确思路,用1个小时完成最终结果。
本人做测试的,还不是专业的测试开发,写代码比较费劲,真正应了设计占70%,编码占30%的理。如果像基础在差点,逻辑在乱点,就只能用时间堆了。
以上就是Python如何实现组织算法pairwise(高效测试用例)的详细内容,更多请关注Gxl网其它相关文章!
查看更多关于Python如何实现组织算法pairwise(高效测试用例)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did81870