Skip to content

4. Caja blanca y caja gris

Temas del programa: 3.2.2

Veinte casos de caja negra bien diseñados pueden dejar una rama completa del código sin ejecutar. Lo que no se ejecuta, no se prueba.

En la Unidad I mediste cobertura de instrucciones y de decisiones. Aquí la usas al revés: diseñas casos para alcanzar una cobertura elegida.

En pseudocódigo. En la Unidad IV medirás la cobertura con herramientas.

TécnicaPregunta¿Ejecuta?
Instrucciones, decisiones, condiciones¿Qué elementos del código ejecuté?Sí
Rutas y rutas base¿Qué recorridos de entrada a salida?Sí
Prueba de ciclos¿0, 1, varias y el máximo de vueltas?Sí
Flujo de datos¿Cada valor llegó a donde se usa?Sí
Análisis estático¿Qué defectos se ven sin ejecutar?No

"Camino básico" en algunos textos: el original es basis path, camino base.

ConceptoQué es
NodoInstrucción o bloque básico: instrucciones que siempre se ejecutan juntas
AristaPosible salto de un nodo a otro
Nodo de decisiónNodo con dos salidas: V y F (SI, condición de MIENTRAS)
Nodo de uniónDonde dos ramas se vuelven a juntar
Entrada y salidaDonde empieza y donde termina la ejecución

Patrones del grafo de flujo de control: secuencia, SI-ENTONCES, SI-ENTONCES-SINO y MIENTRAS

La arista F de un SI sin SINO va directo a la unión: es la que más se olvida.

1 SI dias < 1 ENTONCES
2 RETORNAR "RECHAZADO"
3 FIN SI
4 SI dias > 14 ENTONCES
5 RETORNAR "RECHAZADO"
6 FIN SI
7 RETORNAR "ACEPTADO"
[1] dias < 1 ?
/V \F
[2] RECHAZADO [4] dias > 14 ?
/V \F
[5] RECHAZADO [7] ACEPTADO

Rutas: 1(V)→2 · 1(F)→4(V)→5 · 1(F)→4(F)→7

Decisiones en secuencia

Las rutas se multiplican: 2 decisiones → 4 rutas, 10 decisiones → 1 024.

Ciclos

Cada número de vueltas es una ruta distinta: pueden ser ilimitadas.

Se necesita un conjunto pequeño que recorra toda la lógica: la base de rutas independientes.

Grafo de calcularPrecioEnvio: cinco nodos, seis aristas, V(G) = 3 y tres rutas base

Una ruta es independiente si recorre al menos una arista nueva. V-V no aporta aristas nuevas.

  • Número de casos que exige la prueba de rutas base.
  • Máximo de casos para cubrir instrucciones y decisiones.
  • Indicador de complejidad: a mayor V(G), más difícil de probar y mantener.

McCabe sugirió revisar módulos con V(G) mayor que 10 (pendiente de verificación del valor en la fuente).

FórmulaCuentacalcularPrecioEnvio
E − N + 2Aristas y nodos6 − 5 + 2 = 3
P + 1Decisiones2 + 1 = 3
RegionesÁreas cerradas + exterior2 + 1 = 3

Las tres deben coincidir. Con varios RETORNAR, agrega un nodo “Fin” al que lleguen todas las salidas: validarDias → 7 − 6 + 2 = 3.

1 SI dias < 1 O dias > 14 ENTONCES
2 RETORNAR "RECHAZADO"
3 FIN SI
4 RETORNAR "ACEPTADO"

Un solo SI, pero dos condiciones simples: V(G) = 3. Antes de dibujar, descompón la condición compuesta: cada condición simple es un nodo de decisión.

  1. Dibuja el grafo. 2. Calcula V(G) por dos métodos. 3. Construye la base: cada ruta nueva cambia una decisión. 4. Elige datos que fuercen cada ruta. 5. Resultado esperado desde la especificación.
Rutapeso, expresEsperado
B1 (F-F)2, FALSO50
B2 (V-F)6, FALSO80
B3 (F-V)2, VERDADERO100

Especificación: base 50 MXN, más de 5 kg suma 30 y exprés duplica el costo.

1 SI edad >= 18 ENTONCES
2 RETORNAR "ADULTO"
3 SINO SI edad >= 21 ENTONCES
4 RETORNAR "ADULTO MAYOR DE 21"
5 FIN SI
6 RETORNAR "MENOR"

Exige: ejecutar cada instrucción al menos una vez.

Sirve para: encontrar código no alcanzado y código muerto.

Ninguna edad ejecuta la línea 4: toda edad ≥ 21 ya salió por la línea 2. El código muerto revela el defecto: condiciones en orden equivocado.

// Socios: 10 % de descuento
1 descuento ← 10 // debía ser 0
2 SI esSocio ENTONCES
3 descuento ← total * 0.10
4 FIN SI
5 RETORNAR total - descuento

(200, VERDADERO) ejecuta todas las instrucciones: obtiene 180, correcto.

El defecto solo aparece si la decisión es falsa: (200, FALSO) espera 200 y obtiene 190.

Exige: que cada decisión tome V y F. En el grafo, recorrer cada arista de decisión. Prueba la arista F “invisible” del SI sin SINO.

1 SEGÚN tipo HACER
2 "ESTUDIANTE": RETORNAR 5
3 "DOCENTE": RETORNAR 3
4 OTRO: RETORNAR 5
5 FIN SEGÚN

Un SEGÚN con k salidas exige k casos. Forzar OTRO con "Docente" revela que un tipo desconocido paga como ESTUDIANTE.

SI activo O claveCorrecta — defecto: debía ser Y.

CasoactivoclaveEsperado (Y)Obtenido (O)
C1VVACCESOACCESO
C2VFDENEGADOACCESO
C3FVDENEGADOACCESO
C4FFDENEGADODENEGADO

Cobertura de condiciones: cada condición simple toma V y F al menos una vez.

CriterioUn conjunto mínimo¿Detecta?
DecisionesC1, C4No
CondicionesC2, C3Sí
Decisión/condiciónC1, C4No
Condición múltiple (2ⁿ)C1–C4Sí

Condiciones no incluye decisiones: con C2 y C3 la rama ACCESO nunca se ejecuta. C1 y C4 también cumplen condiciones y no detectan: importa qué conjunto eliges.

D1: costo ← costo + 80 · D2: costo ← 50 * 2 (línea 6 de calcularPrecioEnvio)

RutaDatosEsperadoCon D1Con D2
F-F(2, FALSO)505050
V-F(6, FALSO)808080
F-V(2, VERDADERO)100130100
V-V(6, VERDADERO)160160100
CriterioConjuntoD1D2
Instrucciones(6, V)NoSí
Decisiones(6, V), (2, F)NoSí
Rutas base B1–B3(2, F), (6, F), (2, V)SíNo
Todas las rutasLas cuatroSíSí

Ninguna base de tres rutas detecta ambos. Todas las rutas sí, pero con ciclos pueden ser ilimitadas: los demás criterios son aproximaciones.

CriterioExigeCasos (calcularPrecioEnvio)Incluye a
InstruccionesCada instrucción1—
DecisionesCada arista de decisión2Instrucciones
Rutas baseV(G) rutas independientes3Decisiones
Todas las rutasCada ruta completa4Rutas base

"Incluye a": cumplir la fila implica cumplir lo indicado. Ningún criterio garantiza encontrar todos los defectos.

Grafo de contarPrestamosVencidos con un ciclo, V(G) = 3

Probar 0, 1, 2 y un número típico de vueltas. Si el ciclo se detiene una vuelta antes, el último préstamo nunca se revisa: el caso de una vuelta lo revela.

Carrito: máximo 10 artículos. Si llegan más, se agregan 10 y se responde “LÍMITE ALCANZADO”.

Defecto longitud(carrito) <= 10: con 10 artículos todo funciona. Solo el caso de 11 lo revela.

ArtículosEsperado
0, 1, 2OK
5 (típico)OK
9 (máx. − 1)OK, 9
10 (máx.)OK, 10
11 (máx. + 1)LÍMITE, 10
Anidados

Combinar 7 valores por ciclo da 49 casos. Empieza por el ciclo interno con los externos al mínimo. Después avanza hacia afuera con los internos en un valor típico: unos 14 casos.

Concatenados

Si son independientes, cada uno se prueba como ciclo simple. Si el segundo usa un valor del primero, se tratan como anidados.

Los criterios anteriores miran por dónde pasa la ejecución. El flujo de datos mira si cada valor llega a donde se usa (REF-U3-02).

ConceptoEjemplo
Definición (def)costo ← 50
Uso computacional (c-use)RETORNAR costo
Uso en predicado (p-use)SI peso > 5
Par definición-uso (du)Def y uso con una ruta entre ellos sin otra definición en medio

costo ← costo + 30 es a la vez uso y nueva definición.

ParRutaDatos
def 1 → uso 3Decisión 1 en V(6, FALSO)
def 1 → uso 6F-V(2, VERDADERO)
def 1 → uso 8F-F(2, FALSO)
def 3 → uso 6V-V(6, VERDADERO)
def 3 → uso 8V-F(6, FALSO)
def 6 → uso 8Decisión 2 en V(2, VERDADERO)

D2 (costo ← 50 * 2) rompe el par def 3 → uso 6, que ninguna ruta de B1–B3 recorre.

CriterioExigeCasos¿Detecta D2?
Todas las definiciones (all-defs)Cada definición llega a un uso2Sí
Todos los usos (all-uses)Cada definición llega a todos sus usos4Sí

En esta función pequeña, todos los usos coincide con todas las rutas. En código más grande exige bastante menos: solo sigue las rutas por las que viajan los valores.

// Suma de adeudos + recargo de 15
1 recargo ← 10
2 i ← 1
3 MIENTRAS i <= longitud(adeudos)
4 total ← total + adeudos[i]
5 i ← i + 1
6 FIN MIENTRAS
7 recargo ← 15
8 RETORNAR total
AnomalíaDónde
Uso sin definición (ur)total, línea 4
Doble definición (dd)recargo, líneas 1 y 7
Definición sin uso (du)recargo, línea 7

Se detectan leyendo el código, sin ejecutarlo.

Prueba dinámica

Ejecuta, observa una falla y después busca el defecto que la causó.

Análisis estático

Señala el defecto directamente, antes de que haya una falla.

Se agrupa con la caja blanca porque necesita el código, pero se clasifica como prueba estática: no diseña casos (REF-U3-04, REF-U3-19).

HallazgoEjemplo
Código inalcanzableLínea 4 de clasificarEdad
Variable sin valor o sin usototal y recargo en sumarAdeudos
Condición siempre verdaderaSI dias >= 1 O dias <= 14
División entre posible cerosuma / longitud(multas) con lista vacía
Complejidad excesivaMódulo con V(G) muy alto

No compara contra la especificación: D1 (costo + 80) es código válido y ningún analizador lo detecta.

No ve lo que falta

Si nadie programó un requisito, no hay ruta que lo ejecute.

Oráculo

El esperado sale de la especificación. Si sale del código, el defecto se copia.

Cobertura ≠ corrección

Algunos defectos solo aparecen con ciertos datos de la misma ruta.

Necesita el código

Se usa sobre todo en el nivel unitario.

Conocimiento internoCasos que sugiere
Modelo de datos: titulo de 100 caracteresLímites 100 y 101
Interfaz: el tipo de usuario viaja como textoDOCENTE, Docente, docente
Estado: contador librosPrestadosSecuencia de préstamos y revisión del contador

Complemento de 3.2.1–3.2.2. No es un tema propio del programa. Se usa más en integración y sistema.

Los datos de diseño son supuestos académicos.

CasoQué haceEsperadoBusca
CG-02Título de 101 caracteresMensaje claro de máximo excedidoRecorte silencioso
CG-04Devolución de Docente, 4 días12 MXN (RN-04)20 MXN por la interfaz
CG-063.er préstamo de ESTUDIANTE, revisar librosPrestados e intentar el 4.º3, y el 4.º rechazado (RN-02)Contador sin incrementar

Si la especificación calla (CG-02), se registra la pregunta. El comportamiento actual no es el esperado por definición.

AspectoCaja negraCaja grisCaja blanca
Conocimiento internoNingunoParcial: diseño, datos, interfacesCompleto: código
Base del diseñoEspecificaciónEspecificación y diseñoCódigo
EjecuciónInterfaz externaInterfaz externa y estado internoLlamada directa al código
Nivel típicoSistema, aceptaciónIntegración, sistemaUnitario

En los tres, el resultado esperado sale de la especificación. En las Unidades IV y V aplicarás la caja gris a bases de datos y APIs.

El grafo, las rutas y la complejidad ciclomática se practican en el Laboratorio 2 — Caja blanca: grafo, rutas y complejidad ciclomática: primero con calcularMulta del SPB y después con el pseudocódigo de una regla de tu proyecto base.

Continúa con 5. Pruebas exploratorias y basadas en riesgos.