Probar cada valor de entrada posible es imposible. Un campo de contraseña simple que acepta 8-32 caracteres tiene miles de millones de entradas potenciales. ¿Cómo probar de manera integral sin pasar años escribiendo casos de prueba?
Entra Partición de Equivalencia (EP) — una técnica fundamental de diseño de casos de prueba y enfoque de pruebas de caja negra que divide datos de entrada en grupos lógicos (particiones) donde todos los valores en una partición deberían comportarse de la misma manera. Al probar un valor representativo de cada partición, logras amplia cobertura con casos de prueba mínimos.
El Concepto Central
Principio de Partición de Equivalencia: Si un valor de una partición funciona correctamente, todos los valores en esa partición deberían funcionar correctamente. Por el contrario, si un valor falla, todos los valores en esa partición deberían fallar.
En lugar de probar:
Entradas de edad: 5, 10, 15, 18, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80...
Pruebas:
Particiones de edad:
- Inválida (muy joven): Valor de prueba = 10
- Válida (adulto): Valor de prueba = 40
- Inválida (muy viejo): Valor de prueba = 75
Tres casos de prueba en lugar de docenas, con la misma o mejor detección de defectos.
Cómo Aplicar Partición de Equivalencia
Paso 1: Identificar Condiciones de Entrada
Lista todas las entradas y sus requisitos:
Ejemplo: Sistema de Reserva de Boletos
Entrada: Número de boletos
Requisito: Debe estar entre 1 y 10 (inclusive)
Paso 2: Identificar Particiones de Equivalencia
Divide el espacio de entrada en particiones válidas e inválidas:
Tipo de Partición | Rango | Descripción |
---|---|---|
Inválida | < 1 | Muy pocos boletos |
Válida | 1-10 | Rango aceptable |
Inválida | > 10 | Demasiados boletos |
Paso 3: Seleccionar Valores de Prueba
Elige un valor representativo de cada partición:
Partición | Valor de Prueba | Resultado Esperado |
---|---|---|
Inválida (< 1) | 0 | Error: “Se requiere mínimo 1 boleto” |
Válida (1-10) | 5 | Reserva exitosa |
Inválida (> 10) | 15 | Error: “Máximo 10 boletos permitidos” |
Resultado: 3 casos de prueba cubren todos los escenarios
Particiones Válidas vs Inválidas
Cada entrada típicamente tiene:
Particiones Válidas
- Entradas que el sistema debería aceptar
- Se espera que produzcan resultados exitosos
- A menudo hay una partición válida, pero entradas complejas pueden tener múltiples
Particiones Inválidas
- Entradas que el sistema debería rechazar
- Se espera que produzcan errores
- Usualmente múltiples particiones inválidas (debajo del rango, encima del rango, tipo incorrecto, nulo, etc.)
Ejemplo: Campo de Email
Particiones Válidas:
- ✅ Email estándar: "user@example.com"
- ✅ Email con números: "user123@test.com"
- ✅ Email con subdominio: "user@mail.example.com"
Particiones Inválidas:
- ❌ Falta @: "userexample.com"
- ❌ Falta dominio: "user@"
- ❌ Falta parte local: "@example.com"
- ❌ Múltiples @: "user@@example.com"
- ❌ Cadena vacía: ""
- ❌ Caracteres especiales: "user name@example.com"
- ❌ Muy largo: [email > 254 caracteres]
Estrategia de Prueba: Selecciona 1-2 valores de particiones válidas, 1 valor de cada partición inválida.
Ejemplo de Caso de Prueba EP
**Característica**: Registro de Usuario - Campo de Edad
**Requisito**: La edad debe ser 18-65 años
**Particiones de Equivalencia:**
| ID Partición | Tipo de Partición | Rango | Valor de Prueba | Resultado Esperado |
|-------------|------------------|-------|----------------|-------------------|
| EP1 | Inválida | Edad < 18 | 15 | Error: "Debes tener 18 o más" |
| EP2 | Válida | 18 ≤ Edad ≤ 65 | 30 | Registro exitoso |
| EP3 | Inválida | Edad > 65 | 70 | Error: "Límite de edad excedido" |
| EP4 | Inválida | No numérico | "abc" | Error: "La edad debe ser un número" |
| EP5 | Inválida | Negativo | -5 | Error: "La edad debe ser positiva" |
| EP6 | Inválida | Decimal | 25.5 | Error: "La edad debe ser número entero" |
| EP7 | Inválida | Vacío | "" | Error: "Se requiere edad" |
**Total de Casos de Prueba**: 7 (en lugar de probar todas las edades 0-999)
Combinando EP con Análisis de Valores Límite (BVA)
Partición de Equivalencia y Análisis de Valores Límite funcionan perfectamente juntos:
Solo EP:
Partición válida (18-65): Valor de prueba = 30
EP + BVA:
Partición válida (18-65):
- Valor de prueba = 18 (límite inferior)
- Valor de prueba = 30 (rango medio)
- Valor de prueba = 65 (límite superior)
Ejemplo: Niveles de Descuento
Requisito: Descuentos de compra basados en monto
- $0-$99: Sin descuento
- $100-$499: 10% descuento
- $500-$999: 15% descuento
- $1000+: 20% descuento
Particiones EP:
Partición | Rango | Valor de Prueba EP | Valores de Prueba EP+BVA |
---|---|---|---|
Nivel 1 | $0-$99 | $50 | $0, $50, $99 |
Nivel 2 | $100-$499 | $300 | $100, $300, $499 |
Nivel 3 | $500-$999 | $750 | $500, $750, $999 |
Nivel 4 | $1000+ | $1500 | $1000, $1500, $5000 |
Solo EP: 4 casos de prueba EP + BVA: 12 casos de prueba (más exhaustivo)
Ejemplos del Mundo Real
Ejemplo 1: Validación de Contraseña
Requisitos:
- Longitud: 8-20 caracteres
- Debe contener: mayúscula, minúscula, número, caracter especial
- No puede contener: nombre de usuario, palabras comunes
Particiones de Equivalencia:
Partición Válida:
EP-V1: Contraseña válida cumpliendo todos los criterios
Prueba: "MyP@ssw0rd"
Particiones Inválidas:
EP-I1: Muy corta (< 8 caracteres)
Prueba: "Pass1!"
EP-I2: Muy larga (> 20 caracteres)
Prueba: "MyVeryLongP@ssw0rd123456"
EP-I3: Falta mayúscula
Prueba: "myp@ssw0rd1"
EP-I4: Falta minúscula
Prueba: "MYP@SSW0RD1"
EP-I5: Falta número
Prueba: "MyP@ssword"
EP-I6: Falta caracter especial
Prueba: "MyPassword1"
EP-I7: Contiene nombre de usuario
Prueba: "JohnP@ssw0rd" (si nombre de usuario es "john")
EP-I8: Palabra común
Prueba: "Password123!"
EP-I9: Vacía
Prueba: ""
Automatización de Pruebas:
import pytest
@pytest.mark.parametrize("password,expected,reason", [
# Partición válida
("MyP@ssw0rd", True, "Contraseña válida"),
# Particiones inválidas
("Pass1!", False, "Muy corta"),
("MyVeryLongP@ssw0rd123456", False, "Muy larga"),
("myp@ssw0rd1", False, "Falta mayúscula"),
("MYP@SSW0RD1", False, "Falta minúscula"),
("MyP@ssword", False, "Falta número"),
("MyPassword1", False, "Falta caracter especial"),
("Password123!", False, "Palabra común"),
("", False, "Vacía"),
])
def test_password_validation(password, expected, reason):
result = validate_password(password)
assert result == expected, f"Falló: {reason}"
Errores Comunes
❌ Error 1: Particiones Superpuestas
Mal:
- Partición 1: Edad 0-50
- Partición 2: Edad 50-100
Problema: ¡La edad 50 está en ambas particiones!
Bien:
- Partición 1: Edad 0-49
- Partición 2: Edad 50-100
❌ Error 2: Particiones Inválidas Faltantes
Mal (solo probando válidas):
- Partición: Edad válida (18-65)
- Prueba: 30
Bien (probando válida + inválidas):
- Partición 1: Muy joven (< 18)
- Partición 2: Válida (18-65)
- Partición 3: Muy viejo (> 65)
Beneficios de EP
- Reduce Casos de Prueba: De miles a docenas
- Cobertura Sistemática: Asegura que todas las clases de entrada sean probadas
- Detección de Defectos: Una prueba por partición detecta fallas de partición completa
- Mantenible: Fácil de actualizar cuando los requisitos cambian
- Eficiente: Maximiza cobertura con esfuerzo mínimo
Conclusión
Partición de Equivalencia es una técnica fundamental de diseño de pruebas que:
- Divide datos de entrada en grupos lógicos
- Prueba un valor representativo por grupo
- Reduce drásticamente casos de prueba manteniendo cobertura
- Funciona mejor cuando se combina con Análisis de Valores Límite
Recuerda: Si pruebas un valor de una partición y funciona, toda la partición debería funcionar. Este principio te permite probar de manera más inteligente, no más dura.