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 if tiene 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, enum o 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.

Entradas relacionadas: