¿Qué Es Boundary Value Analysis?
Boundary Value Analysis (BVA) es una técnica de test design de caja negra que se enfoca en probar valores en los bordes de las clases de equivalencia. Mientras Equivalence Partitioning te dice qué grupos probar, BVA te dice dónde dentro de esos grupos es más probable que se escondan los defectos.
Por Qué Importan los Límites
Los estudios muestran consistentemente que un número desproporcionado de defectos de software ocurren en los valores límite. La razón es simple: los desarrolladores escriben condiciones como if (age >= 18) o if (quantity <= 100), y los errores off-by-one (> vs >=, < vs <=) están entre los errores de código más comunes.
# Intención: aceptar edades de 18 en adelante
if age > 18: # ¡Bug! Rechaza a los de 18 años
allow_access()
# Correcto:
if age >= 18:
allow_access()
Esta diferencia de un solo carácter (> vs >=) causa un defecto que solo se manifiesta en el valor límite 18. Probar con age=25 nunca lo detectaría.
BVA de Dos Valores (Estándar)
El enfoque más común prueba dos valores por límite: el límite mismo y el valor justo afuera.
Para un rango válido de 1 a 100:
| Límite | Valores de Test | Esperado |
|---|---|---|
| Inferior | 0 (justo debajo) | Inválido |
| Inferior | 1 (límite) | Válido |
| Superior | 100 (límite) | Válido |
| Superior | 101 (justo arriba) | Inválido |
4 test cases cubren ambos límites.
BVA de Tres Valores (Riguroso)
Para sistemas de mayor riesgo, prueba tres valores por límite: justo debajo, el límite y justo arriba.
Para el mismo rango 1 a 100:
| Límite | Valores de Test | Esperado |
|---|---|---|
| Inferior | 0 | Inválido |
| Inferior | 1 | Válido |
| Inferior | 2 | Válido |
| Superior | 99 | Válido |
| Superior | 100 | Válido |
| Superior | 101 | Inválido |
6 test cases para una cobertura más completa.
BVA para Diferentes Tipos de Datos
Enteros: Directo — límite ± 1.
- Rango 1-10: probar 0, 1, 10, 11
Punto flotante: Usa el incremento mínimo significativo.
- Rango 0.0-1.0: probar -0.01, 0.0, 1.0, 1.01
Strings (longitud): Prueba en los límites de longitud.
- Username 3-20 caracteres: probar 2 chars, 3 chars, 20 chars, 21 chars
Fechas: Prueba en los límites de fecha.
- Fechas válidas Ene 1 - Dic 31: probar Dic 31 del año anterior, Ene 1, Dic 31, Ene 1 del año siguiente
Colecciones (tamaño): Prueba en los límites de cantidad.
- Items del carrito 1-50: probar 0 items, 1 item, 50 items, 51 items
Combinando EP y BVA
Estas dos técnicas son compañeras naturales. EP identifica las particiones; BVA se enfoca en sus bordes.
Ejemplo: Costo de envío por peso
| Peso (kg) | Envío |
|---|---|
| 0.1 – 1.0 | $5 |
| 1.01 – 5.0 | $10 |
| 5.01 – 20.0 | $20 |
| > 20.0 | $35 |
Representantes EP (centro de cada clase): 0.5, 3.0, 12.0, 25.0
Valores BVA (en los límites): 0.09, 0.1, 1.0, 1.01, 5.0, 5.01, 20.0, 20.01
Combinados, obtienes cobertura completa con solo 12 test cases.
Técnicas Avanzadas de BVA
Límites Multi-Dimensionales
Cuando un sistema tiene múltiples parámetros que interactúan, los límites existen en múltiples dimensiones. Considera un motor de precios:
- Cantidad: 1-1000
- Precio unitario: $0.01-$9999.99
Los límites interesantes no son solo los bordes de parámetros individuales sino las combinaciones:
| Test | Cantidad | Precio Unit. | Total | Por qué |
|---|---|---|---|---|
| 1 | 1 | $0.01 | $0.01 | Mínimo total posible |
| 2 | 1000 | $9999.99 | $9,999,990 | Máximo total posible |
| 3 | 1 | $9999.99 | $9999.99 | Precio máx, cantidad mín |
| 4 | 1000 | $0.01 | $10.00 | Precio mín, cantidad máx |
Límites Internos
No todos los límites están en los bordes de rangos válidos/inválidos. Los límites internos separan diferentes caminos de procesamiento dentro del rango válido:
def calcular_impuesto(ingreso):
if ingreso <= 10000:
return ingreso * 0.10
elif ingreso <= 50000:
return 1000 + (ingreso - 10000) * 0.20
else:
return 9000 + (ingreso - 50000) * 0.30
Los límites internos en $10,000 y $50,000 son igual de importantes que los límites del rango válido general. Probar: $9,999, $10,000, $10,001, $49,999, $50,000, $50,001.
Límites Implícitos
Algunos límites no están en la especificación pero existen en la implementación:
- Integer overflow: 2,147,483,647 (máx int con signo de 32 bits)
- Límites de arrays: Colecciones con índice base-0 vs base-1
- Vacío/null: El límite entre “algo” y “nada”
- Límites de precisión: Problemas de comparación de punto flotante con diferencias muy pequeñas
BVA para Sistemas Basados en Tiempo
Los límites temporales son particularmente complicados:
| Escenario | Valores Límite |
|---|---|
| Timeout de sesión (30 min) | 29:59, 30:00, 30:01 |
| Batch job diario (medianoche) | 23:59:59, 00:00:00, 00:00:01 |
| Año bisiesto (Feb 28/29) | Feb 28, Feb 29, Mar 1 |
| Transición horario de verano | 01:59, 02:00, 03:00 |
Ejercicio: BVA para Política de Passwords
Escenario: Un sistema aplica esta política de passwords:
- Longitud: 8-64 caracteres
- Debe contener al menos 1 letra mayúscula
- Debe contener al menos 1 dígito
- Debe contener al menos 1 carácter especial (!@#$%^&*)
Tarea: Identifica todos los valores límite para el requerimiento de longitud y diseña test cases usando BVA de tres valores. Luego identifica cómo los requerimientos de tipo de carácter crean límites adicionales.
Pista
Para longitud, los límites son 8 (mínimo) y 64 (máximo). BVA de tres valores significa probar 7, 8, 9 en el límite inferior y 63, 64, 65 en el superior.
Para tipos de caracteres, el límite está entre 0 y 1 ocurrencia de cada tipo requerido. Piensa en un password con exactamente 0 mayúsculas vs exactamente 1.
Solución
BVA de longitud (tres valores):
| # | Longitud | Valor de Test | Esperado |
|---|---|---|---|
| 1 | 7 chars | Aa1!xyz | Rechazar (muy corto) |
| 2 | 8 chars | Aa1!xyzw | Aceptar (límite inferior) |
| 3 | 9 chars | Aa1!xyzwq | Aceptar (justo arriba del inferior) |
| 4 | 63 chars | Aa1! + 59 x’s | Aceptar (justo debajo del superior) |
| 5 | 64 chars | Aa1! + 60 x’s | Aceptar (límite superior) |
| 6 | 65 chars | Aa1! + 61 x’s | Rechazar (muy largo) |
Límites de tipo de carácter:
| # | Test | Esperado |
|---|---|---|
| 7 | 0 mayúsculas: aa1!xyzw | Rechazar |
| 8 | 1 mayúscula: Aa1!xyzw | Aceptar |
| 9 | 0 dígitos: Aa!!xyzw | Rechazar |
| 10 | 1 dígito: Aa1!xyzw | Aceptar |
| 11 | 0 especiales: Aa1bxyzw | Rechazar |
| 12 | 1 especial: Aa1!xyzw | Aceptar |
Total: 12 test cases cubriendo todos los límites de longitud y requerimientos de tipo de carácter.
Tips de Profesional
- Siempre combina BVA con EP. BVA sin EP pierde el panorama general; EP sin BVA pierde las áreas más densas en defectos.
- No olvides el cero y el vacío. Cero items, strings de longitud cero y colecciones vacías son límites que revelan null pointer exceptions, división por cero y otros defectos comunes.
- Considera el incremento mínimo. Para enteros es 1, para moneda puede ser 0.01, para timestamps puede ser 1 segundo o 1 milisegundo.
- Prueba ambos lados de cada límite. Un límite tiene dos lados — válido e inválido. Omitir cualquiera deja defectos sin cubrir.
- En APIs, prueba valores límite en parámetros de request, headers y manejo de responses. Los límites en paginación de API (page=0, page=1, page=maxInt) frecuentemente contienen bugs.