En este post de programación te enseñaré a automatizar pruebas cuando solicitamos datos por teclado, sin importar el lenguaje de programación.
Cuando escribimos programas en donde se solicitan datos al usuario a través del teclado y probamos esos programas, debemos escribir los valores manualmente.
Si modificamos el programa o hay un error, lo volvemos a ejecutar y a llenar esos valores. Esto se hace tedioso cada vez, pues invertimos más tiempo probando que arreglando los errores o agregando mejoras.
Obviamente me estoy refiriendo a los programas por consola y en cuanto a “automatizar” me refiero a usar un archivo de texto con valores para pasarlos al programa en lugar de escribirlos manualmente.
Veamos entonces cómo automatizar la entrada de datos en programas. Te enseñaré un ejemplo con C y otro con Python, aunque este paradigma funcionará para cualquier otro lenguaje.
Cuando leemos datos del teclado ya sea con scanf
, input
, etcétera en realidad el programa espera un salto de línea, mismo que ingresamos con la tecla Enter. Cuando ingresamos ese valor, el programa sabe que hemos terminado de ingresar los datos.
Siguiendo esta lógica, podemos crear un archivo separado por saltos de línea, escribir los valores en el orden que se solicitan y después pasarlo como stdin
al programa.
Antes de pasar a la automatización te quiero mostrar a lo que me refiero. Esto es lo tedioso, rellenar los valores una y otra vez:
Ahora imagina hacer esto por cada prueba o cada nueva característica que agregas.
Podemos usar los operadores de redireccionamiento para mandar el flujo del archivo hacia el programa. Primero veamos el archivo de texto que vamos a enviar:
Luis Cabrera Benito
23
1.6252
Los valores son los mismos que el programa anterior. Solo que ahora están en un archivo separado por saltos de línea. Y la magia viene a continuación. La sintaxis es:
programa < archivo
Así que para este caso que es un ejecutable, lo hago así:
main.exe < entrada.txt
Y realmente funciona:
No hay una separación de líneas al solicitar los datos, pero eso no es problema. Si te fijas en el mensaje del final, los datos han sido introducidos correctamente.
Esto también funciona con Python. Tenemos el siguiente código:
# https://parzibyte.me/blog
nombre = input("Ingresa nombre: ")
edad = int(input("Ingresa edad: "))
altura = float(input("Ingresa altura: "))
print(f"Hola {nombre}. Tu edad es {edad} y tu altura es {altura}")
Y también podemos redireccionar el archivo:
Como lo dije, debería funcionar para cualquier lenguaje de programación. Así es como podemos automatizar la entrada de datos por teclado gracias a los flujos.
Así como el operador <
permite la entrada, podemos usar >
para redireccionar la salida. Esto abre muchas posibilidades, pues podemos comparar la salida del programa con una salida esperada que nosotros hayamos definido para realizar tests automáticos, pero eso es otro tema.
Veamos el ejemplo para redireccionar el archivo al programa, y luego redireccionar la salida de este a otro archivo:
Yo sé que los flujos y redirecciones han existido desde siempre, pero hasta ahora se me vino a la mente la idea de que de este modo podemos probar aplicaciones que se ejecutan en la consola.
La salida en este caso es:
Ingresa nombre: Ingresa edad: Ingresa altura: Hola Luis Cabrera Benito. Tu edad es 23 y tu altura es 1.6252
La misma también se puede ver en la consola dentro de la imagen anterior. Y así es como podemos automatizar un poco este tedioso proceso.
Te dejo el código completo junto con los datos de entrada en mi Github.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.