¿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:

graph LR A["0 ❌"] --- B["1 ✅"] --- C["... válido ..."] --- D["100 ✅"] --- E["101 ❌"] style A fill:#ffcccc style B fill:#ccffcc style D fill:#ccffcc style E fill:#ffcccc
LímiteValores de TestEsperado
Inferior0 (justo debajo)Inválido
Inferior1 (límite)Válido
Superior100 (límite)Válido
Superior101 (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ímiteValores de TestEsperado
Inferior0Inválido
Inferior1Válido
Inferior2Válido
Superior99Válido
Superior100Válido
Superior101Invá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.

graph LR subgraph "Zona $5" A[0.09❌] --- B[0.1✅] --- C[0.5] --- D[1.0✅] end subgraph "Zona $10" D --- E[1.01✅] --- F[3.0] --- G[5.0✅] end subgraph "Zona $20" G --- H[5.01✅] --- I[12.0] --- J[20.0✅] end subgraph "Zona $35" J --- K[20.01✅] --- L[25.0] end

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:

TestCantidadPrecio Unit.TotalPor qué
11$0.01$0.01Mínimo total posible
21000$9999.99$9,999,990Máximo total posible
31$9999.99$9999.99Precio máx, cantidad mín
41000$0.01$10.00Precio 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:

EscenarioValores 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 verano01: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):

#LongitudValor de TestEsperado
17 charsAa1!xyzRechazar (muy corto)
28 charsAa1!xyzwAceptar (límite inferior)
39 charsAa1!xyzwqAceptar (justo arriba del inferior)
463 charsAa1! + 59 x’sAceptar (justo debajo del superior)
564 charsAa1! + 60 x’sAceptar (límite superior)
665 charsAa1! + 61 x’sRechazar (muy largo)

Límites de tipo de carácter:

#TestEsperado
70 mayúsculas: aa1!xyzwRechazar
81 mayúscula: Aa1!xyzwAceptar
90 dígitos: Aa!!xyzwRechazar
101 dígito: Aa1!xyzwAceptar
110 especiales: Aa1bxyzwRechazar
121 especial: Aa1!xyzwAceptar

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.