Pruebas de Software: Ciclo Rojo, Verde y Refactorización

Clase 28 de 37Curso de Introducción a Laravel 6

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 personalizado
proyecto % 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 404
def 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.