Blog

¿Cómo automatizar el envío y recibo de correos electrónicos en pruebas de rendimiento?

¿Sabías que los correos electrónicos pueden definir el éxito de un sistema bajo carga?  Descubre cómo redefinimos la automatización de correos en flujos críticos, optimizamos los tiempos de respuesta y logramos precisión mientras maximizamos la eficiencia.

Imagen: Unsplash - ¿Cómo automatizar el envío y recibo de correos electrónicos en pruebas de rendimiento?

En proyectos de pruebas de rendimiento, la automatización del envío y recepción de correos electrónicos puede parecer una tarea secundaria o incluso prescindible. Sin embargo, cuando estos procesos forman parte de un flujo crítico dentro de un sistema, su evaluación se convierte en una pieza clave para optimizar el rendimiento bajo condiciones reales de uso

En este artículo, profundizamos en un caso práctico desarrollado para el sistema educativo público de Uruguay, en el cual enfrentamos diversos desafíos técnicos y logramos soluciones innovadoras que podrían servir de guía para otros equipos.

¿Necesitas apoyo con pruebas de rendimiento? Chequea nuestros servicios personalizados y contáctanos.

La importancia de automatizar correos electrónicos en pruebas de rendimiento

¿Por qué dedicar esfuerzos a este aspecto y cuándo? Es relevante automatizar el envío y recibo de correos electrónicos en pruebas de rendimiento cuando estos procesos forman parte de un flujo que completan las personas en un sistema y que se considera crítico para la organización.

Estos procedimientos son claves porque tales valores son requeridos para completar una solicitud (por ejemplo, la inscripción en un sistema). Poder probar este flujo y medir elementos claves, como el tiempo de entrega del mensaje, resulta imprescindible para tomar decisiones informadas en busca de su optimización.

Este tipo de análisis es vital en escenarios donde el servicio debe soportar altas demandas, ya que permite que los tiempos de espera y validación sean adecuados para la experiencia del usuario final.

Ejemplo de automatización de correos en pruebas de rendimiento

Un ejemplo práctico fue el flujo de inscripción para nivel inicial y primer grado de primaria en el sistema educativo uruguayo. El proceso requería que las personas que deseaban realizar inscripciones escolares ingresaran datos personales y una dirección de correo electrónico válida. 

Posteriormente, el sistema enviaba un código que debía ser verificado en un tiempo límite de 10 minutos. Esto implicaba medir, por un lado, la generación y envío del correo y, por otro, la rapidez con la que este mensaje llegaba a la bandeja de entrada de las personas solicitantes.

¿Qué implica automatizar correos electrónicos?

mujer chequeando su correo en una tablet

En términos generales, la automatización de correos electrónicos para pruebas de rendimiento consiste en:

  • Automatizar la acción del usuario que provoca el envío del correo.
  • Capturar ese mensaje en una dirección válida de correo electrónico.
  • Extraer información relevante, como un código de validación.
  • Continuar con el flujo automatizado para validar esa información.

Aunque estos pasos parecen sencillos, la implementación puede ser compleja, especialmente cuando se manejan grandes volúmenes de usuarios simultáneos. 

En el caso de nuestro proyecto de inscripción escolar, no se trataba de envíos masivos en los cuales fuera posible enviar comunicaciones idénticas a cientos o miles de personas, sino de un flujo en el que el sistema debía procesar información y enviar un código único para cada solicitud individual. 

Dado que para la puesta en producción se esperaba un alto volumen de solicitudes, en comparación con la demanda usual que recibe el sistema, estimamos una carga objetivo de 2000 usuarios virtuales en 30 minutos. Esto implicaba que el servicio requería generar aproximadamente 67 correos por minuto para satisfacer la demanda esperada.

Exclusión del servidor de correo: ¿por qué y cuándo?

En las pruebas de rendimiento, es común excluir la evaluación directa del servidor de correo electrónico dado que la mayoría de las veces es un servicio gestionado de manera externa. Esta exclusión se lleva a cabo emulando las respuestas esperadas para evitar posibles impactos en la infraestructura o en servicios tercerizados. 

En palabras simples, esto significa que cuando vamos a probar un sistema debemos tener en cuenta la infraestructura, es decir la comunicación que se establece entre los distintos componentes.

El servidor de correo electrónico es el que se encarga de la generación y envío de los mensajes pero no siempre está dentro del alcance del proyecto. Por ejemplo, si el servidor de correo es administrado externamente, puede que no sea factible coordinar con su equipo su disponibilidad durante las pruebas.

No siempre las terceras partes se encuentran en condiciones de colaborar o que sus recursos sean impactados, e incluso puede suceder que las pruebas afecten a otros clientes que no tienen relación ninguna con el proyecto que está desarrollando pruebas de rendimiento. Por este motivo, la comunicación, transparencia y coordinación de mutuo acuerdo son cruciales. 

Otra solución que se emplea en ocasiones cuando se necesita impactar ciertos componentes que son críticos es ejecutar las pruebas en los horarios de menor demanda, como por ejemplo durante la noche o madrugada.

Cuando no está dentro del alcance o por alguna razón no se puede incluir en las pruebas, se excluye el servidor de correo. 

Sin embargo, en nuestro proyecto de pruebas de rendimiento del sistema para inscripción escolar, excluir el servidor no era viable porque necesitábamos determinar el tiempo que le tomaba al mensaje llegar a la bandeja de entrada del usuario, con el fin de comprobar si el período definido inicialmente era adecuado. 

Esto implicaba impactar directamente el servidor de correo electrónico, servicio proporcionado por AWS, dentro de la infraestructura de prueba.

Nuestra solución para automatizar correos electrónicos en las pruebas de rendimiento

computador negro

Dado que el Mail Reader Sampler de JMeter permite acceder a los mensajes de la bandeja de entrada de un correo electrónico pero precisa procesar todo el contenido de ella, optamos por utilizar un JSR223 Sampler con Groovy para poder acceder específicamente al mensaje deseado. Esto nos permitió evitar demoras y operaciones innecesarias.  

Imagen que muestra la lógica desarrollada. Implementación generada con lenguaje Groovy en un JSR223 Sampler para capturar el código.

Imagen que muestra la lógica desarrollada. Implementación generada con lenguaje Groovy en un JSR223 Sampler para capturar el código. 

Para llegar a la solución descrita, fue necesario tomar varios aspectos en consideración, como la disponibilidad de cuentas, servicios de correo electrónico valorados y  protocolos de comunicación.

Disponibilidad de cuentas

En condiciones ideales, se debería tener una cuenta de correo electrónico para cada usuario a simular. Sin embargo, dado que en nuestro caso eran 3780 las personas que debían completar el flujo y no contábamos con esa cantidad de buzones disponibles, tuvimos que contemplar otras opciones que explicaremos en la sección de desafíos superados.

Servicios de correo electrónico valorados y protocolos de comunicación

Una de las opciones evaluadas fue Yopmail, por medio de la que se podían crear tantas direcciones como fuese necesario. Sin embargo, no conseguimos establecer conexión a través de los protocolos disponibles, por lo que decidimos descartarla.

Algo similar nos sucedió con Yahoo, por lo cual comprendimos que era indispensable contar con un proveedor de correo electrónico que fuese capaz de satisfacer los requisitos identificados, crear una o varias cuentas de correo electrónico para manejar los mensajes y lograr la conexión a la o las cuentas a través de los protocolos POP3 o IMAP.

Tomando en consideración el análisis anterior, observamos que Gmail era la alternativa más viable. Llevamos a cabo la conexión a Gmail a través del protocolo IMAP y habilitamos el acceso en cada cuenta por medio de esta especificación desde la configuración.

Desafíos durante la automatización

Durante el desarrollo de esta solución, nos enfrentamos a diversos desafíos técnicos, cada uno con una solución específica que permitió avanzar en el desarrollo de las pruebas.

A continuación, compartimos estos desafíos y cómo los resolvimos, con el objetivo de que puedas utilizarlo como guía para automatizar el envío y recibo de correos electrónicos en pruebas de rendimiento.

Desafío N°1: Autenticación segura en Gmail

Error observado: Authentication failed - Invalid credentials (Failure).

Vista del error que aparece cuando con la contraseña regular de la cuenta no se permite la conexión

El primer inconveniente con el que nos encontramos fue que la autenticación desde JMeter fallaba, a pesar de que las credenciales empleadas eran correctas. Esto se debía a que, desde hace algún tiempo, Gmail ya no permite el acceso de las aplicaciones menos seguras.

Nuestra solución: 

Decidimos habilitar la autenticación de 2 factores y crear una contraseña de aplicación que permitiera la conexión desde JMeter.

Desafío N°2: Protocolos de seguridad deshabilitados

Error observado: No appropriate protocol (protocol is disabled or cipher suites are inappropriate).

Vista del error que aparece cuando los algoritmos de seguridad de la capa de transporte están deshabilitados

Otro inconveniente que fue necesario solucionar estuvo relacionado con los algoritmos de seguridad de la capa de transporte en el entorno de desarrollo de Java. Estos algoritmos vienen deshabilitados por defecto y, para este caso, era preciso que no lo estuvieran.

Nuestra solución: 

Ajustamos las configuraciones en las generadoras de carga donde ejecutamos las pruebas. Para lograrlo,  editamos el archivo java.security en el área de seguridad de la estructura de directorios del entorno de desarrollo de Java y eliminamos elementos como TLSv1.0, TLSv1.1, DTSLv1.0, de los algoritmos inutilizados (deshabilitados por defecto) descritos en la línea jdk.tls.disabledAlgorithms.

Desafío N°3:  Identificación única de usuarios virtuales

Sin dudas, otros de los principales retos fue identificar el código que correspondía a cada usuario en particular, pues a una misma cuenta de Gmail llegaban correos con el código de validación de distintos usuarios virtuales casi simultáneamente. 

Nuestra solución: 

Para resolverlo, empleamos alias de las direcciones de correo electrónico originales seguidas del nombre y apellido ficticios del usuario simulado.  Por ejemplo, si el usuario de nombre n y apellido r recibía el código en la dirección electrónica [email protected], este era enviado a [email protected]

Esto nos permitió diferenciar entre el gran número de mensajes enviados,  el perteneciente a cada usuario, además de simplificar la captura de la información apropiada. 

Algo que fue crucial en nuestra estrategia de identificación es que algunos servicios de correo como Gmail posibilitan la inclusión de contenido en una dirección electrónica luego de un signo de más (+) sin afectarla ni alterar la entrega de la comunicación.

Desafío N°4:  Conexiones simultáneas en Gmail

Error observado:  Too many simultaneous connections (Failure).

Vista del error que aparece cuando existen demasiadas conexiones a una cuenta de Gmail a través del protocolo IMAP

Cuando llegamos al punto de manejar concurrencia de usuarios, se presentó una nueva dificultad, relacionada con la cantidad de conexiones que permite Gmail a través del protocolo IMAP. 

Nuestra solución:

Aumentamos el número de cuentas de correo electrónico que inicialmente se había determinado en 2, primero a 5 y finalmente a 10. Nuestro objetivo era  distribuir los accesos y conexiones, con el fin de respetar el límite y evitar el fallo.

Desafío N°5:  Optimización de bandejas de entrada

Identificamos la necesidad de que las bandejas de entrada de las cuentas se mantuvieran lo más ligeras posible porque, dado el volumen de notificaciones recibidas, se veía afectada la capacidad de procesamiento y se elevaban los tiempos de respuesta.

Captura de pantalla. Vista de configuración en Gmail donde se muestra la creación de un filtro de ejemplo.

Vista de configuración en Gmail donde se muestra la creación de un filtro de ejemplo

Nuestra solución:

Creamos un filtro en la configuración de cada cuenta, con la estructura que Gmail ofrece para hacerlo. Estos filtros se encargaron de eliminar automáticamente otras notificaciones que eran recibidas como consecuencia de la conclusión exitosa de otro de los flujos automatizados para las pruebas. 

Luego, ajustamos a nivel de script para que, una vez obtenido el código, su mensaje correspondiente fuese eliminado.

Desafío N°6: Medición precisa de tiempos de entrega

Necesitábamos medir el tiempo que tardaba cada mensaje en estar disponible en la bandeja de entrada del usuario una vez ejecutada la acción que permitiría enviar el código desde el servidor.

Código generado con lenguaje Groovy en postprocesadores JSR223 Sampler para calcular el intervalo que toma la captura del código.

Código generado con lenguaje Groovy en postprocesadores JSR223 Sampler para calcular el intervalo que toma la captura del código

Nuestra solución:

Utilizamos postprocesadores JSR223 con lenguaje Groovy para registrar las horas en que se llamó al servicio y fue extraído el código, respectivamente. Luego medimos la diferencia entre estas horas.

Nuestro objetivo era lograr recoger el valor y tener sus percentiles para poder establecer el comportamiento que experimentarían los usuarios. 

Con este fin, utilizamos un Dummy Sampler. El tiempo de respuesta asignado sería el período registrado. Previamente, guardamos ese valor en una variable y además, deshabilitamos la opción de simularlo para prevenir retardos innecesarios en el flujo.

Captura de pantalla: Vista de configuración del Dummy Sampler en JMeter.

Vista de configuración del Dummy Sampler en JMeter

Aprendizajes sobre automatización de correos en pruebas de rendimiento

El caso compartido demuestra que abordar la automatización de correos electrónicos en pruebas de rendimiento puede revelar retos inesperados, pero también abre puertas a soluciones creativas y eficientes. 

Si tu equipo enfrenta desafíos similares, esperamos que este ejemplo sea una fuente de inspiración y una guía práctica.

En nuestro caso, los resultados demostraron que los tiempos de respuesta fueron consistentes y dentro del margen esperado. El tiempo que tardaron los mensajes en estar disponibles en las bandejas de entrada fue significativamente menor al período de vigencia del código, lo cual validó la configuración inicial. 

Cabe destacar que, de distintas formas, el trabajo llevado adelante durante el proyecto implicó la realización de ajustes constantes, utilización de soluciones alternativas y adopción de enfoques creativos para resolver diferentes desafíos que fueron apareciendo.

La experiencia dejó en claro que lo ideal hubiera sido disponer de un buzón de correo electrónico independiente para cada usuario virtual que habría de participar en las pruebas, con el objetivo de evitar complejidades. 

Esta estrategia incrementa el realismo de los escenarios a simular a la vez que mitiga algunas situaciones. Por ejemplo, el procesamiento adicional que fue necesario desarrollar para correlacionar cada mensaje con su respectivo usuario, así como la implementación de mecanismos para filtrar y eliminar los correos ya procesados. 

Además, es válido puntualizar que, en ocasiones, pueden existir reglas que prevengan el envío masivo de comunicaciones a una misma cuenta de correo electrónico para evitar cualquier tipo de abuso o spam, así como por razones de seguridad. 

En este caso, consideramos que es conveniente conciliar entre los diferentes equipos para, por ejemplo, suspender estas reglas mientras se ejecutan las pruebas y volver a habilitarlas al concluir.

Cómo podemos ayudarte

Con más de 16 años de experiencia y presencia global, Abstracta es una empresa líder en soluciones tecnológicas, especializada en servicios de pruebas de software y desarrollo de software impulsado por IA.

En Abstracta, implementamos las métricas DORA adaptadas a las necesidades específicas de tu equipo y proyectos. Nuestro enfoque abarca desde la configuración de herramientas hasta la optimización continua, con foco en que cada métrica aporte valor tangible a tu negocio. Además, integramos inteligencia artificial y prácticas avanzadas de DevOps, con el fin de crear un entorno ágil y eficiente. 

Creemos que construir vínculos sólidos nos impulsa a avanzar y a mejorar el software que desarrollamos. Es por eso que hemos forjado alianzas estratégicas con líderes de la industria tales como  Microsoft, Datadog, Tricentis y Perforce, e incorporamos tecnologías de vanguardia como parte de nuestros servicios.

Contáctanos para conversar sobre cómo podemos ayudarte a hacer crecer tu negocio.

Imagen ilustrativa de Abstracta - Contáctanos

¡Síguenos en LinkedIn, X, Facebook, Instagram y YouTube para ser parte de nuestra comunidad!

Artículos recomendados

Métricas DORA en DevOps: Maximiza tu rendimiento en TI

Abstracta Copilot: La revolución en pruebas de software con IA

Auto Playwright: transformando la automatización de pruebas con IA

263 / 263