亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

高效測試用例組織算法pairwise之Python實現(xiàn)方法

 更新時間:2017年07月19日 08:44:47   投稿:jingxian  
下面小編就為大家?guī)硪黄咝y試用例組織算法pairwise之Python實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

開篇:

測試過程中,對于多參數(shù)參數(shù)多值的情況進行測試用例組織,之前一直使用【正交分析法】進行用例組織,說白了就是把每個參數(shù)的所有值分別和其他參數(shù)的值做一個全量組合,用Python腳本實現(xiàn),就是itertools模塊中product方法(又稱笛卡爾積法)。

正交分析法的優(yōu)點是測試用例覆蓋率100%,缺點測試用例數(shù)量龐大,執(zhí)行用例消耗的人工巨大。

Pairwise (結對)算法源于對傳統(tǒng)的正交分析方法優(yōu)化后得到的產(chǎn)物,它的理論來自于數(shù)學統(tǒng)計。毫不避諱的說,本人看不懂數(shù)學統(tǒng)計中的學術論文,只能從網(wǎng)上找一些通俗簡單的說法來理解其基本含義。

網(wǎng)上很多人都實例都是用 【操作系統(tǒng),瀏覽器,語言環(huán)境】來舉例的,本人也做同樣示例:

操作系統(tǒng): W(Windows),L(Linux),Mac (Mac) ;瀏覽器:M(Firefox),O(Opera),IE;語言環(huán)境:C(中文),E(英文)

按照正交分析法:會產(chǎn)生3x3x2=18種組合方式 ,測試用例覆蓋率100%。

Pairwise結對測試用例組織法,可壓縮到9種組合方式。因此有點是 測試用例數(shù)量少,缺點是一定會有漏測。

引論:

Pairwise算法的核心理念

1、一組測試用例(每個用例有3個參數(shù)的值組成,如[W,M,C])中每一個2個元素組合起來,兩兩組合,就有3種組合方式(有位置的[W,M][W,C][M,C]);

2、如果這第一組測試用兩兩組合出的3種組合方式,對比原則:[W,M]只會和其他組的第一個元素對比,[W,C]只會和其他組中第二個元素對比。。。。;

[W,M][W,C][M,C]這三個元素分別出現(xiàn)在其余有效組位置相同的元素中,就可以認為這一組Case為多余Case,并進行刪除。

名詞解釋:【有效組】表示未被刪除的組和未被對比過的組。舉例:第1,3組被刪除,則第4組要對比的有效組為第2,5,6,7...18組。有效組這里踩過坑%>_<%

3、最終得到測試用例,就是結對算法計算出來的最優(yōu)測試用例集合。

牛逼閃閃的學術證明 

Pairwise是L. L. Thurstone(29 May1887 – 30 September 1955)在1927年首先提出來的。他是美國的一位心理統(tǒng)計學家。Pairwise也正是基于數(shù)學統(tǒng)計和對傳統(tǒng)的正交分析法進行優(yōu)化后得到的產(chǎn)物。

Pairwise基于如下2個假設:

(1)每一個維度都是正交的,即每一個維度互相都沒有交集。

(2)根據(jù)數(shù)學統(tǒng)計分析,73%的缺陷(單因子是35%,雙因子是38%)是由單因子或2個因子相互作用產(chǎn)生的。19%的缺陷是由3個因子相互作用產(chǎn)生的。

因此,pairwise基于覆蓋所有2因子的交互作用產(chǎn)生的用例集合性價比最高而產(chǎn)生的。

正文

一、思路

對一個測試場景如何從何從輸入被測條件,到產(chǎn)出Pairwise測試用例,使用Python編程思路如下:

1、將allparams=[['M','O','P'],['W','L','I'],['C','E']]進行笛卡爾積全組合處理,生成正則分析法產(chǎn)生的全量測試用例集合的一維數(shù)組(len=N);

2、將全量測試用例中的每個測試用例,都進行兩兩組合的分解處理,生成與全量測試用例集合 長度相同的二維數(shù)組(一維 len=N);

3、使用Python版Pairwise算法剔除無效測試用例,最終得到有效的結對測試用例集合;

代碼第1,2函數(shù)利用Python自帶數(shù)學計算庫itertools編寫,代碼第3函數(shù)為本人死磕出來的代碼。

二、直接上代碼

# -*- coding: utf-8 -*-
from datetime import *
import random,os,copy,time
import logging
import itertools
'''
#Author:Kuzaman
#Time:2017-07-18
'''
class utils2 :
 #1、笛卡爾積 對參數(shù)分組全排列
 def product(self,tuple1):
  newlist=[]
  for x in eval('itertools.product'+str(tuple(tuple1))):
   newlist.append(x)
  return newlist 
 
 #2、對笛卡爾積處理后的二維原始數(shù)據(jù)進行N配對處理,得到Pairwise計算之前的數(shù)據(jù)
 def get_pairslist(self,lista):
  pwlist = []
  for i in lista:
   subtemplist = []
   for sublista in itertools.combinations(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行應刪除,內(nèi)容=%s,'%(num,lb))
    # print ('delmenu:',delmenu)
   else:
    num2 = listb.index(lb)
    holdmenu.append(num2)
    # print ('下標為%d行應保留,內(nèi)容=%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('最終保留測試用例個數(shù):%d 個'%(len(finallist)))
 u2.pprint(finallist)

代碼解讀:

第三for循環(huán)代碼39~48行,主要是垂直判斷 待檢測元素 與 相同位置的元素是否有相同的

第二for循環(huán)代碼38~48行,把一組測試用例中的兩兩配對,從左至右分別和同位置的元素作對比

第一for循環(huán)代碼37~48行,遍歷每一組測試用例。

第50~58行代碼,判斷一組用例的兩兩配對在其他組同位置上從上到下都能找到相同元素,則將改無效Case從templistb中刪除,保持templistb的有效性。

執(zhí)行結果:

line 1: [('M', 'W'), ('M', 'C'), ('W', 'C')]  <---第二個函數(shù)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]  <----有效用例在數(shù)組中下標
匹配重復元素列表:[0, 2, 5, 6, 8, 11, 13, 15, 16]  <----被剔除的無效測試用例在數(shù)組中下標
最終保留測試用例個數(shù):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]

三、代碼核心內(nèi)容白話解釋

pairwise(self,listb)函數(shù)包含3層for循環(huán),先畫一個二維數(shù)組:

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 ,其中的行(發(fā)音:hang,二聲。橫著的那排)從上到下就是第一層for循環(huán) ;每一行中的i[0],i[1],i[2]就是第二層for循環(huán)從左至右;第三次for循環(huán)元素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的全部內(nèi)容,此算法共耗時3天:

第一天在確定這究竟是什么算法,看了很多學術文獻,看不懂;

第二天開始寫程序,for的嵌套循環(huán)設計耽誤很久;

第三天程序成型,有執(zhí)行結果,發(fā)現(xiàn)與參考文章結論不同,隨后再仔細研讀參考文章,發(fā)現(xiàn)掉坑里了。重新推翻代碼按照正確思路,用1個小時完成最終結果。

本人做測試的,還不是專業(yè)的測試開發(fā),寫代碼比較費勁,真正應了設計占70%,編碼占30%的理。如果像基礎在差點,邏輯在亂點,就只能用時間堆了。

希望對需要組織測試用例,或者自動化測試中需要組織用例的同行們有所幫助。

這篇高效測試用例組織算法pairwise之Python實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • python的sorted用法詳解

    python的sorted用法詳解

    在本篇文章里小編給大家整理了關于python的sorted用法以及相關實例內(nèi)容,有需要的朋友們參考學習下。
    2019-06-06
  • python 檢查是否為中文字符串的方法

    python 檢查是否為中文字符串的方法

    今天小編就為大家分享一篇python 檢查是否為中文字符串的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python存儲List數(shù)據(jù)到文件(text/csv/excel)幾種常見方法

    Python存儲List數(shù)據(jù)到文件(text/csv/excel)幾種常見方法

    在數(shù)據(jù)分析中經(jīng)常需要從csv格式的文件中存取數(shù)據(jù)以及將數(shù)據(jù)寫書到csv文件中,下面這篇文章主要給大家介紹了關于Python存儲List數(shù)據(jù)到文件(text/csv/excel)的幾種常見方法,需要的朋友可以參考下
    2024-02-02
  • 基于python模擬bfs和dfs代碼實例

    基于python模擬bfs和dfs代碼實例

    這篇文章主要介紹了基于python模擬bfs和dfs代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • pytest使用parametrize將參數(shù)化變量傳遞到fixture

    pytest使用parametrize將參數(shù)化變量傳遞到fixture

    這篇文章主要為大家介紹了pytest使用parametrize將參數(shù)化變量傳遞到fixture的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 使用anaconda的pip安裝第三方python包的操作步驟

    使用anaconda的pip安裝第三方python包的操作步驟

    今天小編就為大家分享一篇使用anaconda的pip安裝第三方python包的操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 在python中的socket模塊使用代理實例

    在python中的socket模塊使用代理實例

    這篇文章主要介紹了在python中的socket模塊使用代理實例,調(diào)用socks.setdefaultproxy即可實現(xiàn),需要的朋友可以參考下
    2014-05-05
  • Python之Pygame的Draw繪圖

    Python之Pygame的Draw繪圖

    Pygame 中提供了一個draw模塊用來繪制一些簡單的圖形狀,比如矩形、多邊形、圓形、直線、弧線等。本文主要介紹Pygame中的Draw繪圖,感興趣的同學可以參考閱讀
    2023-04-04
  • Python利用正則表達式匹配并截取指定子串及去重的方法

    Python利用正則表達式匹配并截取指定子串及去重的方法

    這篇文章主要介紹了Python利用正則表達式匹配并截取指定子串及去重的方法,涉及Python正則表達式匹配及字符串截取操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • python 實現(xiàn)歸并排序算法

    python 實現(xiàn)歸并排序算法

    python 實現(xiàn)歸并排序算法代碼,需要的朋友可以參考下
    2012-06-06

最新評論