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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Dependencia | algo externo que el código necesita para funcionar | el reloj |
| Doble de prueba | una pieza falsa que ocupa el lugar de una real | |
| Determinista | que da siempre el mismo resultado con los mismos datos | |
| Inyectar | pasar la dependencia a la función como parámetro | |
| Prueba frágil | una 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 usa | Por qué es frágil | Qué se pone en su lugar |
|---|---|---|
| La hora del sistema | Cambia cada minuto | Un reloj que dice siempre las 10 |
| Un número al azar | Cambia en cada ejecución | Un azar que devuelve siempre 7 |
| Una web del banco | Es lenta y puede caerse | Una 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
# 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
mkdir -p ~/pruebas && cd ~/pruebasSe 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
printf 'def mensaje(reloj):\n hora = reloj()\n if 9 <= hora < 14 or 17 <= hora < 20:\n return "Abierto"\n return "Cerrado"\n' > apertura.pySe 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
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.