Juan M. Fonseca-Solís · Setiembre 2020 · 5 min read
A diferencia del resto de artículos de este blog, el presente ipython notebook no contiene ningún componente original, sino que pretendemos simplemente rescatar la descripción matemática y utilidad de una técnica de estimación de casos de prueba llamada pruebas por pares. Los resultados obtenidos muestran que se puede lograr una buena cobertura en tiempo $O(op)$.
Como su nombre lo indica, la técnica de por pares construye escenarios de prueba tomando pares de parámetros en lugar de hacer una combinación exhaustiva de variables. Esto lo realiza asumiendo como verdadera la premisa de Kuhn et. al [1,4]:
"Regla de interacción: la mayoría de las fallas son producidas por un solo factor o por la interación entre dos factores, y se observan progresivamente menos fallas producidas por la interacción entre tres o más factores."
Matemáticamente la técnica de la prueba por pares se puede expresar como sigue. Sea $\{P_1, P_2, \ldots, P_N\} \subset \mathbb{C}^{\max\{\lvert{R_i}\rvert\}}$ un espacio vectorial generado por un sistema de N parámetros, el conjunto de valores que puede tomar cada parámetro $R(P_i) = R_i$ es denominado el rango de un parámetro [1]. Es decir, que si hicieramos el modelado de un interruptor de la casa, los posibles valores de prueba serían:
$$ R_i = \{\text{encendido}, \text{apagado}\}, $$donde la cardinalidad del conjunto, $\lvert{R_i}\rvert=n_i$, sería igual a 2. Si modelásemos todos los interruptores de la casa y nos interesara el estado de la casa en ese momento, la combinación de los valores posibles sería un producto, es decir, $\prod{n_i}$. Podría suceder, sin embargo, que no todos los encendedores tuvieran dos estados, sino tres, por ejemplo: encendido alto, encendido bajo, apagado; en cuyo caso $2^N < \prod{n_i}$.
Si en lugar de hacer una combinación exhaustiva usaramos la técnica de prueba por pares tendríamos que definir $X=\{n_i\}$ como el multiconjunto que contiene todos los posibles valores de todos los parámetros, por ejemplo, $X=\{2, 2, 3, \ldots\}$. Se dice que este es un multiconjunto o multiset, porque podemos tener elementos repetidos [2]. Luego tendríamos que el número de casos de prueba $T$ sería [1]:
$$ T = \max\{X\} \max\{X/\max\{X\}\}, $$en otras palabras, el producto de los rangos de los dos parámetros con la mayor cantidad de valores posibles.
Con base en este formalismo matemático es posible resumir la técnica de pruebas de pares como:
Veamos un ejemplo con $P_1 = \{T,F\}$, $P_2 = \{1,2,3\}$, $P_3 = \{a,b,c,d\}$ y $P_4 = \{x,y\}$:
Valor 1 | Valor 2 | Valor 3 | Valor 4 | $\lvert{R_i}\rvert$ | |
---|---|---|---|---|---|
$P_1$ | T | F | - | - | 2 |
$P_2$ | 1 | 2 | 3 | - | 3 |
$P_3$ | a | b | c | d | 4 |
$P_4$ | x | y | - | - | 2 |
Los parámetros con más valores serían $P_3$ y $P_2$, y el producto de las cardinalidades de los conjuntos de sus valores sería $\max\{X\} \max\{X/\max\{X\}\} = 4 \cdot 3 = 12$. Con base en esto, podemos armar una tabla de combinaciones truncada como sigue:
CP/P | $P_1$ | $P_2$ | $P_3$ | $P_4$ |
---|---|---|---|---|
1 | a | 1 | T | x |
2 | b | 2 | F | y |
3 | c | 3 | T | x |
4 | d | 1 | F | y |
5 | a | 2 | T | x |
6 | b | 3 | F | z |
7 | c | 1 | T | x |
8 | d | 2 | F | z |
9 | a | 3 | T | x |
10 | b | 1 | F | z |
11 | c | 2 | T | x |
12 | d | 3 | F | z |
Si hubiesemos hecho la combinación completa de todos los valores, esto nos habría tomado $\prod\{n_i\}=4 \cdot 3 \cdot 2 \cdot 3 = 48$ casos de prueba, lo cual representa un esfuerzo considerable. Por eso se dice la prueba por pares tomar tiempo $O(op)$, con $o,p \in \{n_i\}$, en lugar de $\prod{n_i}$.
Aunque más rápida que una combinatoria completa, las pruebas por pares requieren sentarse con papel y lápiz a escribir la tabla. Podemos obtener el mismo resultado implementando al algoritmo en la computadora, o incluso más rápido todavía, usando una herramienta de Microsoft llamada PICT (disponible gratuitamente en el sitio https://pairwise.yuuniworks.com) [3]. El comando para este programa es pict modelo.txt [opciones]
.
modelo.txt:
P1: T,F
P2: 1,2,3
P3: a,b,c,d
P4: x,y
Salida:
P1 P2 P3 P4
T 2 c y
T 3 a x
F 1 c x
F 2 a y
T 1 b y
F 3 c y
F 3 b x
F 2 d x
T 1 a y
T 3 d y
T 1 d y
F 2 b x
Lo cual corresponde en efecto, a los 12 CP que calculamos a mano.
La técnica de las pruebas por pares permite estimar casos de prueba identificando los dos parámetros del sistema con el rango de valores más amplio. Las combinaciones generadas son mucho menores que las del enfoque exhaustivo, pero esto no representa una desventaja en términos de cobertura, pues según el principio de Kuhn et al. la mayoría de pulgas involucran dos parámetros o menos. Existen herramientas como el PICT de Microsoft que permiten automatizar el proceso de generación de casos de prueba, haciendo que esta técnica sea fácil de usar en el corto tiempo que se dispone en el trabajo.
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-SinObraDerivada 4.0 Internacional. El sitio juanfonsecasolis.github.io es un blog dedicado a la investigación independiente en temas relacionados al procesamiento digital de señales. Para reutilizar este artículo y citar las fuente por favor utilice el siguiente Bibtex:
@online{Fonseca2020,
author = {Juan M. Fonseca-Solís},
title = { Pruebas por pares o pairwise testing},
year = 2020,
url = {https://juanfonsecasolis.github.io/blog/JFonseca.pairwisetesting.html},
urldate = {}
}