Universidad Autónoma del Estado de México Unidad Académica Profesional Tianguistenco MÉTODOS Y MODELOS DE DESARROLLO DE SOFTWARE Scrum & Extreme Programming Eugenia Bahit Fecha de Entrega : 06/11/2024 Docente: José Rafael Cruz Reyes Alumno: Raúl Treviño Licona TDD - Test Driven Development Desarrollo Guiado por Pruebas (TDD) es una metodología de programación que prioriza la creación de pruebas unitarias antes de desarrollar el código funcional. Este enfoque garantiza que cada componente del software cumpla con los requisitos especificados desde el inicio, promoviendo así un desarrollo más estructurado y menos propenso a errores. El ciclo de TDD se compone de tres etapas fundamentales: 1. Escribir una prueba que falle: Definir una prueba que represente una funcionalidad deseada que aún no está implementada. 2. Implementar el código mínimo necesario para pasar la prueba: Desarrollar solo la cantidad de código requerida para que la prueba pase exitosamente. 3. Refactorizar el código: Mejorar la estructura y legibilidad del código sin alterar su comportamiento funcional, eliminando redundancias y optimizando algoritmos. Este ciclo se repite iterativamente, permitiendo un desarrollo incremental y asegurando que el código siempre esté respaldado por pruebas que validan su correcto funcionamiento. Test Unitarios Los Test Unitarios son pruebas que verifican el funcionamiento de componentes individuales del software de manera aislada. Estos tests aseguran que cada unidad de código (como funciones, métodos o clases) opere según lo esperado, facilitando la detección temprana de errores y simplificando el proceso de depuración. Las características esenciales de los test unitarios incluyen: Atómicos: Cada prueba debe centrarse en una única funcionalidad o comportamiento específico. Independientes: Los tests no deben depender de otros tests, garantizando que fallos en uno no afecten a los demás. Inocuos: No deben alterar el estado del sistema ni generar efectos secundarios que puedan influir en otras pruebas. Rápidos: Deben ejecutarse de manera eficiente para no ralentizar el ciclo de desarrollo. Estos tests son la piedra angular de TDD, proporcionando una base sólida para el desarrollo ágil y la integración continua. Arrange, Act and Assert Arrange, Act and Assert (AAA) es una estructura comúnmente utilizada en la escritura de tests unitarios para organizar el código de prueba de manera clara y mantenible: 1. Arrange (Preparar): Configurar el entorno necesario para la prueba, incluyendo la inicialización de objetos, la definición de valores de entrada y la configuración de cualquier dependencia requerida. 2. Act (Actuar): Ejecutar la acción o método que se está probando, utilizando los datos preparados en la etapa anterior. 3. Assert (Afirmar): Verificar que el resultado obtenido coincide con el esperado, utilizando métodos de aserción para comparar valores, verificar estados o validar condiciones específicas. Esta estructura promueve la claridad y la organización en las pruebas, facilitando su comprensión y mantenimiento a lo largo del tiempo. Unit Testing con PHPUnit PHPUnit es un framework de pruebas unitarias para PHP que sigue el estándar xUnit, permitiendo a los desarrolladores crear y ejecutar pruebas de manera eficiente. Algunas de las características clave de PHPUnit incluyen: Creación de Test Cases: Agrupa tests en clases que heredan de PHPUnit_Framework_TestCase, facilitando la organización de pruebas relacionadas. Métodos de Preparación y Limpieza: Utiliza métodos setUp() y tearDown() para inicializar y limpiar el entorno de prueba antes y después de cada test. Métodos Assert: Proporciona una variedad de métodos de aserción como assertEquals(), assertTrue(), assertNull(), entre otros, para validar diferentes condiciones y resultados. Ejecución de Tests: Permite ejecutar pruebas individuales o un conjunto completo de pruebas, generando reportes detallados sobre los resultados. PHPUnit es una herramienta esencial para implementar TDD en proyectos PHP, asegurando que cada componente funcione correctamente y facilitando la detección y corrección de errores de manera temprana. Unit Testing con PyUnit PyUnit, también conocido como el módulo unittest de Python, es el framework de pruebas unitarias estándar para Python, inspirado en JUnit. Sus principales características son: Estructura de Test Cases: Similar a PHPUnit, PyUnit organiza las pruebas en clases que heredan de unittest.TestCase. Métodos de Preparación y Limpieza: Implementa métodos setUp() y tearDown() para preparar el entorno de prueba y limpiarlo posteriormente. Métodos Assert: Ofrece una variedad de métodos de aserción como assertEqual(), assertTrue(), assertIsNone(), entre otros, para validar resultados y condiciones específicas. Ejecución de Tests: Permite ejecutar todas las pruebas de una vez utilizando unittest.main() o descubrir pruebas automáticamente con unittest discover. PyUnit facilita la implementación de TDD en proyectos Python, asegurando que cada unidad de código esté correctamente testeada y funcionando según lo esperado. Integración Continua La Integración Continua (CI) es una práctica de desarrollo de software donde los miembros del equipo integran sus cambios en el código de manera frecuente, generalmente varias veces al día. Cada integración es verificada por medio de la ejecución automatizada de pruebas, lo que permite detectar y corregir errores rápidamente. Los componentes clave de la integración continua incluyen: Unificación del Código en Repositorios La unificación del código se realiza mediante sistemas de control de versiones que permiten a los desarrolladores colaborar de manera efectiva, evitando conflictos y facilitando la integración de cambios. Repositorios centralizados o distribuidos, como Git o Bazaar, son utilizados para almacenar y gestionar el código fuente del proyecto. Sobre los Sistemas de Control de Versiones Los Sistemas de Control de Versiones (SCV) son herramientas esenciales para la gestión del código fuente, permitiendo rastrear cambios, colaborar con otros desarrolladores y mantener un historial detallado de las modificaciones realizadas. Se dividen en dos tipos principales: Centralizados: Utilizan un único repositorio central donde se almacenan todas las versiones del código. Ejemplos incluyen Subversion (SVN). Distribuidos: Cada desarrollador tiene una copia completa del repositorio, lo que facilita el trabajo en paralelo y la colaboración sin necesidad de una conexión constante al servidor central. Ejemplos incluyen Git y Bazaar. Integración Continua de Bazaar Bazaar es un sistema de control de versiones distribuido que facilita la integración continua mediante la gestión eficiente de ramas y revisiones. Sus características incluyen: Repositorio Central y Ramas Locales: Permite clonar repositorios centrales y trabajar en ramas locales, facilitando la colaboración y la integración de cambios. Comandos Clave: Incluye comandos como bzr add, bzr commit, bzr push y bzr pull para gestionar archivos y sincronizar cambios con el repositorio central. Resolución de Conflictos: Ofrece herramientas para manejar conflictos que puedan surgir al integrar cambios de diferentes desarrolladores, asegurando la coherencia del código. Integración Continua Avanzada con Bazaar La Integración Continua Avanzada con Bazaar implica automatizar el proceso de integración y pruebas utilizando scripts y herramientas que ejecuten comandos de Bazaar junto con la ejecución de pruebas unitarias y de integración. Los pasos típicos incluyen: 1. Actualizar el Repositorio Local: Utilizar bzr pull para traer los últimos cambios del repositorio central. 2. Merge de Cambios: Combinar los cambios locales con los del repositorio central utilizando bzr merge. 3. Resolución de Conflictos: Manejar cualquier conflicto que surja durante el merge con herramientas como bzr resolve. 4. Ejecutar Pruebas: Correr todos los tests unitarios y de integración para verificar que los cambios no introduzcan errores. 5. Commit y Push: Realizar bzr commit con mensajes descriptivos y luego bzr push para enviar los cambios al repositorio central. 6. Automatización: Integrar estos pasos en un servidor de CI que realice estas acciones automáticamente cada vez que se detecten nuevos cambios en el repositorio central. Este enfoque asegura que el código en el repositorio central siempre esté en un estado funcional, facilitando la detección y corrección temprana de errores y manteniendo una alta calidad del software. Refactoring Refactoring es la práctica de mejorar la estructura interna del código sin alterar su comportamiento externo. Su objetivo principal es hacer que el código sea más legible, mantenible y eficiente. Algunas de las técnicas y principios clave incluyen: Eliminar Redundancias: Identificar y eliminar código duplicado para reducir la complejidad y facilitar el mantenimiento. Mejorar la Nomenclatura: Utilizar nombres descriptivos para variables, funciones y clases, lo que facilita la comprensión del código. Simplificar Algoritmos: Optimizar algoritmos para mejorar el rendimiento y reducir la complejidad. Dividir Métodos Largos: Separar métodos extensos en funciones más pequeñas y específicas, siguiendo el principio de responsabilidad única. Reorganizar Clases: Redistribuir responsabilidades entre clases para mejorar la cohesión y reducir el acoplamiento. Bahit introduce la regla de "Tres Strikes y Refactoriza", que sugiere que tras detectar la repetición de una práctica problemática tres veces, es momento de refactorizar para resolverla. Este enfoque promueve una mejora continua del código a lo largo del tiempo, manteniendo su calidad y adaptabilidad a medida que evoluciona el proyecto. Combinando Scrum y eXtreme Programming Scrum y eXtreme Programming (XP) son metodologías ágiles que, cuando se combinan, ofrecen un marco robusto para el desarrollo de software. Mientras que Scrum se centra en la gestión de proyectos y la organización del equipo mediante roles, eventos y artefactos específicos, XP aporta prácticas técnicas como TDD, integración continua y refactoring. La combinación de ambas metodologías permite: Gestión Eficiente del Proyecto: Utilizar las estructuras de Scrum para planificar y monitorear el progreso mediante sprints, reuniones diarias y retrospectivas. Calidad Técnica Superior: Aplicar las prácticas de XP para asegurar que el código sea de alta calidad, bien testeado y mantenible. Flexibilidad y Adaptabilidad: Responder rápidamente a cambios en los requisitos y adaptar el desarrollo según las necesidades del cliente. Colaboración y Comunicación: Fomentar una comunicación constante entre los miembros del equipo y con el cliente, asegurando que todos estén alineados con los objetivos del proyecto. Esta sinergia potencia la eficiencia del equipo, mejora la calidad del producto final y garantiza una entrega continua y sostenida de valor al cliente. Kanban: la metodología ágil que menor resistencia ofrece Kanban es una metodología ágil que se enfoca en la visualización del flujo de trabajo y la gestión de tareas mediante un tablero Kanban. A diferencia de Scrum, Kanban no prescribe roles específicos ni ciclos de trabajo fijos, lo que lo convierte en una metodología más flexible y adaptable. Sus características principales incluyen: Visualización del Trabajo: Utilizar un tablero Kanban dividido en columnas que representan diferentes etapas del proceso (por ejemplo, "Por Hacer", "En Proceso", "Hecho"), permitiendo a todo el equipo ver el estado de cada tarea en tiempo real. Límites de Trabajo en Proceso (WIP): Establecer límites en la cantidad de tareas que pueden estar en una etapa específica al mismo tiempo, evitando sobrecargas y mejorando la eficiencia. Gestión del Flujo: Monitorear y optimizar el flujo de trabajo para identificar y eliminar cuellos de botella, asegurando una entrega continua y sin interrupciones. Mejora Continua: Fomentar una cultura de mejora constante mediante la revisión regular de procesos y la implementación de ajustes según sea necesario. Kanban es ideal para equipos que buscan una transición suave hacia métodos ágiles sin adoptar una estructura rígida, ya que permite adaptarse a las necesidades específicas del equipo y del proyecto, reduciendo la resistencia al cambio y facilitando la implementación de prácticas ágiles de manera gradual.