Desde nuestra experiencia no solamente como probadores de software, sino inclusive como usuarios finales, cuando un sistema no nos permite realizar cierta acción, generalmente nos muestra un mensaje , bien sea de error, o una advertencia (warning), por nombrar algunos de los más comunes. Si bien estos mensajes nos ayudan a entender como usuarios la razón por la cual el sistema nos bloquea alguna acción, también los mismos tienen una segunda misión, y es dar cobertura a uno de los criterios de la calidad de software sugeridos inclusive por el standard ISO, y modelos derivados de éste: La Auditabilidad.
La Auditabilidad hace referencia a la capacidad de generar y resguardar las trazas de las acciones realizadas en un software, y que permita diagnosticar lo ocurrido por ejemplo en situaciones de caos. Este concepto está íntimamente ligado al concepto de logs. Pero qué es un log?
Un log es un registro cronológico (generalmente portable en archivos de texto) que provee información de los eventos ocurridos en un sistema en específico y su correlación con otros eventos.
Importancia de los Logs en los sistemas
La importancia de los logs en los sistemas se puede definir desde dos perspectivas diferentes:
Usuario Final: Nuestros usuarios finales le dan a este componente, dado que un producto /desarrollo adquirido, debe poder ser soportado por el ecosistema de softwares que previamente puede poseer (partiendo que hoy día es difícil pensar en un software aislado). Es por ello que muchas compañías llevan a sus equipos de operaciones a incluir en su infraestructura herramientas de monitoreo de logs para estudiar el comportamiento de los sistemas y establecer estrategias en escenarios adversos. Entre las herramientas que facilitan la tarea de recolectar los logs en un solo lugar para su monitoreo y análisis, basados en el uso de API REST se pueden mencionar algunos de los más usados: Kibana, Loggly, Sematext.
Desarrollo y Pruebas: Si haces uso de alguna herramienta de automatización que graba print screens o videos como evidencias, quizás al momento de que nuestra prueba falla, es mucho mayor el tiempo invertido tratando de encontrar la causa y por ende solucionar el error detectado, si no se dispone de la ayuda de una batería logs robustos, con los que podamos obtener mayor feedback de nuestras ejecuciones.
Tipos de Eventos de Logs
En general no existe un estándar para la generación y gestión de los logs de un sistema. Sin embargo, por lo general un registro de log considera los siguientes tipos de eventos:
Tipo de Evento | Descripción |
Información | Un evento que describe la operación exitosa de una tarea, como una aplicación, controlador o servicio. Por ejemplo, se registra un evento de información cuando el sistema reconoce un dispositivo externo. |
Advertencia | Un evento que no es necesariamente significativo puede indicar la posible aparición de un problema futuro. Por ejemplo, se registra un mensaje de advertencia cuando la batería del equipo se está agotando. |
Error | Un evento que indica un problema significativo, como pérdida de datos o pérdida de funcionalidad. Por ejemplo, si un servicio no levanta durante el inicio, se registra un evento de error |
Depuración | Un evento que indica la posible causa de un evento inesperado, generalmente de mayor utilidad en fases de desarrollo |
Registro exitoso (Registro de Seguridad) | Un evento que describe la finalización exitosa de un evento de seguridad. Por ejemplo, se registra un evento de auditoría de éxito cuando un usuario inicia sesión. |
Registro Fallido (Registro de Seguridad) | Un evento que describe un evento de seguridad que no se completó correctamente. Por ejemplo, se puede registrar un registro de fallas cuando un usuario no puede acceder a un recurso (archivo por ejemplo). |
Estructura de un Log de sistema
Un log maneja una estructura incluye por lo general los siguientes datos:
- Time-stamp: información sobre el momento en que se ha producido el evento; fecha, hora, minuto y segundo.
- Categoría: Describe la clasificación del evento (información, error, advertencia, registro exitoso, registro fallido).
- Descripción: Comprende información sobre el evento o condición específica.
- ID del evento: un número de evento que permite identificar el tipo de evento, y que ayudará a conocer más del evento. Teniendo en mente las anteriores definiciones, y considerando la importancia que tienen los logs de un sistema para el equipo de desarrollo como para el usuario final, resulta interesante plantearnos algunas bases para incluir en nuestra estrategia la prueba de logs.
Un enfoque para incluir logs en tus pruebas
Lo primero, es idear el diseño de nuestras pruebas. Para ello tenemos a disposición una de las estrategias más utilizadas en desarrollo, el lenguaje BDD (Behavior Driven Development, Desarrollo Dirigido por Comportamiento). resulta ideal escribir nuestras pruebas en el formato ‘Given-When-Then’, persiguiendo como objetivo probar los siguientes aspectos:
+ Ocurrencia de eventos esperados en condiciones específicas, bajo la categoría correcta (error , advertencia ó información).
+ Fácil ubicación de ID del evento.
Un ejemplo de una prueba escrita en formato BDD para probar un tipo de log específico podría ser el siguiente, en el contexto, por ejemplo de un sistema de creación de actividades y tareas de proyectos:
- Given I as user create a new activity entry
- And Save the changes
- When I review the console log
- Then I should view a Info event with ID
Herramientas que facilitan las pruebas de Logs
A un nivel de pruebas unitaria, muchos framework tienen incluidas librerías muy útiles no solo para probar los logs de un desarrollo mediante el uso de “asserts”.
Además también existen frameworks diseñados específicamente para probar logs, que permiten también crear nuestros propios logs que facilitarán el monitoreo del flujo de las pruebas en el framework de prueba seleccionado.
Es importante destacar que la mayoría de éstas herramientas utilizan como base la definición de niveles de logs, mencionados en el apartado de Tipos de Logs, con sus respectivas variantes, y además, en su mayoría trabajan basados en API REST.
Apache Log4j: es un Framework Open Source que se integra también con Selenium y Appium, y permite generar la trazabilidad de logs de tus pruebas automatizadas, y escribirlos en el destino que lo configures (generalmente en la consola ó archivo de texto).
LogCapture: Frameworks de pruebas unitarias como por ejemplo Nunit, a través de su atributo Testfixture, permiten designar una clase como LogCapture para capturar y evaluar mediante asserts si los mensajes de logs son correctos de acuerdo a lo esperado.(ver Textfixtutre). Python por ejemplo tiene su paquete de “logging”, pero para facilitar la captura de estos logs hace uso de Testfixture.
Logback en combinación con SLF4J: Es framework Open Source diseñado para pruebas de logs, que se puede integrar perfectamente como dependencias en el Maven de tu proyecto: (Ver LogBack ). Trabaja en combinación con el API SLF4J (The Simple Logging Facade for Java) que permite entre otras cosas cambiar a cualquier otro framework de pruebas de logs fácilmente (ver SLF4J) propios logs y añadirlos a tus pruebas. Entre las cuales se pueden mencionar:
LogCat: En frameworks de desarrollo móvil como Android por ejemplo, posee su sección LogCat que permite ver y evaluar los logs del sistema y crear mensajes de logs, que son de mucha utilidad en fases de desarrollo y pruebas de la App.
La invitación es a considerar incluir en nuestras pruebas una batería de logs robusta para facilitar la detección y corrección de fallas en nuestras ejecuciones, además de considerar los logs que naturalmente nos facilita nuestro framework de trabajo. La combinación de ambas entradas (logs de sistema y logs construidos a la medida de nuestro flujo de desarrollo y/o pruebas) nos facilitarán en gran medida el monitoreo del comportamiento de nuestras ejecuciones.
Con 💙
💻María Gabriela Tenreiro