Está en la página 1de 41

Tema 1 - Desarrollo de software:

Proceso que implica la creación, diseño, implementación, prueba y mantenimiento de programas informáticos y sistemas.
Se puede dividir en varias etapas y sigue prácticas y metodologías específicas para garantizar la calidad y eficiencia del
software.
Concepto software conjunto de instrucciones lógicas y directivas que una computadora sigue para realizar una tarea o
función específica. Están escritos en lenguajes de programación y pueden variar en complejidad

Código Fuente:
● Definición: conjunto de instrucciones escritas en un lenguaje de programación específico
● Formato: Java, C++, Python, etc
● Ejemplo: En Java, extensión .java.

Código Objeto:
● Definición: resultado de la compilación del código fuente. representación intermedia del programa,no es
ejecutable directamente
● Formato: código intermedio (bytecode en Java) o de máquina (instrucciones específicas de la arquitectura
de la máquina).
● Ejemplo: En Java, el código objeto es el bytecode compilado extensión .class.

Código Ejecutable:
● Definición: puede ser ejecutado por la máquina. resultado de la compilación y enlace de códigos fuente y
objeto.
● Formato: SO Windows, puede ser un archivo .exe, en Linux un binario ejecutable, etc.
● Ejemplo: En Java, después de compilar y vincular, el código ejecutable podría ser el archivo .jar (archivo de
Java) o el código de máquina nativo generado en tiempo de ejecución por la máquina virtual Java (JVM).

Máquinas Virtuales:
● Definición: Una máquina virtual es un software que simula el comportamiento de una máquina física y
permite la ejecución de programas escritos para esa máquina virtual.
● Propósito: Proporciona portabilidad al permitir que el mismo código fuente sea ejecutado en diferentes
sistemas operativos y arquitecturas de hardware.
● Ejemplo: En Java, la Máquina Virtual de Java (JVM) ejecuta el bytecode generado por el compilador Java.
En .NET, el Common Language Runtime (CLR) ejecuta programas escritos para el Common Intermediate
Language (CIL).

▪ Tipos de lenguajes de programación.


Existen diversos tipos de lenguajes de programación, cada uno diseñado para propósitos específicos y con
características particulares. Aquí hay una clasificación general de los tipos de lenguajes de programación:

1. Lenguajes de Bajo Nivel:

● Lenguaje de Máquina:
o Compuesto por instrucciones directamente ejecutables por la CPU. Representa el nivel más bajo de
abstracción.
● Ensamblador:
o Utiliza mnemónicos y abreviaturas para representar las instrucciones de máquina. Proporciona un nivel de
abstracción más alto que el lenguaje de máquina.

2. Lenguajes de Alto Nivel:


● Lenguajes Procedurales:
o Basados en procedimientos y secuencias de instrucciones. Ejemplos: C, Pascal.
● Lenguajes Orientados a Objetos:
o Basados en el concepto de objetos que contienen datos y métodos. Ejemplos: Java, C++, Python.
● Lenguajes Funcionales:
o Se centran en las funciones y la programación declarativa. Ejemplos: Haskell, Lisp, Scala.
● Lenguajes de Script:
o Diseñados para escribir scripts rápidamente y se ejecutan interpretados. Ejemplos: Python, JavaScript,
Ruby.

3. Lenguajes de Bajo y Alto Nivel (Híbridos):

● C#:
o Combina características de lenguajes de bajo y alto nivel. Desarrollado por Microsoft.

▪ Características de los lenguajes más difundidos.


1. Java:

● Portabilidad: Diseñado para ser independiente de la plataforma, lo que significa que el código Java puede
ejecutarse en diferentes sistemas operativos sin modificaciones.
● Orientado a Objetos: Se basa en un paradigma de programación orientado a objetos, facilitando la organización y
estructuración del código.

2. Python:

● Sintaxis Clara y Concisa: Su sintaxis es legible y fácil de aprender, lo que facilita la escritura de código rápido y
eficiente.
● Diversidad de Aplicaciones: Utilizado en desarrollo web, ciencia de datos, inteligencia artificial, automatización,
entre otros.

3. JavaScript:

● Lenguaje de Script del Lado del Cliente: Utilizado principalmente para desarrollo web y ejecutado en el navegador
del cliente.
● Asincronía: Soporta operaciones asíncronas, lo que es crucial para el desarrollo web interactivo.

4. C++:

● Eficiencia de Bajo Nivel: Combina características de bajo y alto nivel, permitiendo un control cercano del hardware
mientras ofrece abstracciones de alto nivel.
● Orientado a Objetos: Soporta programación orientada a objetos, lo que facilita la creación y manipulación de
objetos.

5. C#:

● Diseñado para la Plataforma .NET: Integra estrechamente con el entorno .NET de Microsoft y se utiliza
principalmente para desarrollo de aplicaciones Windows y web.
● Orientado a Objetos: Proporciona un enfoque orientado a objetos similar a Java.

6. PHP:
● Lenguaje del Lado del Servidor: Diseñado específicamente para el desarrollo web del lado del servidor.
● Integración con Bases de Datos: Ofrece integración fácil con bases de datos, como MySQL.

7. Ruby:

● Filosofía de la Convención sobre la Configuración: Se adhiere al principio de que las convenciones predefinidas son
preferibles a la configuración manual.
● Sintaxis Elegante: Con un enfoque en la legibilidad y la simplicidad, Ruby tiene una sintaxis elegante.

▪ Ciclo de vida del desarrollo de Software


1. Requisitos:
o Se recopilan y documentan los requisitos del software, es decir, las funciones y características que
debe tener el sistema para satisfacer las necesidades del cliente.
2. Diseño:
o Se crea la arquitectura y el diseño del sistema con base en los requisitos. Esto incluye la estructura
del software, la interfaz de usuario, las bases de datos, y otros aspectos técnicos.
3. Implementación (Codificación):
o Se escribe el código del software utilizando un lenguaje de programación. Aquí es donde se
traduce el diseño en una aplicación funcional.
4. Pruebas:
o Se realizan pruebas para asegurarse de que el software funciona según lo previsto. Esto incluye
pruebas unitarias, de integración y pruebas de sistema.
5. Despliegue:
o El software se implementa y pone en funcionamiento en el entorno de producción para que los
usuarios finales lo utilicen.
6. Mantenimiento:
o Se realizan actualizaciones, correcciones de errores y mejoras para asegurar que el software siga
siendo útil y eficiente a lo largo del tiempo.
▪ Arquitectura de una aplicación.
1. Arquitectura Monolítica:

● La aplicación se construye como una sola unidad. Todos los componentes están interconectados y desplegados
juntos.
● Es fácil de entender y desarrollar, pero puede volverse difícil de mantener a medida que la aplicación crece.

2. Arquitectura de Microservicios:

● Divide la aplicación en servicios independientes y distribuibles. Cada servicio es autónomo y puede comunicarse
con otros a través de API.
● Favorece la escalabilidad y la independencia de desarrollo, pero introduce la complejidad de gestionar múltiples
servicios.

3. Arquitectura Orientada a Servicios (SOA):

● Los servicios son componentes independientes que se comunican a través de mensajes. Cada servicio realiza una
función específica.
● Favorece la reutilización y la flexibilidad, pero también puede ser compleja de gestionar.

4. Arquitectura sin Servidor (Serverless):

● La lógica de la aplicación se ejecuta en entornos sin servidor. Los desarrolladores se centran en el código, mientras
que la infraestructura es gestionada por el proveedor de servicios en la nube.
● Facilita la escalabilidad automática, pero puede tener limitaciones en términos de tiempo de ejecución y
dependencias.

5. Arquitectura de Capas:

● Organiza la aplicación en capas lógicas, como la capa de presentación, la capa de lógica de negocio y la capa de
acceso a datos (Patron Model View Controller).
● Facilita la modularidad y el mantenimiento, pero puede introducir dependencias entre capas.

6. Arquitectura Hexagonal (Puertos y Adaptadores):

● Divide la aplicación en núcleo (dominio) y adaptadores (interfaz de usuario, bases de datos). Los adaptadores se
conectan al núcleo a través de puertos.
● Promueve la independencia de la interfaz de usuario y las tecnologías de persistencia.
-Patrones Diseño.
Los patrones de diseño son soluciones probadas para problemas de diseño comunes. Algunos patrones
importantes incluyen:

1. Patrón Singleton:

● Garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a ella.

2. Patrón Factory:

● Define una interfaz para crear objetos, pero permite a las subclases alterar el tipo de objetos que se crearán.

3. Patrón Observer:

● Define una dependencia uno a muchos entre objetos, de modo que cuando un objeto cambia su estado, todos sus
dependientes son notificados y actualizados automáticamente.

4. Patrón Strategy:

● Define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el cliente
elija el algoritmo apropiado en tiempo de ejecución.

5. Patrón Decorator:

● Añade nuevas funcionalidades a un objeto existente sin alterar su estructura. Utiliza la composición en lugar de la
herencia.

6. Patrón MVC (Modelo-Vista-Controlador):

● Divide una aplicación en tres componentes principales: el Modelo (lógica y datos), la Vista (interfaz de usuario) y el
Controlador (manejo de eventos y lógica).

7. Patrón Chain of Responsibility:

● Permite pasar solicitudes a lo largo de una cadena de manejadores. Cada manejador decide si procesa la solicitud o
la pasa al siguiente en la cadena.

8. Patrón Command:

● Encapsula una solicitud como un objeto, permitiendo parametrizar clientes con operaciones, encolar solicitudes y
soportar operaciones que pueden deshacerse.

Estos son solo algunos ejemplos de patrones de diseño comunes. La elección de la arquitectura y los patrones de
diseño dependerá de los requisitos específicos del proyecto y las necesidades del desarrollo.

▪ Proceso de obtención de código ejecutable a partir del código fuente;herramientas


implicadas.
La secuencia principal es escribir el código fuente (.java), compilarlo en bytecode (.class), empaquetarlo si es necesario en
un (.jar) y luego ejecutarlo en la JVM.

1. Escritura del Código Fuente:


● Los programadores escriben el código fuente en lenguaje Java utilizando un editor de texto o un entorno de
desarrollo integrado (IDE) como Eclipse, IntelliJ, o NetBeans.

2. Compilación del Código Fuente:

● Utilizando el compilador de Java (javac), el código fuente (.java) se compila en archivos de bytecode (.class). Este
bytecode es ejecutable en la máquina virtual Java (JVM).

bash
javac MiPrograma.java
Esto generará el archivo MiPrograma.class.

3. Empaquetado (Opcional):

● Si la aplicación es compleja y consta de varios archivos de clase, se puede empaquetar en un archivo JAR (Java
Archive) para facilitar la distribución y ejecución.

bash
jar cvf MiPrograma.jar MiPrograma.class
Esto creará un archivo JAR llamado MiPrograma.jar que puede ejecutarse en una JVM.

4. Ejecución del Código Bytecode en la JVM:

● El código bytecode generado se ejecuta en la Máquina Virtual Java (JVM). Para ejecutar la aplicación, se utiliza el
comando java seguido del nombre de la clase principal (que contiene el método main).

bash
java MiPrograma
Esto inicia la JVM y ejecuta la aplicación Java.

5. Pruebas y Depuración:

● Antes de distribuir la aplicación, es fundamental realizar pruebas y depuración para garantizar su correcto
funcionamiento.

6. Generación de Documentación (Opcional):

● Se puede utilizar Javadoc para generar documentación a partir del código fuente Java, facilitando la comprensión y
el mantenimiento.

bash
javadoc -d docs MiPrograma.java
Esto creará documentación en el directorio docs.
Este es un resumen básico del proceso. Es importante señalar que la máquina virtual Java (JVM) es esencial para
la ejecución de aplicaciones Java y proporciona portabilidad, ya que permite que el mismo código bytecode se
ejecute en diferentes plataformas que tienen una JVM compatible.

Tema 2 - Instalación y uso de entornos de desarrollo:


● Funciones de un entorno de desarrollo.
Un entorno de desarrollo de software (IDE, por sus siglas en inglés) es una herramienta integral que proporciona
un conjunto de funciones y características destinadas a facilitar y mejorar el proceso de desarrollo de software.
Las funciones de un entorno de desarrollo son variadas y están diseñadas para ayudar a los programadores a
escribir, depurar y mantener código de manera eficiente. Aquí hay algunas funciones comunes de un entorno de
desarrollo:

1. Editor de Código:
o Proporciona un editor de texto avanzado con funciones como resaltado de sintaxis,
autocompletado y formato de código.
o Facilita la escritura y edición de código fuente.
2. Compilación y Construcción:
o Permite compilar y construir proyectos de software.
o Proporciona herramientas para gestionar dependencias y generar ejecutables.
3. Depuración:
o Ofrece herramientas de depuración para detectar y corregir errores en el código.
o Permite establecer puntos de interrupción, inspeccionar variables y seguir la ejecución del
programa paso a paso.
4. Gestión de Proyectos:
o Facilita la creación, apertura y gestión de proyectos de software.
o Proporciona herramientas para organizar y gestionar archivos y recursos.
5. Control de Versiones:
o Integración con sistemas de control de versiones como Git, SVN, etc.
o Permite realizar operaciones como commit, push, pull y fusionar ramas.
6. Navegador Integrado:
o Proporciona un explorador de archivos y una interfaz para navegar por la estructura del proyecto.
o Facilita la búsqueda y apertura de archivos.
7. Herramientas de Refactorización:
o Ofrece funciones de refactorización para mejorar la estructura del código sin cambiar su
comportamiento.
o Ejemplos incluyen la extracción de métodos, renombrar variables, etc.
8. Integración de Pruebas:
o Facilita la ejecución de pruebas unitarias y la integración con marcos de pruebas.
o Proporciona informes de resultados de pruebas.
9. Autocompletado y Ayuda Contextual:
o Ofrece sugerencias automáticas de código mientras se escribe.
o Proporciona información contextual y documentación sobre funciones y clases.
10. Generación de Documentación:
o Facilita la generación de documentación del código fuente.
o Puede integrarse con herramientas de generación de documentación como Javadoc.
11. Soporte para Lenguajes y Frameworks Específicos:
o Ofrece soporte específico para diferentes lenguajes de programación y frameworks.
o Puede incluir integración con herramientas específicas del ecosistema de desarrollo.
12. Personalización y Extensiones:
o Permite la personalización del entorno según las preferencias del programador.
o Ofrece soporte para la instalación de extensiones y complementos.

● Instalación y desinstalación de módulos adicionales.


En Eclipse, los módulos adicionales son generalmente conocidos como "plugins". Estos plugins proporcionan
funcionalidades adicionales y extensiones al entorno de desarrollo. La instalación de plugins en Eclipse es
bastante sencilla y se puede realizar a través del Eclipse Marketplace o manualmente utilizando el instalador de
software.
Método 1: Instalación desde Eclipse Marketplace
1. Abre Eclipse.

2. Ve a Help > Eclipse Marketplace en el menú.

3. En la ventana de Eclipse Marketplace, puedes buscar y seleccionar los plugins que deseas instalar.

4. Haz clic en el botón "Go to the Marketplace" si aún no estás allí.

5. Busca el plugin que deseas instalar, y haz clic en el botón "Go to the full listing" para obtener más
información.
6. Haz clic en "Install" para iniciar el proceso de instalación.

7. Sigue las instrucciones en pantalla para completar la instalación.

Método 2: Instalación Manual


1. Abre Eclipse.

2. Ve a Help > Eclipse Marketplace en el menú.

3. En la ventana de Eclipse Marketplace, busca y anota el nombre del plugin que deseas instalar.

4. Ve a Help > Install New Software... en el menú.

5. En la ventana "Available Software", haz clic en el enlace "Add..." para agregar un nuevo repositorio de
software.
6. Ingresa un nombre para el repositorio y en la dirección, coloca la URL del sitio del plugin o del repositorio.

7. Haz clic en "OK" y espera a que Eclipse cargue el contenido del nuevo repositorio.

8. Selecciona el plugin que deseas instalar y haz clic en "Next".

9. Sigue las instrucciones en pantalla para completar la instalación.

Recuerda que algunos plugins pueden tener dependencias específicas o requerir versiones específicas de Eclipse,
así que asegúrate de leer la documentación del plugin antes de intentar la instalación.

● Uso básico de un entorno de desarrollo.


El uso básico de un entorno de desarrollo Java implica la creación, edición, compilación y ejecución de programas Java.

Paso 1: Instalación de Eclipse


Si aún no tienes Eclipse instalado, puedes descargarlo desde el sitio oficial de Eclipse
(https://www.eclipse.org/ide/) y seguir las instrucciones de instalación.

Paso 2: Crear un Proyecto Java

1. Abre Eclipse.
2. Ve a File > New > Java Project.
3. Ingresa un nombre para tu proyecto, por ejemplo, "MiPrimerProyectoJava".
4. Haz clic en "Finish" para crear el proyecto.

Paso 3: Crear una Clase Java

1. En la ventana "Package Explorer" de Eclipse, haz clic derecho en la carpeta "src" dentro de tu proyecto.
2. Selecciona New > Class.
3. Ingresa un nombre para tu clase, por ejemplo, "MiClaseJava".
4. Marca la opción "public static void main(String[] args)" para agregar el método main.
5. Haz clic en "Finish" para crear la clase.

Paso 4: Escribir y Ejecutar un Programa Java Simple


En tu clase recién creada, puedes escribir un programa simple. Por ejemplo:
java
public class MiClaseJava {
public static void main(String[] args) {
System.out.println("Hola, Mundo!");
}
}

1. Guarda el archivo (Ctrl + S o Cmd + S).


2. Haz clic derecho en el editor de código y selecciona Run As > Java Application.

Verás la salida "Hola, Mundo!" en la consola de Eclipse.

● Generación de ejecutables.
En Eclipse, no generas un ejecutable directamente como lo harías con algunos lenguajes compilados, como C o
C++. En Java, el código fuente se compila en archivos de bytecode, que se ejecutan en la máquina virtual Java
(JVM). Sin embargo, puedes exportar tu proyecto Java en un formato que pueda ser ejecutado de manera
independiente en una máquina que tenga instalada la JVM. A continuación, te explico cómo hacerlo:

Exportar un Archivo JAR Ejecutable en Eclipse:


1. Abre tu Proyecto en Eclipse:
o Asegúrate de tener abierto Eclipse y tu proyecto.
2. Selecciona tu Proyecto:
o Haz clic derecho en el proyecto que deseas exportar en el explorador del proyecto.
3. Elige "Export":
o Selecciona File > Export en el menú.
4. Selecciona "Runnable JAR file":
o En el cuadro de diálogo de Exportación, expande la carpeta "Java" y selecciona "Runnable JAR file". Haz clic
en "Next".
5. Selecciona tu Clase Principal:
o En el campo "Launch configuration", selecciona la clase que contiene el método main que quieres que se
ejecute cuando se inicie el JAR.
6. Especifica la Ruta de Exportación y el Nombre del Archivo:
o Elige una carpeta de destino y proporciona un nombre para el archivo JAR.
7. Configuración de Bibliotecas:
o Puedes elegir cómo manejar las bibliotecas en el archivo JAR. Normalmente, seleccionas "Extract required
libraries into generated JAR" para incluir todas las bibliotecas necesarias en el JAR.
8. Haz clic en "Finish":
o Haz clic en "Finish" para completar el proceso de exportación.

Después de completar estos pasos, tendrás un archivo JAR ejecutable que puede ser ejecutado en cualquier
máquina con la JVM instalada. Puedes ejecutar el JAR desde la línea de comandos usando el comando java -jar
TuArchivo.jar.
Recuerda que para que tu aplicación sea verdaderamente portátil, cualquier biblioteca externa que estés
utilizando debe estar disponible en la máquina de destino. Además, es posible que debas proporcionar
instrucciones adicionales para ejecutar tu aplicación según la configuración específica de tu proyecto.

Tema 3 -Diseño y realización de pruebas:


● Planificación de Pruebas.
La planificación de pruebas de software es un proceso crucial para garantizar la calidad del software. Pasos a
seguir:

1. Entender Requisitos y Documentación:

● Revisar y comprender los requisitos del software.


● Analizar la documentación del proyecto para obtener una visión clara de la arquitectura y funcionalidad.

2. Definir Objetivos de Pruebas:

● Establecer objetivos claros y medibles para las pruebas.


● Identificar las características críticas y los escenarios de uso importantes.

3. Identificar Tipos de Pruebas:

● Determinar los tipos de pruebas necesarios (pruebas funcionales, no funcionales, de rendimiento, de seguridad,
etc.).
● Priorizar las pruebas según la criticidad y los riesgos asociados.

4. Selección de Herramientas y Ambientes:

● Seleccionar las herramientas de prueba adecuadas.


● Configurar los entornos de prueba, incluyendo hardware y software.

5. Diseño de Casos de Prueba:

● Crear casos de prueba detallados que cubran todos los escenarios relevantes.
● Asegurarse de que los casos de prueba sean repetibles y verificables.

6. Estrategia de Ejecución:

● Definir la estrategia de ejecución de pruebas, incluyendo secuencia y dependencias.


● Planificar la asignación de recursos y el cronograma de ejecución.

7. Gestión de Datos de Prueba:

● Preparar conjuntos de datos de prueba relevantes y realistas.


● Asegurarse de que los datos de prueba sean anónimos y cumplan con regulaciones de privacidad.

8. Configuración de Ambiente de Pruebas:


● Preparar el ambiente de prueba con configuraciones específicas.
● Garantizar que el ambiente de prueba sea similar al de producción cuando sea posible.

9. Ejecución de Pruebas:

● Ejecutar casos de prueba según el plan.


● Registrar resultados y documentar cualquier problema encontrado.

10. Reportar y Seguimiento:

● Generar informes de prueba que sean claros y comprensibles.


● Priorizar y asignar problemas encontrados para su resolución.
● Seguir el progreso de la corrección de errores.

11. Criterios de Éxito y Finalización:

● Definir criterios claros para el éxito de las pruebas.


● Establecer cuándo se considera completa la fase de pruebas.

12. Revisión y Mejora Continua:

● Realizar revisiones retrospectivas después de cada ciclo de pruebas.


● Identificar áreas de mejora y ajustar la estrategia de prueba para futuros ciclos.

13. Automatización de Pruebas:

● Evaluar la posibilidad de automatizar pruebas repetitivas y críticas.


● Implementar scripts de prueba automatizados según sea necesario.

14. Pruebas de Regresión:

● Planificar pruebas de regresión para garantizar que las nuevas funciones no afecten las existentes.

15. Validación y Aprobación:

● Obtener validación y aprobación del cliente o partes interesadas.

16. Documentación:

● Mantener documentación actualizada de todas las actividades de prueba.

Recuerda que la planificación de pruebas debe ser flexible y adaptarse según las necesidades y cambios en el
proyecto. Además, la colaboración con otros equipos y partes interesadas es esencial para una planificación de
pruebas efectiva.

Ejemplo: Planificación de pruebas para un sistema de comercio electrónico:

Planificación de Pruebas de Software: Sistema de Comercio Electrónico


1. Objetivos de las Pruebas:

● Verificar la funcionalidad del Sistema de Comercio Electrónico.


● Validar la seguridad de las transacciones y la protección de datos.
● Evaluar el rendimiento del sistema durante picos de tráfico.
● Asegurar la compatibilidad con varios navegadores y dispositivos.

2. Alcance:

● Módulos incluidos: Catálogo de productos, Carrito de compras, Proceso de pago, Gestión de pedidos.
● No incluido en esta fase: Integración con sistemas de envío externos.

3. Tipos de Pruebas:

● Pruebas Funcionales
o Pruebas de Casos de Uso
o Pruebas de Interfaz de Usuario
o Pruebas de Integración
o Pruebas de Aceptación del Usuario (UAT)
● Pruebas No Funcionales
o Pruebas de Rendimiento
o Pruebas de Seguridad
o Pruebas de Compatibilidad de Navegadores y Dispositivos
o Pruebas de Estrés

4. Cronograma:

● Fase de Preparación (Semana 1-2):


o Revisión de Requisitos y Documentación.
o Configuración del Ambiente de Pruebas.
o Creación de Escenarios de Pruebas.
● Fase de Ejecución (Semana 3-6):
o Ejecución de Pruebas Funcionales.
o Ejecución de Pruebas No Funcionales.
o Automatización de Pruebas de Regresión.
o Pruebas de Rendimiento y Compatibilidad.
● Fase de Informes y Seguimiento (Semana 7-8):
o Generación de Informes de Pruebas.
o Seguimiento y Resolución de Defectos.
o Revisión de Resultados con el Equipo de Desarrollo.

5. Recursos:

● Personal:
o Un Líder de Pruebas.
o Cuatro Ingenieros de Pruebas.
● Herramientas:
o Selenium y TestNG para pruebas de interfaz de usuario.
o Apache JMeter para pruebas de rendimiento.
o OWASP ZAP para pruebas de seguridad.

6. Ambiente de Pruebas:

● Servidor de Pruebas: Ubuntu Server 20.04.


● Base de Datos: MySQL.
● Navegadores Compatibles: Chrome, Firefox, Safari, Edge.
● Dispositivos: PC, tabletas y teléfonos móviles.

7. Criterios de Éxito:

● Todos los casos de prueba funcional se ejecutan sin errores.


● El tiempo de carga de la página de pago es inferior a 3 segundos.
● Menos del 2% de defectos críticos sin resolver al final de la fase de pruebas.

8. Riesgos y Mitigaciones:
● Riesgo: Variaciones en la carga del servidor.

o Mitigación: Realizar pruebas de estrés y escalabilidad en diferentes condiciones de carga.


● Riesgo: Problemas de seguridad en transacciones.
o Mitigación: Implementar controles de seguridad y realizar pruebas de penetración.

9. Revisión y Mejora Continua:

● Realizar una revisión retrospectiva al final de la fase de pruebas.


● Identificar áreas de mejora y ajustar la estrategia de pruebas para futuros ciclos.

● Tipos de pruebas: Funcionales, estructurales, regresión.


1. Pruebas Funcionales:
Las pruebas funcionales evalúan si el software cumple con los requisitos funcionales y especificaciones del
usuario. Se centran en verificar las funciones y características del sistema desde la perspectiva del usuario.
Algunos tipos comunes de pruebas funcionales incluyen:
● Pruebas de Casos de Uso: Validan que el software realiza las acciones esperadas en diferentes escenarios
de uso.
Ejemplo: En un sistema de comercio electrónico, verificar que el proceso de compra, desde la selección
de productos hasta el pago, funciona correctamente.
● Pruebas de Interfaz de Usuario (UI): Verifican la interfaz gráfica del usuario, la navegación y la experiencia
del usuario.
Ejemplo: En una aplicación web, verificar que todos los botones, enlaces y formularios se muestran
correctamente y son funcionales en diferentes navegadores.
● Pruebas de Integración: Comprueban la interoperabilidad entre diferentes componentes o módulos del
sistema.
Ejemplo: En un sistema bancario, verificar que la información se actualiza correctamente en todas las
cuentas relacionadas cuando se realiza una transferencia de fondos.
● Pruebas de Aceptación del Usuario (UAT): Son realizadas por los usuarios finales para confirmar que el
sistema cumple con sus expectativas.
Ejemplo: En un sistema de gestión de proyectos, confirmar que los usuarios finales pueden crear,
modificar y cerrar tareas según sus necesidades.

2. Pruebas Estructurales (o Pruebas No Funcionales):


Las pruebas estructurales evalúan aspectos internos del software, como el código fuente, la arquitectura y el
rendimiento. Estas pruebas se centran en asegurar que el software funcione de manera eficiente y confiable.
Algunos ejemplos de pruebas estructurales incluyen:
● Pruebas de Unidad: Verifican que cada unidad de código individual funcione correctamente.
Ejemplo: Para una función que suma dos números, se ejecuta una prueba con valores conocidos y se
verifica si la suma es correcta.
● Pruebas de Rendimiento: Evalúan la capacidad del sistema para manejar cargas de trabajo específicas y
su capacidad de respuesta.
Ejemplo: Medir el tiempo de respuesta de una página web bajo diferentes niveles de tráfico simulado.
● Pruebas de Seguridad: Buscan identificar vulnerabilidades y asegurar que el software es resistente a
amenazas de seguridad.
Ejemplo: En una aplicación bancaria en línea, comprobar que la información confidencial del usuario está
protegida contra ataques como la inyección SQL.
● Pruebas de Estrés: Evalúan el comportamiento del sistema bajo condiciones extremas o situaciones
inusuales.
Ejemplo: Realizar pruebas para determinar cómo el sistema maneja un gran número de usuarios
concurrentes o una carga de trabajo intensa.

3. Pruebas de Regresión:
Las pruebas de regresión se centran en asegurar que las nuevas modificaciones o adiciones al software no hayan
introducido errores en las funcionalidades existentes. Estas pruebas son críticas cuando se realizan
actualizaciones o cambios en el código. Algunos tipos de pruebas de regresión son:
● Pruebas de Regresión Automatizadas: Utilizan scripts automáticos para volver a ejecutar casos de prueba
existentes después de cambios en el código.
● Pruebas de Retroceso (Backward Compatibility): Verifican que las nuevas versiones del software sean
compatibles con versiones anteriores.
● Pruebas de Impacto: Evalúan cómo los cambios afectan otras áreas del sistema.
La combinación de estos tipos de pruebas es esencial para garantizar un software de calidad. La elección de qué
pruebas aplicar depende de la naturaleza del proyecto y los requisitos específicos del software.

● Procedimientos y casos de prueba.


Ejemplo de la gestión de un carrito de compras:

Procedimientos:

1. Añadir Producto al Carrito:

● Objetivo: Verificar que los usuarios pueden añadir productos al carrito correctamente.
● Procedimiento:
1. Navegar a la página de un producto.
2. Hacer clic en el botón "Añadir al Carrito".
3. Verificar que el producto se añade al carrito.
4. Confirmar que la cantidad en el icono del carrito se actualiza.
2. Modificar Cantidad en el Carrito:

● Objetivo: Confirmar que los usuarios pueden ajustar la cantidad de productos en el carrito.
● Procedimiento:
1. Ir al carrito de compras.
2. Modificar la cantidad de un producto.
3. Verificar que el total del carrito se actualiza correctamente.

3. Eliminar Producto del Carrito:

● Objetivo: Asegurar que los usuarios pueden eliminar productos del carrito.
● Procedimiento:
1. Ir al carrito de compras.
2. Eliminar un producto.
3. Verificar que el producto se elimina del carrito.

Casos de Prueba:

Caso de Prueba 1: Añadir Producto al Carrito

● Precondición: La página del producto está disponible.


● Pasos:
1. Navegar a la página del producto.
2. Hacer clic en "Añadir al Carrito".
● Resultado Esperado: El producto se añade al carrito y la cantidad en el icono del carrito se actualiza.

Caso de Prueba 2: Modificar Cantidad en el Carrito

● Precondición: Al menos un producto está en el carrito.


● Pasos:
1. Ir al carrito de compras.
2. Modificar la cantidad de un producto.
● Resultado Esperado: La cantidad se actualiza y el total del carrito refleja el cambio.

Caso de Prueba 3: Eliminar Producto del Carrito

● Precondición: Al menos un producto está en el carrito.


● Pasos:
1. Ir al carrito de compras.
2. Eliminar un producto.
● Resultado Esperado: El producto se elimina del carrito y la cantidad en el icono del carrito se ajusta.

● Herramientas de depuración.
● Pruebas de Código: Cubrimiento, valores límite, clases de
equivalencia, entre otras.
1. Pruebas de Cubrimiento:

● Objetivo: Asegurarse de que todas las líneas de código sean ejecutadas durante las pruebas.
Caso de Prueba:

● Criterios de Aceptación:
o Utilizar herramientas de análisis de cubrimiento como JaCoCo o Cobertura.
o Verificar que al menos el 90% de las líneas de código están cubiertas por las pruebas.
o Identificar y corregir áreas no cubiertas.

2. Pruebas de Valores Límite:

● Objetivo: Evaluar el comportamiento del software en los límites de su entrada.

Caso de Prueba:

● Escenario:
o Para una función que acepta números enteros entre 1 y 100, probar con valores 1, 50, 100.
o Verificar que el software maneje correctamente los límites inferior y superior.
o Probar con valores fuera de este rango y verificar la respuesta del software.

3. Pruebas de Clases de Equivalencia:

● Objetivo: Dividir el conjunto de datos de entrada en clases de equivalencia y probar representantes de cada clase.

Caso de Prueba:

● Escenario:
o Para una función que acepta números enteros, dividir los números en clases de equivalencia (negativos,
cero, positivos).
o Seleccionar un representante de cada clase para realizar pruebas.
o Verificar que el software maneje adecuadamente cada clase.

● Normas de calidad.
Existen diversas normas y estándares de calidad de software que son reconocidos internacionalmente. Estas
normas establecen pautas y buenas prácticas para el desarrollo, mantenimiento y evaluación de la calidad del
software. Aquí hay algunas de las normas más relevantes:

1. ISO/IEC 9126 (Reemplazada por ISO/IEC 25010):

● Objetivo:
o Proporcionar un marco para la calidad del software con enfoque en características como funcionalidad,
fiabilidad, usabilidad, eficiencia, mantenibilidad y portabilidad.
● Notas:
o La norma ISO/IEC 9126 ha sido reemplazada por la norma ISO/IEC 25010, que proporciona una estructura
más actualizada y aborda nuevas tecnologías y prácticas de desarrollo.

2. ISO/IEC 25010: SQuaRE (Software Quality Requirements and Evaluation):

● Objetivo:
o Establecer un modelo de calidad para el software y sistemas de información, considerando características
de calidad y subcaracterísticas.
● Notas:
o Se centra en características como la funcionalidad, la seguridad, la usabilidad, la eficiencia y otras.

3. ISO/IEC 12207: Procesos del Ciclo de Vida del Software:

● Objetivo:
o Establecer procesos para el ciclo de vida del software, incluyendo adquisición, suministro, desarrollo,
operación y mantenimiento.
● Notas:
o Proporciona una estructura para la gestión de procesos y actividades a lo largo del ciclo de vida del
software.

4. ISO/IEC 15504 (SPICE - Software Process Improvement and Capability Determination):

● Objetivo:
o Proporcionar un marco para la evaluación y mejora de procesos de software.
● Notas:
o Ayuda a las organizaciones a evaluar la capacidad de sus procesos y mejorar la eficacia y eficiencia del
desarrollo de software.

5. CMMI (Capability Maturity Model Integration):

● Objetivo:
o Proporcionar un conjunto de mejores prácticas para mejorar los procesos de desarrollo y mantenimiento de
software.
● Notas:
o Divide la mejora del proceso en niveles de madurez, desde inicial hasta optimizado.

6. IEEE 730: Estándar para la Gestión de Calidad del Software:

● Objetivo:
o Establecer estándares para la gestión de la calidad del software, incluyendo la planificación, supervisión y
evaluación.
● Notas:
o Proporciona directrices para el desarrollo de planes de gestión de calidad del software.

7. IEEE 829: Estándar para Documentación de Pruebas de Software:

● Objetivo:
o Establecer estándares para la documentación de pruebas de software, incluyendo planes de prueba, casos
de prueba y procedimientos de prueba.
● Notas:
o Proporciona pautas para la documentación efectiva de actividades de prueba.

Estas normas son utilizadas en la industria del software para garantizar la calidad y eficiencia en los procesos de
desarrollo. La elección de una norma específica puede depender de la industria, los requisitos del cliente y la
naturaleza del proyecto.

● Pruebas unitarias; herramientas.


 JUnit (Java):
● Descripción:
o JUnit es una popular herramienta de prueba unitaria para aplicaciones Java.
● Características:
o Anotaciones para definir pruebas.
o Asserts para verificar resultados.
o Integración con IDEs como Eclipse y IntelliJ.

 NUnit (.NET):

● Descripción:
o NUnit es un marco de prueba unitaria para aplicaciones .NET (C# y otros lenguajes de .NET).
● Características:
o Anotaciones y atributos para definir pruebas.
o Asserts para validar resultados.
o Soporte para pruebas parametrizadas.

 Pytest (Python):

● Descripción:
o Pytest es un marco de prueba para aplicaciones Python.
● Características:
o Sintaxis sencilla y fácil de aprender.
o Detección automática de pruebas.
o Soporte para fixtures y mocks.

 Mocha (JavaScript):

● Descripción:
o Mocha es un marco de prueba para JavaScript (Node.js y el navegador).
● Características:
o Soporte para pruebas asíncronas.
o Configuración fácil y flexible.
o Integración con bibliotecas como Chai y Sinon.

 PHPUnit (PHP):

● Descripción:
o PHPUnit es un marco de prueba unitaria para aplicaciones PHP.
● Características:
o Soporte para pruebas de unidades y pruebas de integración.
o Integración con herramientas de CI/CD.

● Automatización de pruebas.
 Selenium:

● Uso:
o Automatización de pruebas de navegadores web.
● Características:
o Soporte para múltiples navegadores.
o Integración con varios lenguajes de programación.

 Appium:

● Uso:
o Automatización de pruebas de aplicaciones móviles (iOS, Android).
● Características:
o Soporte para pruebas nativas, híbridas y basadas en web.

 JUnit y TestNG:

● Uso:
o Automatización de pruebas unitarias en Java.
● Características:
o Anotaciones para definir pruebas.
o Integración con IDEs y herramientas de construcción.

 Robot Framework:

● Uso:
o Automatización de pruebas de aceptación y pruebas de robot.
● Características:
o Sintaxis fácil de leer.
o Soporte para pruebas web, móviles y de API.

● Documentación de pruebas.
La documentación de pruebas de software es esencial para registrar y comunicar información sobre las pruebas
realizadas en un proyecto. Proporciona una referencia clave para el equipo de desarrollo, los probadores y otros
interesados, ayudando a comprender el alcance, los resultados y los detalles de las pruebas realizadas. Esta es la
estructura general de la documentación de pruebas de software:

1. Plan de Pruebas:

● Descripción:
o Un documento que describe la estrategia general de pruebas para el proyecto.
● Contenido:
o Objetivos de las pruebas.
o Alcance y exclusión.
o Recursos necesarios.
o Cronograma de pruebas.
o Estrategia de pruebas (pruebas unitarias, de integración, etc.).
o Criterios de aceptación.

2. Casos de Prueba:

● Descripción:
o Documentos individuales que describen escenarios de prueba específicos.
● Contenido:
o Título y descripción del caso de prueba.
o Pasos de prueba detallados.
o Datos de entrada.
o Resultados esperados.
o Condiciones previas y posteriores.

3. Suite de Pruebas:

● Descripción:
o Un conjunto de casos de prueba relacionados que se ejecutan conjuntamente.
● Contenido:
o Lista de casos de prueba incluidos.
o Propósito de la suite de pruebas.
o Información sobre la configuración necesaria.

4. Informe de Ejecución de Pruebas:

● Descripción:
o Un resumen de los resultados de las pruebas ejecutadas.
● Contenido:
o Resumen general de resultados (éxito, falla, no ejecutado).
o Descripciones detalladas de los problemas encontrados.
o Estadísticas de cobertura.
o Información sobre la configuración de prueba utilizada.

5. Registro de Defectos:

● Descripción:
o Documento que registra los problemas encontrados durante las pruebas.
● Contenido:
o Identificación única del defecto.
o Descripción del defecto.
o Pasos para reproducir el defecto.
o Prioridad y gravedad.
o Estado del defecto (abierto, asignado, cerrado, etc.).

6. Matriz de Rastreo de Requisitos:

● Descripción:
o Un documento que muestra la relación entre los requisitos y los casos de prueba.
● Contenido:
o Lista de requisitos.
o Enlaces a los casos de prueba que prueban cada requisito.

7. Documentación de Configuración de Pruebas:

● Descripción:
o Detalles sobre la configuración del entorno de prueba.
● Contenido:
o Hardware y software requeridos.
o Configuración de red.
o Configuración del sistema operativo.

8. Scripts de Prueba Automatizados:


● Descripción:
o Documentación de los scripts utilizados en pruebas automatizadas.
● Contenido:
o Descripción de la funcionalidad probada.
o Instrucciones de ejecución.
o Manejo de datos de prueba.

9. Documentación de Rendimiento:

● Descripción:
o Información detallada sobre las pruebas de rendimiento realizadas.
● Contenido:
o Resultados de las pruebas de carga.
o Información sobre la escalabilidad del sistema.

10. Documentación de Seguridad:

● Descripción:
o Información detallada sobre las pruebas de seguridad realizadas.
● Contenido:
o Resultados de las pruebas de penetración.
o Identificación de posibles vulnerabilidades.

Optimización y documentación - Refactorización.


La refactorización de software es el proceso de modificar el código fuente de un programa sin cambiar su
comportamiento externo con el objetivo de mejorar su calidad, mantenibilidad y eficiencia. La refactorización
ayuda a reducir la deuda técnica y a hacer que el código sea más comprensible y fácil de mantener. Aquí hay
algunas técnicas comunes de refactorización:

 Extracción de métodos:

o Objetivo: Dividir un método grande en métodos más pequeños y específicos.


o Beneficios: Mejora la legibilidad y facilita la reutilización del código.

// Antes
void procesarDatos() {
// código extenso
}

// Después
void procesarDatos() {
procesarParte1();
procesarParte2();
}

void procesarParte1() {
// código específico de la parte 1
}

void procesarParte2() {
// código específico de la parte 2
}
 Eliminación de código duplicado:

● Objetivo: Reducir la duplicación de código para mejorar la coherencia y facilitar futuras modificaciones.
● Beneficios: Menos propenso a errores y cambios más rápidos.

// Antes
void operacion1() {
// código común
// operación específica 1
}

void operacion2() {
// código común
// operación específica 2
}

// Después
void operacionComun() {
// código común
}

void operacion1() {
operacionComun();
// operación específica 1
}

void operacion2() {
operacionComun();
// operación específica 2
}

 Renombrar variables y métodos:

● Objetivo: Utilizar nombres descriptivos que reflejen mejor la funcionalidad.


● Beneficios: Mejora la comprensión del código.

// Antes
int x = 10;

// Después
int numeroIntentos = 10;

 Uso de patrones de diseño:

● Objetivo: Aplicar patrones de diseño para mejorar la estructura y la flexibilidad del código.
● Beneficios: Mejora la modularidad y facilita la expansión futura.

-Limitaciones de la Refactorización
 Costo de tiempo y recursos:

● Descripción: La refactorización puede ser un proceso que consume tiempo y recursos. A veces, la presión
del tiempo en un proyecto puede limitar la cantidad de refactorización que se puede realizar.
● Consideración: Es importante equilibrar el beneficio a largo plazo de una base de código más limpia con
las restricciones de tiempo y recursos del proyecto.

 Riesgo de introducir errores:

● Descripción: Durante la refactorización, existe el riesgo de introducir errores en el código existente. Si no


se realizan pruebas adecuadas después de la refactorización, podrían surgir problemas.
● Consideración: Es fundamental realizar pruebas exhaustivas después de cada refactorización. Las pruebas
automáticas pueden ayudar a identificar rápidamente posibles problemas.

 Requerimientos de conocimiento:

● Descripción: La refactorización efectiva requiere un conocimiento profundo del sistema existente. Los
desarrolladores deben entender cómo interactúan diferentes partes del código para realizar cambios
seguros y significativos.
● Consideración: Se debe fomentar la documentación adecuada y el intercambio de conocimientos entre
miembros del equipo para facilitar la refactorización.

 Impacto en el tiempo de lanzamiento:

● Descripción: La refactorización puede interferir con los plazos de lanzamiento del producto si no se
planifica cuidadosamente. Los cambios significativos en el código pueden requerir tiempo adicional de
prueba.
● Consideración: La planificación cuidadosa, la identificación de áreas críticas y la priorización de la
refactorización pueden ayudar a minimizar el impacto en los plazos de lanzamiento.

-Patrones de refactorización más usuales.


Los patrones de refactorización son soluciones generales para problemas comunes que surgen durante el proceso
de refactorización de código.

 Extract Method:

● Descripción: Consiste en tomar un fragmento de código y convertirlo en un método separado.


● Cuándo usarlo: Cuando se encuentra un bloque de código que realiza una tarea específica y puede ser
reutilizado en otras partes del código.

 Inline Method:

● Descripción: Contrario a "Extract Method", este patrón implica eliminar un método y colocar su lógica
directamente en el lugar donde se llama.
● Cuándo usarlo: Cuando un método es tan simple que no agrega claridad y su existencia solo complica el
código.

 Move Method:

● Descripción: Mover un método de una clase a otra para mejorar la cohesión y reducir la dependencia.
● Cuándo usarlo: Cuando un método se relaciona más con otra clase que con la clase actual.
 Rename Method:

● Descripción: Cambiar el nombre de un método para que refleje mejor su funcionalidad.


● Cuándo usarlo: Cuando el nombre actual del método no es claro o no describe adecuadamente lo que
hace.

 Introduce Parameter Object:

● Descripción: Agrupar parámetros relacionados en un objeto para reducir la lista de argumentos de un


método.
● Cuándo usarlo: Cuando un método tiene muchos parámetros, especialmente si algunos de ellos son
relacionados entre sí.

-Analizadores de código
Los analizadores de software son herramientas que examinan el código fuente de un programa para identificar
patrones, errores, inconsistencias y otras características que pueden afectar la calidad, el rendimiento y la
seguridad del software. Estos analizadores pueden automatizar la detección de problemas potenciales y
proporcionar retroalimentación a los desarrolladores. Aquí hay algunos tipos comunes de analizadores de
software:

1. Analizadores de Estilo de Código:


o Propósito: Evalúan el código en función de las convenciones de estilo y las pautas de codificación.
o Ejemplos: ESLint, Pylint, Checkstyle, JSparrow
2. Analizadores Estáticos de Código (Static Code Analyzers):
o Propósito: Examinan el código fuente sin ejecutarlo y buscan posibles problemas como variables
no utilizadas, código inalcanzable, entre otros.
o Ejemplos: SonarQube, PMD, ReSharper.
3. Analizadores de Seguridad:
o Propósito: Identifican vulnerabilidades de seguridad en el código, como posibles ataques de
inyección SQL, XSS, etc.
o Ejemplos: SonarQube (también incluye análisis de seguridad), Fortify, OWASP Dependency-Check.
4. Analizadores de Rendimiento:
o Propósito: Evalúan el código en busca de posibles cuellos de botella y problemas de rendimiento.
o Ejemplos: jSparrow, VisualVM, Performance Analyzer de Xcode.
5. Analizadores de Complejidad Ciclomática:
o Propósito: Calculan la complejidad del código basándose en la cantidad de caminos de ejecución
posibles.
o Ejemplos: McCabe Complexity Checker.
6. Analizadores de Dependencias:
o Propósito: Identifican dependencias entre componentes de software y evalúan la coherencia de
las dependencias.
o Ejemplos: Dependency-Check, JDepend.
7. Analizadores de Cobertura de Código:
o Propósito: Evalúan qué porcentaje del código fuente ha sido ejecutado por las pruebas.
o Ejemplos: JaCoCo, Istanbul (para JavaScript/Node.js), codecov.io.
8. Analizadores de Diagramas UML:
o Propósito: Generan diagramas UML (Unified Modeling Language) a partir del código fuente.
o Ejemplos: Enterprise Architect, PlantUML.
9. Analizadores de Licencias de Software:
o Propósito: Identifican las licencias de software utilizadas en las dependencias del proyecto.
o Ejemplos: FOSSA, Black Duck.
10. Analizadores de Copia de Código (Duplicación de Código):
o Propósito: Identifican fragmentos de código duplicados en el código fuente.
o Ejemplos: CPD (Copy-Paste Detector) de PMD.
11. Analizadores de Documentación de Código:
o Propósito: Evalúan la calidad y la coherencia de la documentación del código.
o Ejemplos: Doxygen, Javadoc.

● Control de versiones.
Instalar VisualSVNServer
https://www.visualsvn.com/server/download/
Instalar SVN Subversion y su conector
https://eclipse.dev/subversive/installation-instructions.php

Alternativa, instalar Subclipse. Subclipse proporciona integración de SVN en el entorno de desarrollo Eclipse. Aquí
tienes los pasos básicos para instalar Subclipse:

1. Abrir Eclipse:
o Inicia Eclipse en tu sistema.
2. Instalar Subclipse:
o Ve a Help -> Eclipse Marketplace en la barra de menú.
3. Buscar Subclipse:
o En el cuadro de diálogo del Marketplace, busca "Subclipse" en el cuadro de búsqueda.
4. Instalar Subclipse:
o En los resultados de la búsqueda, deberías encontrar "Subclipse" en la lista. Haz clic en Go to the full
listing y luego haz clic en el botón Go to the Subclipse Installation para instalar Subclipse.
5. Seleccionar Componentes:
o En la página de instalación, selecciona los componentes que deseas instalar. Asegúrate de
seleccionar "Subclipse" y "SVNKit" (o "JavaHL" si prefieres usar la biblioteca nativa de JavaHL).
6. Aceptar Términos de Licencia:
o Acepta los términos de licencia y haz clic en Finish para completar la instalación.
7. Reiniciar Eclipse:
o Después de la instalación, Eclipse te pedirá que reinicies la aplicación. Acepta reiniciar para aplicar
los cambios.
8. Configurar Repositorios SVN:
o Una vez reiniciado Eclipse, puedes configurar tus repositorios SVN:
▪ Abre la perspectiva SVN Perspective seleccionando Window -> Perspective -> Open Perspective ->
Other... -> SVN Repository Exploring.
9. Agregar Repositorio SVN:
o Haz clic derecho en el área SVN Repositories y selecciona New -> Repository Location.
o Ingresa la URL de tu repositorio SVN y sigue los pasos para agregarlo.

Después de estos pasos, deberías tener Subclipse instalado y configurado en tu entorno Eclipse. Puedes utilizar la
perspectiva SVN Repository Exploring para acceder y gestionar tus repositorios SVN directamente desde Eclipse.
Además, podrás realizar operaciones como commit, update, merge y otras funciones de SVN directamente desde
la interfaz de Eclipse.

Documentación adicional SVN_Subversive_v1.1.pdf


Estructura de las herramientas de control de versiones.
1. Repositorio SVN:

● Descripción: Es el almacenamiento centralizado que contiene la historia completa del proyecto, incluidas todas las
versiones y cambios realizados a lo largo del tiempo.

2. Tronco (Trunk):

● Descripción: Representa la línea principal de desarrollo en el repositorio. Contiene la versión principal del proyecto
y es el punto de partida para ramas y desarrollo.

3. Ramas (Branches):

● Descripción: Son copias independientes del tronco o de otras ramas. Se utilizan para el desarrollo de características
aisladas o para abordar problemas específicos sin afectar directamente al código en el tronco.

4. Etiquetas (Tags):

● Descripción: Son puntos específicos en la historia del proyecto que se utilizan para marcar versiones importantes o
estables. A diferencia de las ramas, las etiquetas suelen ser inmutables y se utilizan para referenciar versiones
específicas del código.

5. Copia de Trabajo (Working Copy):

● Descripción: Es una copia local de una parte del repositorio, que puede incluir el tronco, ramas o etiquetas. Los
desarrolladores trabajan en sus copias locales y realizan cambios antes de enviarlos de vuelta al repositorio central.

6. Commit (Confirmar):

● Descripción: Representa un conjunto de cambios realizados por un usuario en su copia de trabajo local. Cada
commit crea una nueva revisión en el historial del repositorio.

7. Update (Actualizar):

● Descripción: Actualiza la copia de trabajo local con los cambios más recientes del repositorio central. Es utilizado
para sincronizar el trabajo local con la versión más reciente del código en el repositorio.

8. Checkout (Clonar un Repositorio):

● Descripción: Crea una copia de trabajo local descargando una versión específica del código desde el repositorio. Es
la acción inicial que se realiza al comenzar a trabajar en un proyecto.

9. Conflictos:

● Descripción: Ocurren cuando dos o más usuarios realizan cambios en la misma parte de un archivo. Resolver
conflictos implica reconciliar manualmente las diferencias para que la versión resultante sea coherente.

10. Log (Registro de Cambios):

● Descripción: Mantiene un registro detallado de todos los cambios realizados en el repositorio, incluyendo quién
hizo el cambio, cuándo y qué archivos se modificaron.
11. Merge (Mezcla):

● Descripción: Combina los cambios realizados en una rama de vuelta al tronco principal. Es utilizado para consolidar
el trabajo realizado en diferentes ramas.

● Documentación. Uso de comentarios. Alternativas.


Documentación de clases.
Herramientas.
La documentación es un componente crucial en el desarrollo de software, ya que proporciona información
esencial para entender, utilizar y mantener el código. A continuación, se abordan algunos aspectos relacionados
con la documentación, el uso de comentarios y se presentan algunas alternativas, así como herramientas
comunes para documentar clases.

Documentación:
1. Comentarios en el Código:
o Propósito: Los comentarios en el código son anotaciones que explican el propósito de ciertas secciones de
código.
o Uso adecuado: Deben ser claros y concisos, proporcionando información útil sin redundancias innecesarias.
2. Documentación de Clases:
o Propósito: La documentación de clases describe el propósito, la funcionalidad y el uso de una clase en
particular.
o Uso adecuado: Debe incluir una descripción general, detalles de los métodos, atributos y ejemplos de uso.

Uso de Comentarios:
 Comentarios de una Línea:
// Este es un comentario de una línea en Java
 Comentarios de Múltiples Líneas:
/*
* Este es un comentario
* de múltiples líneas en Java
*/
 Comentarios para Javadoc:
/**
* Descripción detallada de la clase o método.
* Puede incluir etiquetas Javadoc específicas.
*/

Para generar comentarios JavaDoc se utiliza los siguientes elementos clave:

● /** */: Este comentario especial se coloca encima de la declaración de la clase o método y es reconocido
por la herramienta Javadoc.
● @author: Indica el autor de la clase o del método.
● @version: Especifica la versión de la clase o del método.
Elementos clave para variables, en constructores y métodos.

● @param: Se utiliza para describir un parámetro de un método.


● @return: Se utiliza para describir el valor de retorno de un método.

Para generar el JavaDoc en eclipse, botón derecho, export, JavaDoc

Alternativas a Comentarios Directos:


1. Documentación Inline:
o Colocar información directamente en el código.

// La función suma dos números


int sum(int a, int b) {
return a + b;
}

1. Documentación Externa:
o Utilizar documentos externos, como archivos README o documentos de diseño, para explicar el propósito y
uso general del código.

Documentación de Clases (Ejemplo con Javadoc en Java):


import java.util.ArrayList;

import java.util.List;

/**

* La clase GestorProyectos representa un sistema para gestionar proyectos. Permite la creación, modificación y visualización de
proyectos.

* @author Tu Nombre

* @version 1.0

*/

public class GestorProyectos {

/**

* Lista que almacena los proyectos gestionados por el sistema.

*/

private List<Proyecto> listaProyectos;

/**

* Constructor de la clase GestorProyectos. Inicializa la lista de proyectos.

*/
public GestorProyectos() {

this.listaProyectos = new ArrayList<>();

/**

* Agrega un nuevo proyecto al sistema.

* @param nuevoProyecto El proyecto que se va a agregar.

*/

public void agregarProyecto(Proyecto nuevoProyecto) {

this.listaProyectos.add(nuevoProyecto);

/**

* Busca un proyecto por su nombre en el sistema.

* @param nombre Nombre del proyecto a buscar.

* @return El proyecto encontrado o null si no se encuentra.

*/

public Proyecto buscarProyectoPorNombre(String nombre) {

for (Proyecto proyecto : listaProyectos) {

if (proyecto.getNombre().equals(nombre)) {

return proyecto;

return null;

}
/**

* Modifica la descripción de un proyecto existente.

* @param nombre Nombre del proyecto a modificar.

* @param nuevaDescripcion Nueva descripción para el proyecto.

* @return true si la modificación fue exitosa, false si el proyecto no fue encontrado.

*/

public boolean modificarDescripcionProyecto(String nombre, String nuevaDescripcion) {

for (Proyecto proyecto : listaProyectos) {

if (proyecto.getNombre().equals(nombre)) {

proyecto.setDescripcion(nuevaDescripcion);

return true;

return false;

/**

* Muestra la lista completa de proyectos en el sistema.

*/

public void mostrarListaDeProyectos() {

System.out.println("Lista de Proyectos:");

for (Proyecto proyecto : listaProyectos) {

System.out.println(proyecto);

// Otros métodos de gestión de proyectos pueden ir aquí...

Ejercicio: dadas las siguientes clases java, crear un package con vuestros datos nombre.apellido1.apellido2, declara el package dentro de
la clase y realiza los comentarios JavaDoc, genera después la documentación JavaDoc. Para generar el JavaDoc en eclipse, botón
derecho, export, JavaDoc. Después sube las clases al repositorio SVN del profesor, https://172.30.105.11/svn/repo

Análisis y Diseño Orientado a Objetos. Elaboración de diagramas


de clases:
El diagrama de clases es uno de los diagramas incluidos en UML 2.5 clasificado dentro de los diagramas de
estructura y, como tal, se utiliza para representar los elementos que componen un sistema de información desde
un punto de vista estático.y Video
Es importante destacar que, por esta misma razón, este diagrama no incluye la forma en la que se comportan a lo
largo de la ejecución los distintos elementos, esa función puede ser representada a través de un diagrama de
comportamiento, como por ejemplo un diagrama de secuencia o un diagrama de casos de uso.

El diagrama de clases es un diagrama puramente orientado al modelo de programación orientado a objetos, ya


que define las clases que se utilizarán cuando se pase a la fase de construcción y la manera en que se relacionan
las mismas. Se podría equiparar, salvando las distancias, al famoso diagrama de modelo Entidad-Relación (E/R),
no recogido en UML, tiene una utilidad similar: la representación de datos y su interacción. Ambos diagramas
muestran el modelo lógico de los datos de un sistema.

Elementos de un diagrama de clases


El diagrama UML de clases está formado por dos elementos: clases, relaciones e interfaces.

Clases

Las clases son el elemento principal del diagrama y representa, como su nombre indica, una clase dentro del
paradigma de la orientación a objetos. Este tipo de elementos normalmente se utilizan para representar
conceptos o entidades del «negocio». Una clase define un grupo de objetos que comparten características,
condiciones y significado. La manera más rápida para encontrar clases sobre un enunciado, sobre una idea de
negocio o, en general, sobre un tema concreto es buscar los sustantivos que aparecen en el mismo. Por poner
algún ejemplo, algunas clases podrían ser: Animal, Persona, Mensaje, Expediente… Es un concepto muy amplio
y resulta fundamental identificar de forma efectiva estas clases, en caso de no hacerlo correctamente se
obtendrán una serie de problemas en etapas posteriores, teniendo que volver a hacer el análisis y perdiendo
parte o todo el trabajo que se ha hecho hasta ese momento.

Bajando de nivel una clase está compuesta por tres elementos: nombre de la clase, atributos, funciones. Estos
elementos se incluyen en la representación (o no, dependiendo del nivel de análisis).

Para representar la clase con estos elementos se utiliza una caja que es dividida en tres zonas utilizando para ello
lineas horizontales:

● La primera de ellas se utiliza para el nombre de la clase. En caso de que la clase sea abstracta se utilizará su
nombre en cursiva.

● La segunda, por otra parte, se utiliza para escribir los atributos de la clase, uno por línea y utilizando el
siguiente formato:

visibilidad nombre_atributo : tipo = valor-inicial { propiedades }

Aunque esta es la forma «oficial» de escribirlas, es común simplificando únicamente poniendo el nombre y el
tipo o únicamente el nombre.

● La última de las zonas incluye cada una de las funciones que ofrece la clase. De forma parecida a los
atributos, sigue el siguiente formato:
visibilidad nombre_funcion { parametros } : tipo-devuelto { propiedades }

De la misma manera que con los atributos, se suele simplificar indicando únicamente el nombre de la función y,
en ocasiones, el tipo devuelto.

Tanto los atributos como las funciones incluyen al principio de su descripción la visibilidad que tendrá. Esta
visibilidad se identifica escribiendo un símbolo y podrá ser:

● (+) Pública. Representa que se puede acceder al atributo o función desde cualquier lugar de la aplicación.

● (-) Privada. Representa que se puede acceder al atributo o función únicamente desde la misma clase.

● (#) Protegida. Representa que el atributo o función puede ser accedida únicamente desde la misma clase o
desde las clases que hereden de ella (clases derivadas).

En caso de que un atributo o función sea estático, se representa en el diagrama subrayando su nombre. Una
característica estática se define como aquella que es compartida por cada clase y no instanciada para cada uno
de los objetos de esa clase. Es un concepto muy común.

Un ejemplo de clase podría ser el siguiente:

Ejemplo de notación de una clase

Relaciones

Una relación identifica una dependencia. Esta dependencia puede ser entre dos o más clases (más común) o una
clase hacía sí misma (menos común, pero existen), este último tipo de dependencia se denomina dependencia
reflexiva. Las relaciones se representan con una linea que une las clases, esta línea variará dependiendo del tipo
de relación

Relación reflexiva

Las relaciones en el diagrama de clases tienen varias propiedades, que dependiendo la profundidad que se quiera
dar al diagrama se representarán o no. Estas propiedades son las siguientes:

● Multiplicidad. Es decir, el número de elementos de una clase que participan en una relación. Se puede
indicar un número, un rango… Se utiliza n o * para identificar un número cualquiera.
● Nombre de la asociación. En ocasiones se escribe una indicación de la asociación que ayuda a entender la
relación que tienen dos clases. Suelen utilizarse verbos como por ejemplo: «Una empresa contrata a n
empleados»

Ejemplo de relación Empresa-Empleado

Tipos de relaciones

Un diagrama de clases incluye los siguientes tipos de relaciones:

● Asociación.
● Agregación.
● Composición.
● Dependencia.
● Herencia.

Asociación

Este tipo de relación es el más común y se utiliza para representar dependencia semántica. Se representa con
una simple linea continua que une las clases que están incluidas en la asociación.

Un ejemplo de asociación podría ser: «Una mascota pertenece a una persona».


Ejemplo de asociación

Agregación

Es una representación jerárquica que indica a un objeto y las partes que componen ese objeto. Es decir,
representa relaciones en las que un objeto es parte de otro, pero aun así debe tener existencia en sí mismo.

Se representa con una línea que tiene un rombo en la parte de la clase que es una agregación de la otra clase (es
decir, en la clase que contiene las otras).

Un ejemplo de esta relación podría ser: «Las mesas están formadas por tablas de madera y tornillos o, dicho de
otra manera, los tornillos y las tablas forman parte de una mesa». Como ves, el tornillo podría formar parte de
más objetos, por lo que interesa especialmente su abstracción en otra clase.

Ejemplo de agregación

Composición

La composición es similar a la agregación, representa una relación jerárquica entre un objeto y las partes que lo
componen, pero de una forma más fuerte. En este caso, los elementos que forman parte no tienen sentido de
existencia cuando el primero no existe. Es decir, cuando el elemento que contiene los otros desaparece, deben
desaparecer todos ya que no tienen sentido por sí mismos sino que dependen del elemento que componen.
Además, suelen tener los mismos tiempo de vida. Los componentes no se comparten entre varios elementos,
esta es otra de las diferencias con la agregación.

Se representa con una linea continua con un rombo relleno en la clase que es compuesta.

Un ejemplo de esta relación sería: «Un vuelo de una compañía aerea está compuesto por pasajeros, que es lo
mismo que decir que un pasajero está asignado a un vuelo»

Ejemplo de composición

Dependencia

Se utiliza este tipo de relación para representar que una clase requiere de otra para ofrecer sus funcionalidades.
Es muy sencilla y se representa con una flecha discontinua que va desde la clase que necesita la utilidad de la
otra flecha hasta esta misma.

Un ejemplo de esta relación podría ser la siguiente:

Ejemplo de dependencia

Herencia
Otra relación muy común en el diagrama de clases es la herencia. Este tipo de relaciones permiten que una
clase (clase hija o subclase) reciba los atributos y métodos de otra clase (clase padre o superclase). Estos
atributos y métodos recibidos se suman a los que la clase tiene por sí misma. Se utiliza en relaciones «es un».

Un ejemplo de esta relación podría ser la siguiente: Un pez, un perro y un gato son animales.

Ejemplo de herencia

En este ejemplo, las tres clases (Pez, Perro, Gato) podrán utilizar la función respirar, ya que lo heredan de la clase
animal, pero solamente la clase Pez podrá nadar, la clase Perro ladrar y la clase Gato maullar. La clase Animal
podría plantearse ser definida abstracta, aunque no es necesario.

Interfaces

Una interfaz es una entidad que declara una serie de atributos, funciones y obligaciones. Es una especie de
contrato donde toda instancia asociada a una interfaz debe de implementar los servicios que indica aquella
interfaz.

Dado que únicamente son declaraciones no pueden ser instanciadas.

Las interfaces se asocian a clases. Una asociación entre una clase y una interfaz representa que esa clase cumple
con el contrato que indica la interfaz, es decir, incluye aquellas funciones y atributos que indica la interfaz.

Su representación es similar a las clases, pero indicando arriba la palabra <<interface>>.


Notación de interfaz

Cómo dibujar un diagrama de clases


Los diagramas de clase van de la mano con el diseño orientado a objetos. Por lo tanto, saber lo básico de este
tipo de diseño es una parte clave para poder dibujar diagramas de clase eficaces.

Este tipo de diagramas son solicitados cuando se está describiendo la vista estática del sistema o sus
funcionalidades. Los pasos a seguir para construir estos diagramas son los siguientes:

● Identificar los nombres de las clase


El primer paso es identificar los objetos primarios del sistema. Las clases suelen corresponder a sustantivos
dentro del dominio del problema.
● Distinguir las relaciones
El siguiente paso es determinar cómo cada una de las clases u objetos están relacionados entre sí. Busca
los puntos en común y las abstracciones entre ellos; esto te ayudará a agruparlos al dibujar el diagrama de
clase.
● Crear la estructura
Primero, agrega los nombres de clase y vincúlalos con los conectores apropiados, prestando especial
atención a la cardinalidad o las herencias. Deja los atributos y funciones para más tarde, una vez que esté
la estructura del diagrama resuelta.

Ejemplo:

Representa mediante un diagrama de clases la siguiente especificación:

-Una aplicación necesita almacenar información sobre empresas, sus empleados y sus clientes.

-Empleados y clientes se caracterizan por su nombre y edad.

-Los empleados tienen un sueldo bruto.

-Los empleados que son directivos tienen una categoría y un conjunto de empleados subordinados.

-De los clientes se necesita conocer su teléfono de contacto.

-La aplicación necesita mostrar los datos de empleados y clientes.


Ejercicio 1: elaborar el diagrama de clases de la siguiente clase java.
// Clase Libro
public class Libro {
// Atributos
private String titulo;
private String autor;
private int añoPublicacion;

// Constructor
public Libro(String titulo, String autor, int añoPublicacion) {
this.titulo = titulo;
this.autor = autor;
this.añoPublicacion = añoPublicacion;
}

// Métodos getter y setter


public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {


this.titulo = titulo;
}

public String getAutor() {


return autor;
}

public void setAutor(String autor) {


this.autor = autor;
}

public int getAñoPublicacion() {


return añoPublicacion;
}
public void setAñoPublicacion(int añoPublicacion) {
this.añoPublicacion = añoPublicacion;
}
// Otros métodos
public void mostrarInformacion() {
System.out.println("Título: " + titulo);
System.out.println("Autor: " + autor);
System.out.println("Año de Publicación: " + añoPublicacion);
}
}

Ejercicio 2: Se desea diseñar un diagrama de clases sobre la información de las reservas de una empresa
dedicada al alquiler de automóviles, teniendo en cuenta que:

• Un determinado cliente puede tener en un momento dado hechas varias reservas.

• De cada cliente se desean almacenar su DNI, nombre, dirección y teléfono. Además dos clientes se diferencian
por un código único.
• Cada cliente puede ser avalado por otro cliente de la empresa.

• Una reserva la realiza un único cliente pero puede involucrar varios coches.

• Es importante registrar la fecha de inicio y final de la reserva, el precio del alquiler de cada uno de los coches,
los litros de gasolina en el depósito en el momento de realizar la reserva, el precio total de la reserva y un
indicador de si el coche o los coches han sido entregados.

• Todo coche tiene siempre asignado un determinado garaje que no puede cambiar. De cada coche se requiere la
matricula, el modelo el color y la marca.

• Cada reserva se realiza en una determinada agencia.

Ejercicio 3: Se desea diseñar un diagrama de clases de un Hotel.

• El hotel tiene un nombre y un número de estrellas. Posee tres tipos de habitaciones: sencilla, doble y suit y dos
tipos de clientes: habituales y esporádicos. Cada reserva almacena: la fecha de entrada y el número de días que
será ocupada la habitación.
• Al cliente se le toman los siguientes datos: el nombre, la dirección y
su teléfono.
• Las habitaciones tienen distinto precio y distinto número, y además es posible mostrar una foto de cada una de
ellas al cliente.
• En la habitación sencilla el cliente puede elegir si es exterior o no, en la habitación doble si la cama es de
matrimonio o sencilla y en la suit la posibilidad de bañera, sauna y mirador.
• Los clientes que son habituales reciben un trato especial, es decir, una reducción en el precio de la habitación
con respecto al cliente esporádico.
• A los esporádicos el hotel les ofrece la posibilidad de darles información sobre las ofertas.
Análisis y Diseño Orientado a Objetos. Elaboración de diagramas
de comportamiento:
● Tipos. Campo de aplicación.
● Diagramas de casos de uso. Actores, escenario, relación de comunicación.
● Diagramas de secuencia. Línea de vida de un objeto, activación, envío de mensajes.
● Diagramas de colaboración. Objetos, mensajes.
● Diagramas de actividades. Actividades, transiciones, decisiones y combinaciones.
● Diagramas de estado. Estados, eventos, señales, transiciones.

También podría gustarte