En cada una de las formaciones que imparto, siempre llegamos al momento crucial donde toca hablar del testing de aplicaciones. La última reunión con los alumnos fue especialmente cómica, donde me dijeron:
"Mi amigo que lleva muchos años programando dice que escribir tests es una pérdida de tiempo"
La respuesta ha esto fue clara por mi parte: ¿Este amigo tuyo ha leído algún libro de ingeniería de software? Aquí se hizo el silencio.
Escribir tests implica que conoces tu proyecto La cuestión es la siguiente:
¿Cómo sabemos si un coche funciona? Fácil, si arranca funciona y si no arranca no funciona ¿Cómo sabemos si funcionan las puertas? Si abren y cierran correctamente funciona, de lo contrario no.
Pero, cuando hablamos de software, es completamente diferente, no podemos coger una aplicación y abrirla y cerrarla y determinar que funciona correctamente con un simple vistazo, es algo que se escapa a nuestros sentidos, puesto que no es un ente físico como tal. La aplicación funciona dentro de un servidor, el cual la ejecuta y como resultado final, vemos algo por pantalla.
Entonces, ¿Cómo sabemos si nuestra aplicación está funcionando de forma correcta? Tenemos que guiarnos por los requisitos de la aplicación. Cuando tenemos la idea de realizar una aplicación, en primer lugar tenemos que saber que queremos hacer, posteriormente definirlos de forma clara y unívoca y posteriormente programar.
Esto es lo que siempre deberíamos de hacer, para no cometer el error de "programar por programar sin tener claro el objetivo" ya que si no tenemos una guía, simplemente escribiremos código sin sentido.
Teniendo en cuenta esto, para comprobar que una aplicación funciona tenemos que coger ese listado de requisitos ( o funcionalidades ) que tiene que cumplir nuestra aplicación y comprobar de alguna forma que nuestro código lo implementa de forma correcta. Aquí tenemos 2 opciones:
❌ Realizar pruebas manuales: Lo cual, a día de hoy sigue existiendo, pero en última instancia no es operativo (un coñazo tener a alguien siempre comprobando que todo funciona) ya que se incurren en muchos errores y despistes.
✅ Automatizar las pruebas: Es la forma más operativa ya que podemos comprobar que todas las funcionalidades implementadas "a posteriori" no hacen conflicto con las implementadas con anterioridad. Es decir, nuestro código es consistente y funcional
¿Cómo puedo planificar las pruebas de mi aplicación?
Ahora que tenemos claro que no podemos estar realizando las pruebas a mano, tenemos que establecer algo sumamente importante, nuestro plan de pruebas.
La cuestión principal es tener en cuenta que Nuestra aplicación va a fallar, pero tenemos que controlar estos posibles fallos para que estén controlados.
Frente a esto me gusta poner siempre el mismo ejemplo: "¿Cómo comprobamos una página de inicio de sesión?"
Lo lógico aquí es comprobar:
- Si tengo un email relleno y no la contraseña me muestra un mensaje
- Si tengo la contraseña y no el correo electrónico me muestra un mensaje
- Si lo relleno todo y coincide entra dentro de la app
- Si lo relleno y no coincide me muestra que no existe el usuario.
Pero: Ahora, llegamos y un usuario pone &%- como correo electrónico y hace que nuestra aplicación falle, porque no tenemos comprobada que la entrada de un correo tiene que cumplir una expresión regular o un type='email'
La cuestión es tener un plan de pruebas para que dentro de cada uno de los elementos de nuestra aplicación comprobemos todas las posibilidades posibles y que haya un resultado favorable para cada una de ellas (aunque el resultado favorable sea mostrar un mensaje de error)
¿Cómo podemos hacer las pruebas?
Si queremos realizar pruebas dentro de nuestra aplicación, dependerá de la tecnología con la que trabajemos y si queremos comprobar tests unitarios o tests de integración (entre otros tipos de tests).
Algunas de las librerías más destacadas son:
- Cypress: Realizar tests de componentes y E2E (integración) a nivel de frontend, independientemente de la tecnología, no importa si es JS vanilla, React o Angular, nos permite realizar las pruebas, incluso si es un Wordpress.
- Jest: Cuando hablamos de aplicaciones escritas en Javascript, es una de las librerías de referencia para poder realizar testing, muchas de otras librerías se basan en Jest como base para poder implementar sus funcionalidades.
- Pytest: Una de las librerías de referencia para testing en entornos Python, es utilizada para realizar pruebas en librerías más populares de Python, como FastApi y Django.
Es importante tener en cuenta que al final todas las librerías de testing son iguales, lo más importante es tener un plan de pruebas adecuado para la aplicación que estamos desarrollando tal y como hemos comentado en la sección principal.
El testing no es un gasto de tiempo, es una inversión en calidad y confianza. La verdadera pérdida de tiempo está en arreglar lo que nunca se probó.