Maison développement back-end Tutoriel Python Comment Python implémente l'algorithme d'organisation par paires (cas de test efficaces)

Comment Python implémente l'algorithme d'organisation par paires (cas de test efficaces)

Jul 20, 2017 pm 03:37 PM
python 算法 organiser

L'éditeur suivant vous proposera une méthode d'implémentation Python d'un algorithme efficace d'organisation des cas de test par paires. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'oeil.

Ouverture :

Pendant le processus de test, des cas de tests sont organisés pour le cas de multi- Paramètres de paramètres avec plusieurs valeurs., J'utilise [Méthode d'analyse orthogonale] pour organiser les cas d'utilisation, pour parler franchement, cela signifie faire une combinaison complète de toutes les valeurs de chaque paramètre avec les valeurs. ​d'autres paramètres. Il est implémenté avec un script Python, qui est la méthode produit (également connue sous le nom de flûte) dans le module itertools (méthode produit Karl).

L'avantage de la méthode d'analyse orthogonale est que le taux de couverture des cas de test est de 100 %. L'inconvénient est que le nombre de cas de test est énorme et la consommation de main-d'œuvre pour l'exécution des cas d'utilisation est énorme.

L'algorithme par paires est dérivé de l'optimisation des méthodes d'analyse orthogonales traditionnelles, et sa théorie vient des statistiques mathématiques. Pour être honnête, je ne comprends pas les articles universitaires sur les statistiques mathématiques, je ne peux donc trouver que quelques explications simples et populaires sur Internet pour comprendre leur signification fondamentale.

De nombreuses personnes sur Internet utilisent [système d'exploitation, navigateur, environnement linguistique] comme exemples. J'utilise également le même exemple :

Système d'exploitation : W (Windows), L (Linux), Mac (Mac) ; Navigateur : M (Firefox), O (Opera), IE ; Environnement linguistique : C (chinois), E (anglais)

Selon la méthode d'analyse orthogonale : 3x3x2 sera généré =18. méthodes de combinaison, couverture des cas de test à 100 %.

La méthode d'organisation des cas de test par paires peut être compressée en 9 combinaisons. Par conséquent, l'inconvénient est que le nombre de cas de test est faible et l'inconvénient est qu'il y aura certainement des tests manqués.

Introduction :

Le concept de base de l'algorithme Pairwise

1. Un ensemble de cas de test (chaque cas d'utilisation se compose de 3 valeurs de paramètres, telles que [W, M, C]). Chaque 2 éléments est combiné, et lorsqu'il est combiné par paires, il existe 3 combinaisons (positionnées) [W,). M][W,C][M,C]);

2. Si cette première série de tests utilise trois combinaisons de deux par deux, le principe de comparaison est : [W,M] Ce sera seulement par rapport au premier élément des autres groupes, et [W, C] ne sera comparé qu'au deuxième élément des autres groupes. . . . ;

[W,M][W,C][M,C] Ces trois éléments apparaissent dans les éléments ayant la même position dans les groupes valides restants, ce groupe de Cas peut donc être considéré comme des Cas redondants. , et à supprimer.

Explication du nom : [Groupe effectif] désigne un groupe qui n'a pas été supprimé et un groupe qui n'a pas été comparé. Par exemple : Si les groupes 1 et 3 sont supprimés, les groupes effectifs à comparer avec le groupe 4 sont les groupes 2, 5, 6, 7...18. Le groupe effectif a franchi la fosse ici%>_<%

3. Le cas de test est finalement obtenu, qui est l'ensemble optimal de cas de test calculé par l'algorithme d'appariement.

Une preuve académique brillante

Pairwise a été proposée pour la première fois par L. L. Thurstone (29 mai 1887 – 30 septembre 1955) en 1927. C'est un psychostatisticien américain. Pairwise est également un produit basé sur des statistiques mathématiques et l'optimisation des méthodes d'analyse orthogonales traditionnelles.

Pairwise est basé sur les deux hypothèses suivantes :

(1) Chaque dimension est orthogonale, c'est-à-dire que chaque dimension est indépendante de chacune autre carrefour.

(2) Selon l'analyse statistique mathématique, 73 % des défauts (35 % pour un seul facteur et 38 % pour deux facteurs) sont causés par un seul facteur ou par l'interaction de 2 facteurs. 19 % des défauts sont causés par l’interaction de 3 facteurs.

Par conséquent, par paire est généré sur la base de l'ensemble de cas d'utilisation le plus rentable généré par l'interaction des 2 facteurs.

Texte

1. Idées

Un scénario de test Comment pour commencer depuis la saisie des conditions testées jusqu'à la production de cas de test Pairwise, les idées de programmation Python sont les suivantes :

1 Définissez allparams=[['M','O','P'],[' W. ','L','I'],['C','E']] effectue un traitement de combinaison complète de produits cartésiens pour générer un tableau unidimensionnel (len=N) de l'ensemble complet de cas de test générés par l'application régulière. méthode d'analyse ;

2. Chaque cas de test de l'ensemble complet des cas de test est décomposé en deux combinaisons pour générer un tableau bidimensionnel de la même longueur que l'ensemble complet des cas de test (len= unidimensionnel). N);

3. Utiliser la version Python de l'algorithme Pairwise pour éliminer les cas de test invalides, et enfin obtenir un ensemble de cas de test appariés efficaces

Les 1ère et 2ème fonctions du code ; sont écrits à l'aide de la propre bibliothèque de calcul mathématique de Python, itertools, et du 3ème code. La fonction est le code que j'ai proposé.

2. Téléchargez directement le code


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

# -*- 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)

Copier après la connexion

Interprétation du code :

La troisième ligne de code de boucle for 39~48 sert principalement à déterminer verticalement si l'élément à détecter et l'élément à la même position ont la même valeur

Le deuxième code de boucle for 38 ~ Lignes 48, associez deux paires de cas de test dans un groupe et comparez-les avec des éléments à la même position de gauche à droite

Le premier code de boucle for, lignes 37 ~ 48 , parcourt chaque groupe de cas de test.

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

执行结果:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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]

Copier après la connexion

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

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


1

2

3

4

5

6

7

8

9

10

11

12

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;)]

Copier après la connexion

二维列表 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%的理。如果像基础在差点,逻辑在乱点,就只能用时间堆了。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

PHP et Python: différents paradigmes expliqués PHP et Python: différents paradigmes expliqués Apr 18, 2025 am 12:26 AM

PHP est principalement la programmation procédurale, mais prend également en charge la programmation orientée objet (POO); Python prend en charge une variété de paradigmes, y compris la POO, la programmation fonctionnelle et procédurale. PHP convient au développement Web, et Python convient à une variété d'applications telles que l'analyse des données et l'apprentissage automatique.

Choisir entre PHP et Python: un guide Choisir entre PHP et Python: un guide Apr 18, 2025 am 12:24 AM

PHP convient au développement Web et au prototypage rapide, et Python convient à la science des données et à l'apprentissage automatique. 1.Php est utilisé pour le développement Web dynamique, avec une syntaxe simple et adapté pour un développement rapide. 2. Python a une syntaxe concise, convient à plusieurs champs et a un écosystème de bibliothèque solide.

Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisation Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisation Apr 16, 2025 am 12:12 AM

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

PHP et Python: une plongée profonde dans leur histoire PHP et Python: une plongée profonde dans leur histoire Apr 18, 2025 am 12:25 AM

PHP est originaire en 1994 et a été développé par Rasmuslerdorf. Il a été utilisé à l'origine pour suivre les visiteurs du site Web et a progressivement évolué en un langage de script côté serveur et a été largement utilisé dans le développement Web. Python a été développé par Guidovan Rossum à la fin des années 1980 et a été publié pour la première fois en 1991. Il met l'accent sur la lisibilité et la simplicité du code, et convient à l'informatique scientifique, à l'analyse des données et à d'autres domaines.

Peut-on exécuter le code sous Windows 8 Peut-on exécuter le code sous Windows 8 Apr 15, 2025 pm 07:24 PM

VS Code peut fonctionner sur Windows 8, mais l'expérience peut ne pas être excellente. Assurez-vous d'abord que le système a été mis à jour sur le dernier correctif, puis téléchargez le package d'installation VS Code qui correspond à l'architecture du système et l'installez comme invité. Après l'installation, sachez que certaines extensions peuvent être incompatibles avec Windows 8 et doivent rechercher des extensions alternatives ou utiliser de nouveaux systèmes Windows dans une machine virtuelle. Installez les extensions nécessaires pour vérifier si elles fonctionnent correctement. Bien que le code VS soit possible sur Windows 8, il est recommandé de passer à un système Windows plus récent pour une meilleure expérience de développement et une meilleure sécurité.

Le code Visual Studio peut-il être utilisé dans Python Le code Visual Studio peut-il être utilisé dans Python Apr 15, 2025 pm 08:18 PM

VS Code peut être utilisé pour écrire Python et fournit de nombreuses fonctionnalités qui en font un outil idéal pour développer des applications Python. Il permet aux utilisateurs de: installer des extensions Python pour obtenir des fonctions telles que la réalisation du code, la mise en évidence de la syntaxe et le débogage. Utilisez le débogueur pour suivre le code étape par étape, trouver et corriger les erreurs. Intégrez Git pour le contrôle de version. Utilisez des outils de mise en forme de code pour maintenir la cohérence du code. Utilisez l'outil de liaison pour repérer les problèmes potentiels à l'avance.

Comment exécuter Python avec le bloc-notes Comment exécuter Python avec le bloc-notes Apr 16, 2025 pm 07:33 PM

L'exécution du code Python dans le bloc-notes nécessite l'installation du plug-in exécutable Python et du plug-in NPEXEC. Après avoir installé Python et ajouté un chemin à lui, configurez la commande "python" et le paramètre "{current_directory} {file_name}" dans le plug-in nppexec pour exécuter le code python via la touche de raccourci "F6" dans le bloc-notes.

L'extension VScode est-elle malveillante? L'extension VScode est-elle malveillante? Apr 15, 2025 pm 07:57 PM

Les extensions de code vs posent des risques malveillants, tels que la cachette de code malveillant, l'exploitation des vulnérabilités et la masturbation comme des extensions légitimes. Les méthodes pour identifier les extensions malveillantes comprennent: la vérification des éditeurs, la lecture des commentaires, la vérification du code et l'installation avec prudence. Les mesures de sécurité comprennent également: la sensibilisation à la sécurité, les bonnes habitudes, les mises à jour régulières et les logiciels antivirus.

See all articles