¿Qué Es Pairwise Testing?
Pairwise testing (también llamado all-pairs testing) es una técnica de test design combinatorio basada en una observación clave: la mayoría de los defectos son causados por interacciones entre dos parámetros, no tres o más simultáneamente.
En lugar de probar cada combinación posible (que crece exponencialmente), pairwise testing garantiza que cada par de valores de parámetros aparezca en al menos un test case.
El Problema de la Explosión Combinatoria
Considera probar una aplicación web en:
- OS: Windows, macOS, Linux (3)
- Browser: Chrome, Firefox, Safari, Edge (4)
- Idioma: EN, ES, RU (3)
- Pantalla: Desktop, Tablet, Mobile (3)
Testing exhaustivo: 3 x 4 x 3 x 3 = 108 combinaciones
Pairwise testing: aproximadamente 12-15 test cases — cubriendo cada par.
Cómo Funciona Pairwise
Para 3 parámetros (A, B, C) con 2 valores cada uno (1, 2):
Todos los pares que necesitan cobertura:
- A-B: (1,1), (1,2), (2,1), (2,2)
- A-C: (1,1), (1,2), (2,1), (2,2)
- B-C: (1,1), (1,2), (2,1), (2,2)
Una suite pairwise con solo 4 test cases:
| Test | A | B | C |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 2 |
| 3 | 2 | 1 | 2 |
| 4 | 2 | 2 | 1 |
Cada par aparece al menos una vez. Exhaustivo necesitaría 2^3 = 8 tests.
Introducción a PICT
PICT (Pairwise Independent Combinatorial Testing) es la herramienta gratuita y open-source de línea de comandos de Microsoft para generar suites de tests pairwise.
Instalación:
# macOS
brew install pict
# Linux (compilar del fuente)
git clone https://github.com/microsoft/pict.git
cd pict && make
# Windows
# Descargar de GitHub releases
Uso básico:
Crear un archivo de modelo web-test.txt:
OS: Windows, macOS, Linux
Browser: Chrome, Firefox, Safari, Edge
Language: EN, ES, RU
Screen: Desktop, Tablet, Mobile
Ejecutar PICT:
pict web-test.txt
Output (ejemplo — las combinaciones pueden variar):
OS Browser Language Screen
Windows Chrome EN Desktop
macOS Firefox ES Tablet
Linux Safari RU Mobile
Windows Edge RU Tablet
...
PICT genera aproximadamente 12-16 test cases en lugar de 108.
Por Qué Pairwise Es Efectivo
Investigación de Kuhn, Wallace y Gallo (NIST) encontró:
- 67% de los defectos se activan por el valor de un solo parámetro
- 93% se activan por pares de valores (interacciones de 2 vías)
- 98% se activan por triples (3 vías)
- Casi 100% por interacciones de 4 vías
Pairwise cubre el nivel del 93% con una fracción del esfuerzo del testing exhaustivo.
Funcionalidades Avanzadas de PICT
Agregando Constraints
No todas las combinaciones son válidas. PICT soporta constraints para excluir casos imposibles:
OS: Windows, macOS, Linux, iOS, Android
Browser: Chrome, Firefox, Safari, Edge
# Constraints
IF [OS] = "iOS" THEN [Browser] <> "Edge";
IF [OS] = "iOS" THEN [Browser] <> "Firefox";
IF [OS] = "Android" THEN [Browser] <> "Safari";
IF [OS] = "Android" THEN [Browser] <> "Edge";
IF [OS] = "Linux" THEN [Browser] <> "Safari";
PICT nunca generará un test case con iOS + Edge o Android + Safari.
Sub-Models para Cobertura de Mayor Orden
A veces ciertos grupos de parámetros necesitan cobertura más fuerte:
OS: Windows, macOS, Linux
Browser: Chrome, Firefox, Safari
Language: EN, ES, RU
Theme: Light, Dark
# Default: pairwise (2 vías)
# Pero OS-Browser-Language necesita cobertura de 3 vías
{ OS, Browser, Language } @ 3
Seeding de Combinaciones Específicas
Fuerza combinaciones importantes específicas:
Crea un archivo seed seeds.txt:
OS Browser Language Theme
Windows Chrome EN Light
macOS Safari ES Dark
Ejecuta con seeding:
pict model.txt /e:seeds.txt
Testing Negativo con PICT
Agrega valores inválidos con prefijo ~:
Age: 18, 30, 65, ~-1, ~200
Email: valid@test.com, ~invalid-email, ~""
PICT asegura que valores negativos aparezcan pero solo un valor negativo por test case (single fault assumption).
Ejemplo Real: Matriz de Testing de API
Method: GET, POST, PUT, DELETE
Auth: Bearer, API-Key, None
ContentType: application/json, multipart/form-data, text/plain
Status: 200, 400, 401, 404, 500
IF [Method] = "GET" THEN [ContentType] <> "multipart/form-data";
IF [Auth] = "None" THEN [Status] IN { 401 };
IF [Method] = "DELETE" THEN [ContentType] = "application/json";
Ejercicio: Genera una Suite Pairwise con PICT
Escenario: Estás probando un formulario de procesamiento de pagos con:
- Tipo de tarjeta: Visa, MasterCard, Amex
- Moneda: USD, EUR, GBP
- Rango de monto: Pequeño (<$10), Medio ($10-$100), Grande (>$100)
- 3D Secure: Habilitado, Deshabilitado
- Recurrente: Sí, No
Constraints:
- Amex no soporta pagos recurrentes
- GBP no está disponible con 3D Secure Deshabilitado
Tareas:
- Escribe el archivo de modelo PICT
- Calcula cuántos tests exhaustivos se necesitarían
- Estima el conteo pairwise
- Agrega constraints y verifica el output
Pista
Exhaustivo: 3 x 3 x 3 x 2 x 2 = 108 tests. PICT generará aproximadamente 12-18 tests con constraints.
Solución
Archivo de modelo PICT (payment-test.txt):
CardType: Visa, MasterCard, Amex
Currency: USD, EUR, GBP
Amount: Small, Medium, Large
3DSecure: Enabled, Disabled
Recurring: Yes, No
IF [CardType] = "Amex" THEN [Recurring] = "No";
IF [Currency] = "GBP" THEN [3DSecure] = "Enabled";
Exhaustivo: 108 tests (menos combinaciones imposibles)
Pairwise con PICT: aproximadamente 12-15 test cases
Resultado: ~12 tests en lugar de 108 — una reducción del 89% cubriendo todos los pares.
Tips de Profesional
- Empieza con pairwise, aumenta el orden si es necesario. 2-way (pairwise) detecta ~93% de defectos. Si tu dominio es de alto riesgo, sube grupos de parámetros críticos a 3-way.
- Usa constraints generosamente. Cada combinación imposible removida es un test desperdiciado evitado.
- Combina con otras técnicas. Usa pairwise para las combinaciones de parámetros, luego aplica BVA para seleccionar valores específicos dentro de cada parámetro.
- Automatiza el pipeline. Integra PICT en tu CI: archivo de modelo → generación PICT → ejecución de tests parametrizados.
- Versiona tus modelos PICT. Trata los archivos de modelo como artefactos de test — revísalos, almacénalos junto a los tests, actualízalos cuando cambien los parámetros.