>백엔드 개발 >파이썬 튜토리얼 >Python이 조직 알고리즘을 쌍으로 구현하는 방법(효율적인 테스트 사례)

Python이 조직 알고리즘을 쌍으로 구현하는 방법(효율적인 테스트 사례)

黄舟
黄舟원래의
2017-07-20 15:37:182763검색

다음 편집기는 효율적인 테스트 사례 구성 알고리즘 쌍별 Python 구현 방법을 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다.

열기:

테스트 과정에서는 이전에는 다중 매개변수 및 다중 값 상황에 맞게 테스트 케이스를 구성했습니다. 테스트 케이스를 정리하자면, 각 매개변수의 모든 값을 다른 매개변수의 값과 완전하게 조합하여 이를 프로덕트 메소드인 Python 스크립트로 구현하는 것을 의미합니다. itertools 모듈에서 Cartesian product method로 알려져 있습니다.

직교 분석 방법의 장점은 테스트 케이스 적용률이 100%라는 것입니다. 단점은 테스트 케이스 수가 많고 유스 케이스를 실행하는 데 소모되는 노동력이 크다는 것입니다.

Pairwise 알고리즘은 전통적인 직교 분석 방법의 최적화에서 파생되었으며, 그 이론은 수학적 통계에서 파생되었습니다. 솔직히 말해서 저는 수리통계에 관한 학술 논문을 이해할 수 없기 때문에 인터넷에서 그 기본적인 의미를 이해하기 위해 대중적이고 간단한 설명을 찾아볼 수밖에 없습니다.

인터넷상의 많은 사람들이 [운영 체제, 브라우저, 언어 환경]을 예로 사용합니다. 저도 같은 예를 사용합니다.

운영 체제: W(Windows), L(Linux), Mac(Mac) 브라우저: M (Firefox), O(Opera), IE; 언어 환경: C(중국어), E(영어)

직교 분석 방법에 따르면: 3x3x2=18 조합이 생성되며 테스트 케이스 적용 범위는 100%입니다.

Pairwise paired testcase 구성 방법은 9가지 조합 방법으로 압축할 수 있습니다. 따라서 테스트 케이스의 수가 적고, 확실히 놓친 테스트가 있을 것이라는 단점이 있다.

소개:

Pairwise 알고리즘의 핵심 개념

1. 테스트 사례 세트(각 사례는 [W, M, C]와 같은 3개의 매개변수 값으로 구성됨) 2개 요소의 각 조합은 3개의 조합(위치: [W,M][W,C][M,C])을 갖습니다.

2 이 첫 번째 테스트 세트를 사용하면 3개의 쌍 조합이 있습니다. 비교 원칙은 다음과 같습니다. [W, M]은 다른 그룹의 첫 번째 요소와만 비교되고, [W, C]는 다른 그룹의 두 번째 요소와만 비교됩니다. . . . ;

[W,M][W,C][M,C] 이 세 가지 요소는 나머지 유효한 그룹에서 동일한 위치의 요소에 나타납니다. 이 사례 그룹은 중복 사례로 간주되어 삭제될 수 있습니다.

명사 설명 : [유효그룹]은 삭제되지 않은 그룹과 비교되지 않은 그룹을 의미합니다. 예: 그룹 1과 3이 삭제되면 그룹 4와 비교할 유효 그룹은 그룹 2, 5, 6, 7...18입니다. 효과적인 그룹은 여기의 구덩이를 통과했습니다%>_<%

3. 마침내 페어링 알고리즘에 의해 계산된 최적의 테스트 케이스 세트인 테스트 케이스가 얻어집니다.

놀라운 학문적 증거

Pairwise는 1927년 L. L. Thurstone(1887년 5월 29일 – 1955년 9월 30일)에 의해 처음 제안되었습니다. 그는 미국의 정신통계학자이다. 페어와이즈(Pairwise) 역시 전통적인 직교분석 방법의 수학적 통계와 최적화를 기반으로 한 제품입니다.

Pairwise는 다음 두 가지 가정을 기반으로 합니다.

(1) 각 차원은 직교합니다. 즉, 각 차원은 서로 교차하지 않습니다.

(2) 수학적 통계 분석에 따르면 결점의 73%(단일 요인 35%, 이중 요인 38%)가 단일 요인 또는 2가지 요인의 상호 작용에 의해 발생합니다. 결함의 19%는 3가지 요소의 상호 작용으로 인해 발생합니다.

따라서 pairwise는 두 가지 요소 모두의 상호 작용으로 생성된 가장 비용 효율적인 사용 사례 세트를 기반으로 생성됩니다.

Text

1. Ideas

테스트 시나리오의 경우 테스트 조건을 입력하는 것부터 시작하여 pairwise 테스트 케이스를 생성하는 방법, Python 프로그래밍을 사용하는 아이디어는 다음과 같습니다.

1. allparams =[['M','O','P'],['W','L','I'],['C','E']] 변경은 다음의 전체 조합 처리를 수행합니다. 분석 방법으로 생성된 전체 테스트 케이스 세트의 정규 A 1차원 배열(len=N)을 생성하는 데카르트 곱

2. 전체 테스트 케이스 세트의 각 테스트 케이스는 두 개의 조합으로 분해됩니다. 전체 테스트 케이스 세트와 동일한 길이의 세트. 2차원 배열(1차원 len=N)

3. Python 버전의 pairwise 알고리즘을 사용하여 유효하지 않은 테스트 케이스 세트를 얻습니다. 효과적인 페어링 테스트 케이스

코드의 첫 번째와 두 번째 함수는 Python 자체 수학적 계산 라이브러리를 사용합니다. itertools로 작성된 코드의 세 번째 함수는 제가 생각해낸 코드입니다.

둘째, 코드로 바로 이동


# -*- coding: utf-8 -*-
from datetime import *
import random,os,copy,time
import logging
import itertools
&#39;&#39;&#39;
#Author:Kuzaman
#Time:2017-07-18
&#39;&#39;&#39;
class utils2 :
 #1、笛卡尔积 对参数分组全排列
 def product(self,tuple1):
  newlist=[]
  for x in eval(&#39;itertools.product&#39;+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 (&#39;--&#39;*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,&#39;===>&#39; ,k[Xa],&#39;相等了。。。&#39;)
      flag[Xa] = 1
      break
     else:
      # print (sublb,&#39;===>&#39; ,k[Xa],&#39;不不不等了。。。&#39;)
      flag[Xa] = 0
   # print (&#39;下标%d,子元素 %s 双匹配对比结果flag:%s&#39;%(listb.index(lb),lb,flag))
   if 0 not in flag:
    num = listb.index(lb)
    delmenu.append(num)
    templistb.remove(lb)
    # print (&#39;下标为%d行应删除,内容=%s,&#39;%(num,lb))
    # print (&#39;delmenu:&#39;,delmenu)
   else:
    num2 = listb.index(lb)
    holdmenu.append(num2)
    # print (&#39;下标为%d行应保留,内容=%s,&#39;%(num2,lb))
    # print(&#39;holdmenu=&#39;,holdmenu)
   # print (&#39;***&#39;*20)
  print (&#39;保留元素列表:%s \n匹配重复元素列表:%s&#39;%(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 (&#39;line %d:&#39;%(list.index(i)+1),i)  

if __name__ == &#39;__main__&#39;:
 u2 = utils2()
 allparams=[[&#39;M&#39;,&#39;O&#39;,&#39;P&#39;],[&#39;W&#39;,&#39;L&#39;,&#39;I&#39;],[&#39;C&#39;,&#39;E&#39;]]#,&#39;K&#39;],[1,2,3],[&#39;Yes&#39;,&#39;No&#39;]]
 str = u2.product(allparams)
 strpc = u2.get_pairslist(str)
 finallist = u2.pairwise(strpc)
 print(&#39;最终保留测试用例个数:%d 个&#39;%(len(finallist)))
 u2.pprint(finallist)

코드 해석:

세 번째 for 루프 코드 줄 39~48은 주로 감지할 요소와 같은 위치에 요소가 있습니다 동일

두 번째 for 루프 코드 라인 38~48, 테스트 케이스 세트에서 두 개를 쌍으로 구성하고 왼쪽에서 오른쪽으로 같은 위치에 있는 요소와 비교합니다

첫 번째 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.