¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Dobles de prueba: reloj y azar

Después de esta lección: Puedo probar código que depende de la hora o del azar con un doble fijo.

Lección de 55 min3 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

Una prueba que falla según la hora

Un doble de prueba es una pieza falsa que sustituye a una real durante una prueba. Sirve para probar código que depende de algo lento, aleatorio o que cambia, como la hora o un dado.

Una tienda muestra «Abierto» o «Cerrado» según la hora. La prueba pasa a las 10 de la mañana y falla a las 15. Nadie ha tocado el código.

Al final de esta lección

Nota

Puedo probar código que depende de la hora o del azar con un doble fijo.

Palabras clave

PalabraQué significaEjemplo
Dependenciaalgo externo que el código necesita para funcionarel reloj
Doble de pruebauna pieza falsa que ocupa el lugar de una real
Deterministaque da siempre el mismo resultado con los mismos datos
Inyectarpasar la dependencia a la función como parámetro
Prueba frágiluna prueba que falla sin que el código haya cambiado

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una prueba debe dar siempre el mismo resultado

Una prueba buena es determinista: con los mismos datos, el mismo resultado, hoy y mañana.

Si la función pregunta la hora al sistema, la prueba depende de cuándo se ejecute. Esa hora es una dependencia. Una prueba que falla sin que cambie el código es una prueba frágil.

Ejemplo: qué hace frágil una prueba

La función usaPor qué es frágilQué se pone en su lugar
La hora del sistemaCambia cada minutoUn reloj que dice siempre las 10
Un número al azarCambia en cada ejecuciónUn azar que devuelve siempre 7
Una web del bancoEs lenta y puede caerseUna respuesta preparada de antemano

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Pasa la dependencia como parámetro

La solución es inyectar la dependencia. En lugar de que la función llame al reloj del sistema, recibe un reloj como parámetro.

En producción le pasas el reloj real. En la prueba le pasas un reloj falso que dice siempre la misma hora. Aquí el reloj es una función sin parámetros que devuelve la hora.

Un reloj falso en dos líneas

Código: python
# Una tienda de barrio: abre de 9 a 14 y de 17 a 20.
def mensaje(reloj):
    hora = reloj()
    if 9 <= hora < 14 or 17 <= hora < 20:
        return "Abierto"
    return "Cerrado"

# Dos relojes falsos: siempre dicen la misma hora.
def reloj_de_las_10():
    return 10

def reloj_de_las_15():
    return 15

print(mensaje(reloj_de_las_10))
print(mensaje(reloj_de_las_15))
# Escribe un reloj falso de las 17 y prueba el borde.

Entra en la carpeta de trabajo

Comando
mkdir -p ~/pruebas && cd ~/pruebas

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe la función que recibe el reloj

Comando
printf 'def mensaje(reloj):\n    hora = reloj()\n    if 9 <= hora < 14 or 17 <= hora < 20:\n        return "Abierto"\n    return "Cerrado"\n' > apertura.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pruébala con dos horas falsas

Comando
python3 -c "from apertura import mensaje; print(mensaje(lambda: 10), mensaje(lambda: 15))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que un doble hace la prueba menos real. No cambia lo que pruebas: pruebas tu regla de horarios, no el reloj del sistema. El reloj real se prueba aparte, una vez, con una prueba de integración.

El azar se sustituye igual que la hora

Una tienda sortea un premio: sale si el número al azar, de 1 a 100, es 10 o menos. Para probarlo, la función recibe una función azar.

En la prueba, azar devuelve siempre 10 o siempre 11. Así pruebas el borde del sorteo sin esperar a que el azar colabore.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.