ホームページ >バックエンド開発 >Python チュートリアル >Python が組織アルゴリズムをペアごとに実装する方法 (効率的なテスト ケース)

Python が組織アルゴリズムをペアごとに実装する方法 (効率的なテスト ケース)

黄舟
黄舟オリジナル
2017-07-20 15:37:182768ブラウズ

次のエディターは、効率的なテストケース構成アルゴリズムの Python 実装方法をペアごとに提供します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう

冒頭:

テストプロセスでは、複数のパラメータと複数の値の状況に合わせてテストケースが整理されます。テストケースを整理するとは、各パラメータのすべての値と他のパラメータの値を完全に組み合わせて、それを製品メソッドである Python スクリプトで実装することを意味します。デカルト積法として知られています) を itertools モジュール内で使用します。

直交分析手法のメリットは、テストケースカバー率が100%であることですが、デメリットは、テストケースの数が膨大で、ユースケースの実行にかかる労力が膨大であることです。

ペアワイズ アルゴリズムは、従来の直交分析手法の最適化から派生し、その理論は数学的統計に由来しています。正直なところ、私は数理統計に関する学術論文を理解することができないので、その基本的な意味を理解するには、インターネット上で一般的で簡単な説明をいくつか見つけるしかありません。

インターネット上の多くの人は [オペレーティング システム、ブラウザ、言語環境] を例として使用します。私も同じ例を使用します。

オペレーティング システム: W (Windows)、L (Linux)、Mac (Mac)。 (Firefox)、O (Opera)、IE; 言語環境: C (中国語)、E (英語)

直交解析法によると、3x3x2=18 個の組み合わせが生成され、テスト ケースのカバー率は 100% になります。

ペアワイズペアテストケース編成メソッドは、9 つ​​の組み合わせメソッドに圧縮できます。そのため、テストケースの数が少なく、テスト漏れが必ず発生してしまうというデメリットがあります。

概要:

Pairwise アルゴリズムの中心概念

1 一連のテスト ケース (各ユース ケースは [W、M、C] などの 3 つのパラメーター値で構成されます)。 2 つの要素のペアの各組み合わせには 3 つの組み合わせがあります (位置は [W,M][W,C][M,C])。この最初のテスト セットが使用される場合、ペアの組み合わせは 3 つあります。比較原則は次のとおりです。[W, M] は他のグループの最初の要素とのみ比較され、[W, C] は他のグループの 2 番目の要素とのみ比較されます。 。 。 。 ;

[W,M][W,C][M,C] これら 3 つの要素は、残りの有効なグループ内の同じ位置の要素に出現します。このグループの Case は重複しているとみなして削除できます。

名詞の説明: [実効グループ]とは、削除されていないグループおよび比較されていないグループを意味します。例: グループ 1 と 3 が削除された場合、グループ 4 と比較される有効なグループはグループ 2、5、6、7...18 です。効果的なグループはここでピットを通過しました%>_

3. 最後に、ペアリング アルゴリズムによって計算された最適なテスト ケースのセットであるテスト ケースが取得されます。

驚くべき学術的証明ペアワイズは、1927 年に L. L. サーストン (1887 年 5 月 29 日 – 1955 年 9 月 30 日) によって初めて提案されました。彼はアメリカの精神統計学者です。ペアワイズは、数学的統計と従来の直交分析手法の最適化に基づいた製品でもあります。

ペアワイズは次の 2 つの仮定に基づいています: (1) 各次元は直交しています。つまり、各次元は互いに交差しません。

(2) 数学的統計分析によると、欠陥の 73% (単一要因の場合は 35%、二重要因の場合は 38%) は、単一要因または 2 つの要因の相互作用によって引き起こされます。欠陥の 19% は 3 つの要因の相互作用によって発生します。

したがって、ペアワイズは、2 つの要素すべての相互作用によって生成される最も費用対効果の高いユースケースのセットに基づいて生成されます。

テキスト

1.アイデア テストシナリオにおいて、テスト条件の入力からペアワイズテストケースの作成までを行う方法、Pythonプログラミングを使用するアイデアは次のとおりです。

1. allparams を変更 =[['M','O','P'],['W','L','I'],['C','E']] の完全な組み合わせ処理を実行します。分析メソッドによって生成されたテスト ケースの完全なセットの正規の 1 次元配列 (len=N) を生成するデカルト積。

2. テスト ケースの完全なセット内の各テスト ケースは、2 つの組み合わせに分解されます。テスト ケースの完全なセットと同じ長さのセット (1 次元 len=N)

3. Python バージョンのペアワイズ アルゴリズムを使用して、最終的に のセットを取得します。効果的なペアテストケース;

コードの 1 番目と 2 番目の関数は Python 独自の数学計算ライブラリを使用します。 itertools で書かれたコードの 3 番目の関数は私が思いついたコードです。

2 番目に、コードに直接移動します

# -*- 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.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行应删除,内容=%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)


コード解釈:

3 番目の for ループ コード 39 ~ 48 行目は、主に、検出される要素と、同じ位置にある要素は同じです

2 番目の for ループ コード 38 ~ 48 行目は、一連のテスト ケースで 2 つをペアにし、同じ位置にある要素と左から右に比較します

最初の forループ コード行 37 ~ 48、テスト ケースの各セットを横断します。

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

执行结果:


line 1: [(&#39;M&#39;, &#39;W&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;W&#39;, &#39;C&#39;)]  <---第二个函数get_pairslist(self,lista)处理后的两两配对组合
line 2: [(&#39;M&#39;, &#39;W&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]  <---同第一行解释
line 3: [(&#39;M&#39;, &#39;L&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;L&#39;, &#39;C&#39;)]
line 4: [(&#39;M&#39;, &#39;L&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
line 5: [(&#39;M&#39;, &#39;I&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
line 6: [(&#39;M&#39;, &#39;I&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;I&#39;, &#39;E&#39;)]
line 7: [(&#39;O&#39;, &#39;W&#39;), (&#39;O&#39;, &#39;C&#39;), (&#39;W&#39;, &#39;C&#39;)]
line 8: [(&#39;O&#39;, &#39;W&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]
line 9: [(&#39;O&#39;, &#39;L&#39;), (&#39;O&#39;, &#39;C&#39;), (&#39;L&#39;, &#39;C&#39;)]
line 10: [(&#39;O&#39;, &#39;L&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
line 11: [(&#39;O&#39;, &#39;I&#39;), (&#39;O&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
line 12: [(&#39;O&#39;, &#39;I&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;I&#39;, &#39;E&#39;)]
line 13: [(&#39;P&#39;, &#39;W&#39;), (&#39;P&#39;, &#39;C&#39;), (&#39;W&#39;, &#39;C&#39;)]
line 14: [(&#39;P&#39;, &#39;W&#39;), (&#39;P&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]
line 15: [(&#39;P&#39;, &#39;L&#39;), (&#39;P&#39;, &#39;C&#39;), (&#39;L&#39;, &#39;C&#39;)]
line 16: [(&#39;P&#39;, &#39;L&#39;), (&#39;P&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
line 17: [(&#39;P&#39;, &#39;I&#39;), (&#39;P&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
line 18: [(&#39;P&#39;, &#39;I&#39;), (&#39;P&#39;, &#39;E&#39;), (&#39;I&#39;, &#39;E&#39;)]  <----同第一行解释
--------------------------------------------------
保留元素列表:[1, 3, 4, 7, 9, 10, 12, 14, 17]  <----有效用例在数组中下标
匹配重复元素列表:[0, 2, 5, 6, 8, 11, 13, 15, 16]  <----被剔除的无效测试用例在数组中下标
最终保留测试用例个数:9 个
line 1: [(&#39;M&#39;, &#39;W&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]
line 2: [(&#39;M&#39;, &#39;L&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
line 3: [(&#39;M&#39;, &#39;I&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
line 4: [(&#39;O&#39;, &#39;W&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]
line 5: [(&#39;O&#39;, &#39;L&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
line 6: [(&#39;O&#39;, &#39;I&#39;), (&#39;O&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
line 7: [(&#39;P&#39;, &#39;W&#39;), (&#39;P&#39;, &#39;C&#39;), (&#39;W&#39;, &#39;C&#39;)]
line 8: [(&#39;P&#39;, &#39;L&#39;), (&#39;P&#39;, &#39;C&#39;), (&#39;L&#39;, &#39;C&#39;)]
line 9: [(&#39;P&#39;, &#39;I&#39;), (&#39;P&#39;, &#39;E&#39;), (&#39;I&#39;, &#39;E&#39;)]
[Finished in 0.2s]

三、代码核心内容白话解释

pairwise(self,listb)函数包含3层for循环,先画一个二维数组:


i[0]  i[1]  i[2]
listb.index(i)=0 : [(&#39;M&#39;, &#39;W&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;W&#39;, &#39;C&#39;)]
listb.index(i)=1 : [(&#39;M&#39;, &#39;W&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]
listb.index(i) : [(&#39;M&#39;, &#39;L&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;L&#39;, &#39;C&#39;)]
listb.index(i) : [(&#39;M&#39;, &#39;L&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
listb.index(i) : [(&#39;M&#39;, &#39;I&#39;), (&#39;M&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
listb.index(i) : [(&#39;M&#39;, &#39;I&#39;), (&#39;M&#39;, &#39;E&#39;), (&#39;I&#39;, &#39;E&#39;)]
listb.index(i) : [(&#39;O&#39;, &#39;W&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;W&#39;, &#39;E&#39;)]
listb.index(i) : [(&#39;O&#39;, &#39;L&#39;), (&#39;O&#39;, &#39;C&#39;), (&#39;L&#39;, &#39;C&#39;)]
listb.index(i) : [(&#39;O&#39;, &#39;L&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;L&#39;, &#39;E&#39;)]
listb.index(i) : [(&#39;O&#39;, &#39;I&#39;), (&#39;O&#39;, &#39;C&#39;), (&#39;I&#39;, &#39;C&#39;)]
listb.index(i)=n : [(&#39;O&#39;, &#39;I&#39;), (&#39;O&#39;, &#39;E&#39;), (&#39;I&#39;, &#39;E&#39;)]

二维列表 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 が組織アルゴリズムをペアごとに実装する方法 (効率的なテスト ケース)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。