Tecnologías utilizadas
SpringBoot ofrece integración con servidores como Tomcat y Jetty, simplificando el despliegue. Su configuración automática detecta dependencias y establece componentes sin intervención manual. Herramientas como Spring Data y Spring Security se incluyen, facilitando la construcción de aplicaciones escalables.
Vue.js emplea un modelo de DOM virtual que replica la interfaz en memoria, optimizando actualizaciones. Mediante enlace reactivo de datos y arquitectura basada en componentes, los cambios en el estado se reflejan en la vista de manera eficiente, reduciendo la manipulación directa del DOM.
MyBatis-Plus extiende MyBatis con funcionalidades como generación automática de código y consultas dinámicas. Soporta múltiples bases de datos y proporciona API para operaciones ORM, minimizando la escritura de SQL manual. Incluye características como paginación y bloqueo optimista para mejorar el rendimiento.
Pruebas del sistema
Las pruebas se centraron en validar la conformidad con los requisitos funcionales y detectar defectos. Se aplicaron técnicas de caja negra, simulando interaccionse del usuario para verificar lógica de negocio y manejo de errores.
Propósito de las pruebas
El objetivo principal era garantizar la estabilidad y usabilidad del sistema. Se analizaron casos de uso comunes para identificar discrepancias entre el comportamiento esperado y el real, asegurando una experiencia de usuario confiable.
Pruebas funcionales
Se diseñaron casos de prueba para módulos críticos como autenticación y gestión de usuarios. Por ejemplo, en el inicio de sesión se evaluaron credenciales válidas, contraseñas incorrectas y campos vacíos. Los resultados mostraron mensajes de error apropiados para cada escenario.
| Datos de entrada | Resultado esperado | Resultado real | Análisis |
|---|---|---|---|
| Usuario: admin1, Clave: 123456, Captcha: válido | Acceso exitoso | Sesión iniciada correctamente | Coincide con expectativas |
| Usuario: admin1, Clave: errada, Captcha: válido | Error de credenciales | Mensaje: clave incorrecta | Coincide con expectativas |
| Usuario: vacío, Clave: 123456, Captcha: válido | Validación de campo requerido | Mensaje: ingrese usuario | Coincide con expectativas |
Para la gestión de usuarios, se verificaron operaciones CRUD, incluyendo validación de duplicados y eliminación con confirmación. Las pruebas confirmaron que el sistema manejaba adecuadamente restricciones de datos.
Conclusión de pruebas
Las pruebas demostraron que el sistema cumple con las especificaciones funcionales. Se corrigieron errores menores relacionados con la validación de entradas, mejorando la robustez general.
Ejemplo de código: autenticación
@IgnorarAuth
@PostMapping("/iniciarSesion")
public Respuesta iniciarSesion(String usuario, String clave, String captcha, HttpServletRequest solicitud) {
EntidadUsuario entidad = servicioUsuario.consultarUno(new EnvolturaEntidad<EntidadUsuario>().igual("nombre_usuario", usuario));
if (entidad == null || !entidad.getClave().equals(clave)) {
return Respuesta.error("Credenciales inválidas");
}
String ficha = servicioToken.generarFicha(entidad.getId(), usuario, "tabla_usuarios", entidad.getRol());
return Respuesta.exitosa().agregar("ficha", ficha);
}
@Override
public String generarFicha(Long idUsuario, String usuario, String tabla, String rol) {
EntidadToken fichaExistente = this.consultarUno(new EnvolturaEntidad<EntidadToken>().igual("id_usuario", idUsuario).igual("rol", rol));
String valorFicha = UtilidadComun.cadenaAleatoria(32);
Calendar calendario = Calendar.getInstance();
calendario.add(Calendar.HOUR, 1);
if (fichaExistente != null) {
fichaExistente.setValorFicha(valorFicha);
fichaExistente.setFechaExpiracion(calendario.getTime());
this.actualizarPorId(fichaExistente);
} else {
this.insertar(new EntidadToken(idUsuario, usuario, tabla, rol, valorFicha, calendario.getTime()));
}
return valorFicha;
}
Estructura de base de datos: tabla de tokens
-- Eliminar tabla si existe
DROP TABLE IF EXISTS `tokens`;
CREATE TABLE `tokens` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Identificador principal',
`id_usuario` bigint(20) NOT NULL COMMENT 'Referencia al usuario',
`nombre_usuario` varchar(100) NOT NULL COMMENT 'Nombre del usuario',
`nombre_tabla` varchar(100) DEFAULT NULL COMMENT 'Tabla asociada',
`rol` varchar(100) DEFAULT NULL COMMENT 'Rol del usuario',
`valor_token` varchar(200) NOT NULL COMMENT 'Token de autenticación',
`fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación',
`fecha_expiracion` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Fecha de expiración',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='Almacena tokens de sesión';
-- Datos de ejemplo
INSERT INTO `tokens` (`id_usuario`, `nombre_usuario`, `nombre_tabla`, `rol`, `valor_token`, `fecha_creacion`, `fecha_expiracion`)
VALUES (23, 'cd01', 'tabla_estudiantes', 'Estudiante', 'ax7yz8qm9p0r1s2t3u4v5w6x7y8z9a0', '2023-02-23 21:46:45', '2023-03-15 14:01:36');
INSERT INTO `tokens` (`id_usuario`, `nombre_usuario`, `nombre_tabla`, `rol`, `valor_token`, `fecha_creacion`, `fecha_expiracion`)
VALUES (1, 'admin', 'tabla_usuarios', 'Administrador', 'b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5', '2023-02-27 19:37:01', '2023-03-17 18:23:02');