En este post te comparto un resumen que preparó Valeria Sarro, de Abstracta, luego de haber realizado el curso de Abstracta Academy sobre pruebas de performance. Creo que es un resumen bien útil para todo aquel que quiera tomar el curso, así como para el que quiera repasar conceptos.
Poco tiempo después de entrar a Abstracta realicé el curso de performance en JMeter y Blazemeter por Abstracta Academy. Les dejo a continuación un resumen de pruebas de performance que hice, incluyendo definiciones y conceptos traducidos al español.
¿Qué son las pruebas de performance?
- Performance de una computadora: Es la relación entre el desempeño de una aplicación (velocidad, cantidad de trabajo realizado) y la cantidad de recursos que se utilizan.
- Performance testing: Consiste en simular determinada cantidad de conexiones al sistema y evaluar el comportamiento de los componentes. Se utilizan herramientas como:
- JMeter: Para automatizar los tests y simular escenarios reales.
- BlazeMeter: Para incrementar el potencial de JMeter en el Cloud, brindar reportes en tiempo real, realizar integraciones de herramientas de CI/CD (como Jenkins), correr los tests desde diferentes ubicaciones geográficas, etc.
¿Cómo nos ayuda JMeter con el Testing de Performance?
- Es una herramienta que nos permite simular carga de varios usuarios a un mismo sistema, para poder asegurarnos que en el uso no se vuelva lento, evitando que los usuarios no pierdan el interés en la aplicación.
- ¿Por qué JMeter?
- Es la herramienta de performance más popular.
- Es OpenSource.
- Tiene una gran comunidad que brinda soporte.
- Es compatible con varios protocolos, no solo HTTPS.
- Está bien documentada.
- ¿Qué nos permite hacer?
- Grabar y reproducir acciones de usuarios.
- Simular acciones reales de usuarios.
- Configurar fácilmente distintos escenarios.
- Generar cargas pesadas en un servidor.
Conceptos básicos de automatización y simulación de carga
- Test Case: Hace referencia a una secuencia de acciones que realiza un usuario en un sistema, siguiendo una meta específica. En un Test Case, se definen los datos utilizados, los resultados esperados, y las pre/post condiciones.
- Simulación de Usuarios: Cuando automatizamos un Test Case típicamente buscamos simular un usuario real. Para lograrlo, necesitamos capturar la interacción entre el usuario y la aplicación. Por ejemplo, si se trata de una aplicación Web la interacción se da por medio de un navegador. Por lo tanto, para simular ser un usuario real, necesitamos simular la interacción entre el navegador y el sistema a probar.
- Usuario Virtual: Se genera en la ejecución de un script, que simula los pasos de un usuario real por medio de pedidos HTTP (o el protocolo que utiliza la aplicación al nivel que la estamos simulando).
- Assertion: Se usa para validar que los resultados obtenidos sean los esperados.
- Proceso de grabación de script:
- Empezar a grabar.
- JMeter inicia un proxy y captura el tráfico entre el navegador y el servidor de la aplicación.
- Abrir el navegador y ejecutar el Test Case.
- Crear el script basado en la grabación.
- Ejecución del script:
- Los pedidos web son generados en el script y enviados al servidor sin utilizar el navegador.
- Los resultados se almacenan en la herramienta, capturando tiempos de respuesta y otras métricas útiles para el análisis.
Introducción a HTTP
- ¿Por qué automatizamos a nivel de protocolo?
- Al tener que simular cientos o miles de usuarios cada vez que queremos realizar pruebas, se consumirían muchísimos recursos si fuera necesario tener que “abrir” un navegador por cada usuario para cada ejecución, como sucede en la automatización de pruebas funcionales a nivel de UI.
- HTTP:
- Hypertext Transfer Protocol. Es un protocolo de transferencia de texto y recursos en determinado formato.
- El cliente (browser) envía HTTP Request y luego el servidor responde con un HTTP Response. La comunicación se da por una serie de pedidos y respuestas entre el usuario y el servidor.
- Stateless Protocol: No permite identificar de qué usuario pertenece cada pedido. Para esto se utilizan cookies.
- Cookies: Piezas de información que se alojan del lado del cliente, enviadas al servidor junto con cada pedido. Una de las cookies que todo sistema suele tener es el “Session identifier”, utilizada para identificar el usuario y su sesión.
- Trabaja sobre TCP/IP y normalmente utiliza el puerto 80, a menos que se especifique otra cosa.
- Proceso de comunicación:
- Usuario ingresa a una URL en el browser.
- El navegador decodifica la URL separando las diferentes partes. De esa forma, identifica el protocolo, el nombre del servidor o IP, el número de puerto y a qué recurso de ese servidor quiere acceder el usuario.
- El navegador abre una conexión TCP al servidor por medio del puerto correspondiente.
- El pedido HTTP es enviado en esa conexión.
- El servidor envía una respuesta HTTP en la misma conexión. Esta respuesta incluye un código indicando si hubo algún error, o si todo salió bien.
- El navegador cierra la conexión.
- URL:
- Uniform Resource Locators.
- Nos ayuda a identificar los diferentes pedidos.
- En una misma URL se puede especificar:
- El protocolo.
- El dominio o IP.
- El puerto, como parte de la comunicación TCP.
- El recurso y cómo llegar a él.
- Utilizando “?”, se pueden definir parámetros como parte del pedido.
- Tipos de pedidos más usados:
- GET: Obtiene un recurso.
- POST: Crea un recurso.
- Códigos de response status:
- 1xx: Respuestas Informativas.
- 2xx: Peticiones Correctas.
- 3xx: Redirecciones.
- 4xx: Errores del Cliente.
- 5xx: Errores del Servidor.
- Encoding: Cuando un usuario utiliza caracteres especiales, como por ejemplo un espacio, el navegador tiene que codificarlo para respetar el protocolo.
Elementos de JMeter
- Thread Group:
- Permite definir un grupo de Threads (hilos, usuarios virtuales).
- Click derecho en “Test Plan”. Add > Threads > Thread Group.
- Number of Threads: permite elegir la cantidad de usuarios que queremos simular en nuestro test.
- Simple controllers:
- Permiten agrupar por acciones.
- Click derecho en “Thread group”. Add > Logic Controller > Simple Controller.
- Se puede ingresar un comentario para identificarlo.
- HTTP Request:
- Se especifica la URL, número de puerto, ubicación del contenido (path), el protocolo a utilizar, método, etc.
- Click derecho en nuestro Controller. Add > Sampler> HTTP Request.
- Pre Processors:
- Elementos que se procesan antes del pedido.
- Add > Pre Processors.
- Post Processors:
- Elementos que se procesan después del pedido.
- Add > Post Processors.
- Timer:
- Ayuda a representar mejor la realidad agregando pausas que simulan el comportamiento del usuario.
- Add > Timer.
- Response assertion:
- Permite validar las respuestas respuestas obtenidas.
- Add > Assertions > Response Assertion.
- Results Tree:
- Nos permite ver todos los pedidos enviados al servidor y todas las respuestas obtenidas.
- Add > Listeners > View Results Tree.
Grabar un script en JMeter
- Agregar Thread Group.
- Agregar Recording Controller:
- Add > Logic Controller > Recording Controller.
- Agregar HTTP(S) Test Script Recorder:
- Configurar Puerto con un valor de un puerto disponible (por ejemplo, 8080).
- Ingresar nuestro dominio.
- Configurar Proxy en nuestro navegador:
- Cambiar la configuración a manual proxy > Local Host.
- En puerto debemos ingresar el mismo que utilizaremos en JMeter (8080 en el ejemplo).
- Click en “Start” en JMeter.
- Ir a la página inicial del sistema y comenzar a ejecutar manualmente el caso de prueba.
- Una vez se completa el caso de prueba a grabar, volver a JMeter y presionar Stop.
Analizar un script en JMeter
- Las acciones capturadas quedan almacenadas en el Recording Controller (a menos que se haya indicado otra cosa).
- Los pedidos secundarios, de los elementos embebidos en nuestra página (archivos CSS, JavaScript, imágenes, etc.) se ejecutan automáticamente luego del pedido principal. Por lo tanto, con JMeter podemos eliminarlos de nuestro script y luego activar la opción “Retrieve All Embedded resources” y así poder tener tests más simples y flexibles.
Cookies
- Strings que nos permiten agregar información importante a nuestros pedidos HTTP, por ejemplo “Session Identifier”, nos permite que el usuario pueda mantener la misma sesión y no tenga que ingresar constantemente usuario y contraseña, ya que los pedidos HTTP no nos permiten reconocer a qué usuario pertenece.
- Cuando un usuario accede a un sitio, el servidor devuelve un header llamado “Set-cookie” que provee el nombre de la cookie, fecha de expiración, y el contenido.
- Importancia:
- Se necesita saber manejar cookies para que la simulación sea lo más parecido posible a la realidad.
- JMeter tiene un elemento que nos soluciona automáticamente la gestión de las cookies.
JMeter Cookie Manager
- Almacena las cookies enviadas del servidor.
- Add > Config Element > HTTP Cookie Manager.
- Clear cookies each iteration? : Al activarla, todas las cookies definidas por el servidor se limpiarán cada vez que se ejecuta el thread group.
Assertions
- Nos ayuda a determinar cuándo la respuesta es correcta o no y dejar un registro PASS/FAIL en el reporte.
- Ayuda a verificar que nuestro script está funcionando correctamente.
Assertions en JMeter
- Response Assertion: De las más utilizadas y nos permite buscar por texto en una respuesta.
- Size Assertion: Nos permite validar que la respuesta contenga tantos bytes, ya sea mayor, igual, distinto o menor a un valor dado.
- Duration Assertion: Validar que una respuesta se recibió en una determinada cantidad de tiempo.
Cómo hacer buenas validaciones (buenos assertions)
- Validaciones luego de iniciar la sesión: Por ejemplo, validar que aparezca nuestro nombre.
- Validar contenido de la ventana: Validar que el texto o títulos que contiene una página, sean los esperados.
- Validar que determinados elementos se encuentren en la página, antes de tener que utilizarlos.
- Prestar atención a caracteres especiales: Algunos caracteres se reciben de forma distinta a la que nosotros vemos en la página.
- No abusar de las validaciones: Si bien JMeter nos permite agregar tantas validaciones como queramos, si utilizamos muchas nuestro script puede quedar “muy pesado” y eso tampoco es bueno, ya que consumirá más recursos y nos permitirá simular menos usuarios virtuales por máquina.
Variables y parametrización
- Podemos definir una variable para almacenar cierta información con el propósito de utilizarla después.
Expresiones regulares
- Nos sirve para encontrar texto basándonos en patrones.
- ( and ) : Selecciona el string que coincide y lo devuelve.
- . : Selecciona cualquier carácter.
- + : Uno o más ítems.
- ? : Para a la primer coincidencia
Correlación de variables
- Para simular correctamente el flujo HTTP es necesario realizar lo que se conoce como correlación de variables, donde básicamente es necesario enviar en un request ciertos valores enviados en una respuesta previa del servidor.
- Para realizar esto es que se necesita usar una expresión regular para obtener el valor de una respuesta y cargarlo en una variable. Luego se usa esa variable en el HTTP Request para que se envíe el valor obtenido.
Parametrización
- Consiste en variar cierta información en los scripts, tomando los valores de una fuente externa (CSV, XML, etc.). Para esto también se usan las variables.
- Se suelen cargar en estos archivos los valores de usuario y password, cuentas o productos a utilizar, entradas que típicamente proporcionaría el usuario, etc.
Controllers
- Nos ayudan a darle estructura a nuestros scripts, para que sea fácil armarlos, leerlos, entenderlos y mantenerlos.
- Determinan en qué orden son ejecutados los pedidos.
- Transaction Controller: Agrupa un conjunto de pedidos para que aparte de tener el tiempo de respuesta de cada pedido HTTP individualmente, podamos saber el tiempo de respuesta del total.
- Once-Only-Controller: Sirve para cuando queremos ejecutar un pedido una vez sola.
- Loop Controller: Permite controlar el flujo de ejecución realizando iteraciones sobre los elementos contenidos en el controlador.
Test Scenario
- Se define el comportamiento de los usuarios en nuestra prueba, cuántos de ellos se ejecutarán en el test, cuántas veces y por cuánto tiempo.
Ramp-Up
- Momento al comienzo del test en el cual los usuarios utilizando el sistema aumentan progresivamente.
Duración del test
- Definir cuánto tiempo va a durar nuestro test, desde que lo iniciamos hasta que terminan de ejecutarse las acciones planificadas, para medir cuánto tiempo toma procesar toda la información.
- Normalmente se definen tests de una hora.
Cierre
Si bien estos conceptos básicos están bien explicados, no te pierdas la oportunidad de hacer el curso de Abstracta Academy, Pruebas de performance con Blazemeter y JMeter. Es un curso súper completo, con varias prácticas que ayudan a fijar todos estos conocimientos.