Subido por Raul Treviño

Resumen Scrum & eXtreme Programming - Raul Treviño Licona

Anuncio
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.
Descargar