Pruebas de Software: Ciclo Rojo, Verde y Refactorización
Resumen
¿Cómo entender el mundo del testing en programación?
El testing en programación es un tema apasionante que va más allá de simplemente verificar si un sistema funciona; se trata de construir y asegurar que todos los elementos de un proyecto operen correctamente. Uno de los conceptos clave a entender es el protocolo HTTP, ya que muchas pruebas giran en torno a cómo los navegadores acceden y gestionan contenidos en la web. Un proceso metódico conocido como "Metodología TDD" - Desarrollo Guiado por Pruebas (Test-Driven Development) - se despliega a través de tres pasos fundamentales: rojo, verde y refactoring. Exploremos cómo cada paso contribuye a un desarrollo efectivo y basado en pruebas.
¿Qué significan los pasos rojo, verde y refactoring?
Paso 1: Rojo
El primer paso, "rojo", implica escribir una prueba que inicialmente falla. El objetivo es construir la estructura de una prueba que aún no tiene implementación de código, lo que resultará en un fracaso al ejecutarse. Este fracaso es intencionado y marca el inicio del desarrollo, ya que aún no se ha escrito el código real que haga que la prueba sea exitosa.
Paso 2: Verde
Una vez que la prueba está en rojo, el siguiente paso es escribir el código necesario para que la prueba pase, es decir, haga que el estado cambie a "verde". En este paso, el desarrollador crea el código funcional que satisface las condiciones especificadas por la prueba. Una vez pasado este estado, la prueba dará un resultado exitoso confirmando que el código se comporta como se espera.
Paso 3: Refactoring
Finalmente, llegamos al paso de "refactoring". Aquí, el objetivo es mejorar el código sin cambiar su comportamiento externo. Esto puede incluir optimizar la estructura, añadir comentarios para mejorar su comprensión o simplificar alguna lógica que ha sido escrita en los pasos anteriores. Lo crucial es mantener el estado en verde, asegurándose que las mejoras no afecten la funcionalidad ya verificada.
¿Cómo implementar pruebas en un proyecto de código?
Al introducirse en un proyecto, un desarrollador debe estructurarse mediante pruebas unitarias, eliminando test innecesarios y creando pruebas específicas que garanticen el funcionamiento esperado del sistema.
# Creación de una prueba unitaria con nombre personalizadoproyecto % mkdir pruebas
proyecto % cd pruebas
proyecto/pruebas % touch test_home.py
En el ejemplo anterior, se intenta inicializar una prueba para verificar que la raíz del sistema devuelve un estatus HTTP adecuado, como un 200 OK. Este es un método común en pruebas de integración.
Manejo de errores durante el testing
Durante las pruebas, es común encontrarse con errores como un fallo de ruta o una respuesta de servidor incorrecta, por ejemplo, un 404 Not Found al intentar acceder a un recurso que no existe. Esto es indicativo de que el código debe ser corregido y mejorado, lo cual se aborda en el refactoring.
# Código de una prueba que inicialmente falla con un status 404def test_ruta_principal():
response = cliente.get('/') assert response.status_code ==200
¿Cómo avanzar de una prueba funcional a un código robusto?
Después de convertir una prueba roja en una prueba verde, el paso de refactoring permite hacer el código más elegante y entendible para tus colegas de trabajo. Es vital en este proceso modularizar el código, renombrar métodos para que sean autoexplicativos y asegurar que esos cambios mantengan el código funcionando adecuadamente.
Consejos para un testing efectivo
Siempre escribe pruebas antes de implementar funciones: esto te ayudará a definir claramente las expectativas y a asegurar que las implementaciones cumplen con estas.
Utiliza nombres claros y descriptivos para tus test y métodos: facilita el entendimiento del código.
No temas refactorizar: es una parte crucial que asegura un código limpio y mantenible.
Mantén tus pruebas independientes y modulares: esto facilita el diagnóstico y la corrección de errores.
Al seguir esta metodología de trabajo, no solo se asegura un código de alta calidad y libre de errores, sino que también se fomenta un ciclo de desarrollo ágil y efectivo. Continuar aprendiendo e implementando estas prácticas te permitirá convertirte en un profesional más competente y eficaz en el mundo del desarrollo de software.
Paso 1: Crear prueba, para obtener rojo
Paso 2: Crear código para cumplir con esa prueba, para obtener verde
Paso 3: Refactorización es una revisión posterior de revisar, organizar, crear métodos, para seguir consiguiendo verde sin alterar la prueba.
El ciclo del TDD:
ok
Metodología TDD y testing HTTP
La metodología TDD tiene trece pasos a cumplir:
Rojo → Creamos una prueba que va a fallar por defecto.
Verde → Construimos el código para que la prueba acierte.
Refactorización → Vamos a mejorar nuestro código para que sea más elegante y simple pero sigue sirviendo igual.
Testing HTTP Métodología TDD
Testing HTPP -> Probar los accessos HTTP
Metodología TDD
Significa Desarrollo guiado por pruebas, o Tests-Driven Development es una práctica de ingeniería de software que involucra otras dos prácticas: Escribir las pruebas primero (Test First Development) y Refactorización (Refactoring).
Paso para la creación de Testing
Rojo -> En este paso se crea la prueba la cual no tiene código creado y tiende a generar un fallo.
Verde -> En verde se construye en código más sencillo para que la prueba funcione. En este paso es muy recomendado usar el principio KISS.
Refactorización: Se trata de construir nuestro código de manera elegante y entendible para que nuestros compañeros lo entiendan, además de que le mismo mantenga el mismo no latera la prueba y mantenga el estado verde.
Comando para crear una prueba:
php artisan make:test PageTest
Comando para correr test:
php artisan test
También podemos utilizar
php artisan test
para correr los tests. En mi opinión se ve mejor y es mas intuitivo.
Según la documentación de Laravle 8.x se puede usar el comando que mencionas.
<php artisan test>
Te muestra la información de manera más detallada, la recomiendo.
Que diferencia hay entre unit test y feature test?
creo mi prueba pero sin codigo en MVC, por lo que me manda un error, esto es rojo
Segundo paso verde
tengo codigo en la prueba
mi codigo de trabajo funciona
mi test o prueba consulta bien a mi codigo de trabajo
tercer paso refactorizacion
mejora la escritura del codigo
se agregan comentarios
se facilita el entender este codigo
Primeros pasos con TDD:
Escribir las pruebas (ROJO)
Escribir el código que pase las pruebas (VERDE)
Refactorizar el código para mejorarlo (Refactor)
Vale, crear código del test, crear el código de la apicación y refactorizar, aún así, me parece un poco extraño, es decir, ¿Pr qué no puedo crear mi código ya "refactorizado" y luego crear el test? 🤔
Muy interesante este tema de las pruebas, es un poco difícil, porque va contra nuestra lógica. Toca volver a configurarnos. Todo sea por ser un mejor programador.
Test unit y simple pero poderosa
TDD se podria aplicar en JS en backend? como primero aprendo jenkins para hacer mis apis?
TDD es aplicable a casi cualquier lenguaje. En javascript tienes Jest para la realización de tus pruebas y perfectamente puedes usarlo para hacer tus desarrollos siguiendo la metodología de TDD.
1- ¿El testing HTTP es ese que hacemos dándole clic a la aplicación para ver su comportamiento, errores e inconsistencias? De ser SI, ¿Es eso que se conoce como pruebas manuales?
2 - ¿La metodología TDD es lo mismo que las pruebas automatizadas?
Agradezco sus respuestas y orientación en la temática.
Hola. Una pregunta. He presentado el examen y tengo una duda. Hay una pregunta que dice ¿Cuál es el método HTTP que permite actualizar y eliminar?
Según yo, solo existe 1 método HTTP que permite eliminar, y es el método DELETE, pero este no se encuentra entre las opciones. Y para actualizar existen los métodos POST y PATCH, pero estos no permiten eliminar. Entonces ¿Cuál es el método?
¡Hola!, esa es una pregunta con trampa, léela bien, analízala, reflexiónala, tuve la misma duda, pero la respuesta y el por qué es algo muy obvio jaja, si aun así no logras entender el por qué, cuando apruebes ese examen regresa aquí y te digo el por qué 👀
¡Gracias! Me sirvió tu comentario para entender bien la pregunta. Es posible que la pregunta no sea 100% clara, o se redactó así con la intención de ser una pregunta clara.
Si alguien más tiene la misma duda, mi recomendación es la misma: Leer bien y analizar la pregunta
Tenía dudas de porqué usabamos la carpeta de Feature en vez de Unit para los test y conseguí lo siguiente:
La carpeta Unit se utiliza para guardar tests muy específicos sobre un fragmento de código y en Feature guardaremos los test en los que realizaremos comprobaciones más complejas.
empezamos:
a- Escribir las pruebas (ROJO)
b- Escribir el código que pase las pruebas (VERDE)
c- Refactorizar el código para mejorarlo (Refactor)
para crear un proyecto de Laravel como api se usa el mismo comando? o hay un comando especial para que sea usado solo como API? (que no integre blade o cosas que usan en vistas)
chicos consulta, tengo problemas con el vendor/bin/phpunit, ¿Saben que problema puede ser? o tiene alguna diferencia con php artisan test
php vendor/phpunit/phpunit/phpunit
Espero que ya lo hayas solucionado pero por si las dudas, acá te dejo el comando para windows
de acuerdo
rojo ->creas
verde ->hacer funcionar
refactorizacion ->mejorar
El TDD es una metodología de desarrollo en la que se construye primero las pruebas y luego el código, los pasos a realizar son:
Rojo: Se crea la prueba sin código, obteniendo el error.
Verde: Se crea el código para validar la prueba hasta que salga en verde.
Refactorizar: Revisar el código para organizarlo mejor, obteniendo aún verde sin alterar la prueba.