Fundamentos de Desarrollo de Software: Persistencia, Testing y Control de Versiones
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 4,82 KB
Persistencia de Datos en Java
Para gestionar la persistencia, utilizamos EntityManagerFactory y EntityManager:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("control");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// Operaciones...
em.close();
emf.close();Ejemplo de entidad y persistencia:
public Persona() {}
public Persona(String nombre, String dni) {
this.nombre = nombre;
this.dni = dni;
}
// ...
em.persist(p1);
@Enumerated(EnumType.STRING)Uso de PreparedStatement para consultas seguras:
PreparedStatement pstmt = conn.prepareStatement(query); // consulta con ?
pstmt.setInt(1, 1); // mete un int en el primer ?
pstmt.setString(2, "Carlos"); // mete texto en el segundo ?
pstmt.executeUpdate(); // INSERT, UPDATE, DELETE
ResultSet rs = pstmt.executeQuery(); // SELECT
rs.next(); // pasa a la siguiente fila
rs.getInt("id");Estrategias de Testing
Tipos de Pruebas
- Unitaria: Prueba una función o clase de forma aislada.
- Integración: Prueba varias partes del sistema trabajando juntas.
- Regresión: Comprueba que el sistema sigue funcionando tras cambios en el código.
- Rendimiento: Mide la velocidad y el comportamiento bajo carga.
- Usabilidad: Evalúa la facilidad de uso para el usuario final.
Técnicas de Diseño de Pruebas
- Clases de equivalencia y límites: Si la edad válida es 16 a 65, probamos: 15 (rechazado), 16 (aceptado), 65 (aceptado), 66 (rechazado). “Divido en válidos e inválidos y pruebo los bordes”.
- Caja blanca: Análisis de estructuras de control (if/else). Con
&&todas deben cumplirse; con||basta una verdadera. - Complejidad ciclomática: Se calcula como decisiones + 1. Un
iftiene complejidad 2 (camino verdadero y falso).
JUnit y Debugging
Un caso de prueba debe incluir: objetivo, pasos, datos, resultado esperado, resultado obtenido y estado.
assertEquals(11, calc.sumar(9,2));: Primero el valor esperado, luego el obtenido.assertTrue(condicion);: Verifica una condición booleana.assertThrows(ArithmeticException.class, () -> calc.dividir(5,0));: Comprueba excepciones.
Debug: Breakpoint (pausa), Step Into (entra en método), Step Over (ejecuta sin entrar), Step Out (sale), Continue (sigue hasta el siguiente breakpoint).
Dobles de prueba: Dummy (relleno), Stub (devuelve fijo), Mock (comprueba llamadas), Spy (registra llamadas), Fake (versión funcional simple).
Refactorización y Calidad de Código
Refactorizar es mejorar el código internamente sin alterar su comportamiento externo. La deuda técnica surge al priorizar la rapidez sobre la calidad, complicando el mantenimiento futuro.
Code Smells Comunes
- Método largo: Aplicar Extract Method.
- Código duplicado: Extraer lógica a un método común.
- Clase grande: Aplicar Extract Class para separar responsabilidades.
- Muchos parámetros: Agrupar datos en un objeto o clase.
- Muchos
if/else: Usar polimorfismo,enumo métodos separados.
Nota: Las pruebas aseguran que el comportamiento no ha cambiado tras modificar la estructura interna.
Análisis Estático y Control de Versiones
El analizador estático (ej. SonarQube) revisa el código sin ejecutarlo para detectar errores, código muerto y vulnerabilidades.
Comandos Git Esenciales
git init: Crea repositorio.git clone: Copia un repositorio remoto.git add ./git commit: Prepara y guarda cambios locales.git push/git pull: Sincroniza con el remoto.git fetch: Descarga cambios sin integrar.git branch/git checkout: Gestión de ramas.
Git Flow
main (producción), develop (integración), feature (nuevas funciones), hotfix (arreglos urgentes). Los Pull Requests permiten revisar el código antes de fusionar.