Los requisitos funcionales de una aplicación basada en web o un portal web suelen ser claros y fácilmente comprobables, exceptuando en los procesos más complejos. Sin embargo, las propiedades no funcionales siempre resultan más difíciles de testear y validar.
¿Cuántos usuarios concurrentes pueden usarla sin afectar el rendimiento?, ¿qué sucede cuando los usuarios aumentan demasiado?, ¿qué sucede cuando una pieza redundante de la solución se cae?
Para dar respuesta a estas preguntas, hacen falta herramientas muy específicas, a veces caras, con una configuración que suele ser compleja. Para intentar facilitar este proceso en esfuerzo y coste, Microsoft ha lanzado al mercado Azure Load Testing
Azure Load Testing es un servicio de prueba de carga, totalmente administrado que permite generar una carga de usuarios concurrentes hacia una aplicación a gran escala.
El servicio simula el tráfico de las aplicaciones, independientemente del lugar en que se hospeden, y se puede usar para optimizar el rendimiento, la escalabilidad o la capacidad de las aplicaciones.
Simplemente con la URL de la aplicación, Azure Load Testing abstrae la complejidad y la infraestructura para ejecutar una prueba de carga a gran escala. Además, este servicio nos permite automatizar pruebas de regresión mediante la ejecución de pruebas de carga como parte del flujo de trabajo de continuous integration/continuous deployment (CI/CD), y tirar para atrás versiones que no consigan pasar estas pruebas y los tests de regresión de estas mismas.
En aplicaciones basadas en Azure, Azure Load Testing se implementa con facilidad y recopila métricas más detalladas de recursos para identificar cuellos de botella de rendimiento en los componentes de la aplicación de Azure.
En otros entornos Cloud, Puntos de conexión privados, o Aplicaciones On Premise, Azure Load Testing también nos permitirá realizar tests de carga, con una configuración adicional previa para dar acceso al servicio.
Además, Azure Load Testing nos permite crear una prueba de carga mediante la reutilización de un script de prueba existente de Apache JMeter (otra de las herramientas de carga y rendimiento de código abierto), para casos de más complejidad en que las acciones de los usuarios virtuales deben ser más dinámicas y variadas. Por ejemplo, el plan de prueba puede constar de solicitudes a varias aplicaciones o usar parámetros y datos de login diferentes.
Una vez se ha ejecutado una prueba de carga, los resultados de esta se pueden consultar en un Dashboard con la información del test, con datos de los resultados y gráficos, además de datos adicionales en componentes en Azure. De esta manera se pueden identificar cuellos de botella y problemas de rendimiento en las aplicaciones estudiadas. El servicio además mantiene un historial de resultados, permite comparar resultados de manera visual, y permite también descargar resultados y usar herramientas de terceros para analizarlos.
El servicio de Azure Load Test tiene un precio inicial y luego un precio en función de los usuarios virtuales/hora usados durante los testeos.
Los motores de prueba (Test Engines) de Azure Load Testing abstraen la infraestructura necesaria para ejecutar una prueba de carga a gran escala. Los motores de prueba ejecutan un script de Apache JMeter proporcionado para simular que muchos usuarios virtuales acceden concurrentemente a los puntos de conexión de la aplicación.
En el caso de crear una prueba de carga basada simplemente en una dirección URL, Azure Load Testing genera automáticamente el script de prueba de Apache JMeter. Además, para escalar horizontalmente la prueba de carga, el servicio te permite configurar el número de motores de prueba.
Azure Load Testing usa Apache JMeter, versión 5.5, para ejecutar pruebas de carga. Y la aplicación se puede hospedar en cualquier lugar:
Por otro lado, para realizar pruebas de carga en casos en que no haya ningún punto de conexión público, se ha de implementar Azure Load Testing en una red virtual.
Durante la prueba de carga, el servicio recopila las siguientes métricas de recursos y las muestra en el Dashboard:
Azure Load Testing incorpora automáticamente procedimientos recomendados para las redes de Azure, para que las pruebas se ejecuten de forma segura y fiable. Las pruebas de carga se detienen automáticamente si los puntos de conexión de la aplicación o los componentes de Azure inician solicitudes de limitación.
Además, los datos almacenados en cualquier recurso de Azure Load Testing se cifran de forma automática con claves administradas por Microsoft, que son claves administradas por el servicio. Estos datos incluyen, por ejemplo, el script de Apache JMeter usado en la prueba, ya sea introducido por el usuario o autogenerado en base a la URL.
Veamos ahora un ejemplo de cómo realizar una prueba de carga en nuestra aplicación basada en web o un portal web.
Importante, para realizar una prueba de carga, hacen falta los siguientes prerequisitos:
Una vez se tienen ambas condiciones, el primer paso es la creación de un recurso de Azure Load Testing, que proporciona un lugar centralizado para ver y administrar planes de pruebas, resultados de pruebas y artefactos relacionados:
Seleccionar Revisar y crear.
Debemos revisar todas las opciones de configuración y seleccionar “Crear” para iniciar la implementación.
Una vez finalizado el proceso, aparecerá un mensaje de implementación correcta.
Con el recurso Azure Load Testing creado, podemos crear rápidamente una prueba de carga desde Azure Portal. Para ello sólo es necesario especificar la dirección URL de la aplicación web y los parámetros básicos de la prueba.
Azure Load Testing crea el script de prueba de carga y aprovisiona la infraestructura necesaria de manera transparente.
Para comenzar la prueba de carga debemos:
Si el número de usuarios virtuales supera el máximo de 250 por instancia de motor de prueba, Azure Load Testing aprovisiona varios motores de prueba y distribuye la carga uniformemente.
Por ejemplo, 300 usuarios virtuales darán como resultado 2 motores de prueba con 150 usuarios virtuales cada uno. El máximo de usuarios permitidos es de 11250. El número de usuarios usados por hora influye en el precio del servicio.
El script de Apache JMeter generado automáticamente para la prueba de carga se puede descargar desde el Dashboard de ejecución.
Si quisiésemos ejecutar el script localmente, sería necesario proporcionar variables de entorno para configurar la dirección URL y los parámetros de prueba.
Una vez iniciada la prueba de carga, la página se redirige al Dashboard de ejecución. Mientras se ejecuta la prueba de carga, Azure Load Testing captura las métricas del lado cliente y las métricas del lado servidor, pero el Dashboard de ejecución se usa para supervisar las métricas del lado cliente. De forma predeterminada, los datos se actualizan cada 5 segundos.
Este Dashboard de ejecución, nos permite cambiar los filtros para ver un intervalo de tiempo, un percentil de resultado o un tipo de error específicos.
Otra característica que tiene el servicio es que, en cualquier momento, podemos modificar la configuración de la prueba de carga, definir criterios de error de prueba o navegar en el portal para supervisar las métricas del lado servidor para los componentes en Azure.
Una vez la prueba ha finalizado, podremos usar el recurso de Azure Load Testing para nuestras siguientes pruebas. Sin embargo, para evitar incurrir en gastos innecesarios, recomendamos revisar los recursos aprovisionados por la prueba, que se habrán creado en el mismo Resource Group, y eliminar los que no sean necesarios hasta la siguiente prueba que se quiera realizar.