¿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

flowchart TD A[Listar todos los parámetros y valores] --> B[Generar todos los pares posibles] B --> C[Crear test cases que cubran múltiples pares cada uno] C --> D[Optimizar: minimizar total de test cases] D --> E[Resultado: suite de tests compacta]

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:

TestABC
1111
2122
3212
4221

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:

  1. Escribe el archivo de modelo PICT
  2. Calcula cuántos tests exhaustivos se necesitarían
  3. Estima el conteo pairwise
  4. 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.