Skip to content

Instantly share code, notes, and snippets.

@Virako
Last active October 24, 2023 23:02
Show Gist options
  • Save Virako/c1a8132fdddc4c868378 to your computer and use it in GitHub Desktop.
Save Virako/c1a8132fdddc4c868378 to your computer and use it in GitHub Desktop.
Guía para test de carga y estrés

Introducción

Test de carga: comprueban hasta donde es capaz de llegar el sistema con un comportamiento normal de peticiones.

Test de estrés: comprueban que ocurre ante un comportamiento del sistema con un nivel de exigencia mayor al que es capaz de manejar. Saturamos el sistema y solemos obtener los siguientes escenarios:

  • El sistema responde lo que puede y desecha algunas peticiones.
  • El sistema responde a todas las peticiones pero con un gran retraso.
  • El sistema se colapsa y queda fuera de línea.

La intención con este tipo de test es ver el comportamiento ante una situación extrema y ver el rendimiento. Con esto podremos ver si hay que aumentar el hardware de la máquina o mejorar el software para evitar caidas o mejorar el tiempo de respuesta.

Herramientas

Para la realización de estos test se han utilizado 2 herramientas diferentes:

  • ab (apache benchmark) con gnuplot para dibujar gráficas de resultados
  • Jmeter

Haciendo pruebas con ambas herramientas, decidimos quedarnos con Jmeter, ya que es mucho más completa, podemos grabar las acciones que queramos testear fácilmente y obtenemos muchos mas feedback (gráficas, estadísticas, tablas, etc).

Jmeter

Instalación

sudo apt-get install jmeter

Conceptos básicos

Para hacernos con la interfaz vamos a explicar lo básico. Empezaremos explicando por encima el menu de la parte izquierda y sus opciones:

  • Test Plan: Plan de pruebas, aquí tendremos las pruebas que vamos a ejecutar.
    • Threads: necesitaremos crear hilos para realizar dentro de estos las pruebas. En el propio hilo podremos cambiar el número de peticiones que queremos hacer y el tiempo en el que queremos que se hagan dichas peticiones.
      • Controllers: tenemos controladores de diferentes tipos, que sirven para programar un poco las peticiones que hagamos, utilizando if, while, for, random, o simplemente, separar peticiones en bloques.
    • Sampler: Estos pueden ser utilizado fuera o dentro de un controlador, estos serán los test. Dentro de los sampler, el que nosotros hemos utilizado es el HTTP Request.
    • Config element : añadir diferentes configuraciones, solo comentaremos algunas de ellas:
      • CSV data: con esto podemos cargar un csv con datos y utilizar estos datos para las pruebas. Por ejemplo una lista de usuarios-contraseñas para authenticación.
      • HTTP Cache: para utilizar caché en peticiones GET y mejorar el rendimiento, como si estuviésemos en un navegador.
      • HTTP cookies: para manejar las cookies como si estuviésemos en un navegador actual.
    • Post processor : herramientas de postprocesado, para realizar acciones cuando la petición termine.
      • CSS/Jquery extractor ó regular expression extractor: extraer datos de una petición realizada, normalmente con la intención de usar esos datos obtenidos para otras peticiones posteriores.
    • Listener : resumiendo, estas opciones sirven para obtener el feedback necesario de las peticiones que hagamos, pongo algunas de ejemplo:
      • Summary report: reporte con un resumen de lo ocurrido, donde podemos ver la cantidad de peticiones, errores, desviaciones, medias, etc
      • View results tree: un arbol de resultados donde podremos ver todas las peticiones realizadas y sus respuestas.
      • Graph results: un gráfico donde podemos ver las peticiones y donde se observarán fácilmente los datos que nos devuelve el summary report pero gráficamente y un poco más detallado.
      • Response time graph: un gráfico donde obervar las peticiones realizadas en el tiempo y su duración.
  • WorkBench: la mesa de trabajo, solo la hemos utilizado para realizar las grabaciones, que explicaremos en el siguiente punto:
    • Non-test element --> test script recorder: añadiendo esta opción motamos un grabador a través de proxy, por lo que si cogemos un navegador y enviamos las peticiones a través de este puerto proxy, podremos grabar dichas peticiones y luego usarlas como test.

Comentar que para añadir estas opciones, se hacen con el clik derecho, encima de otra de las opciones y pulsando en añadir.

Las otras partes que podemos ver en la interfaz son:

  • La barra de tareas: aquí podemos observa el PLAY (comenzar con la ejecución de test) y la ESCOBA (limpiar los resultados).
  • El menu de la derecha: detalles de las diferentes que tengamos en el menú de la izquierda.

Con estos conceptos básicos ya tendremos una idea general de como funciona Jmeter y podremos utilizarlo para realizar el siguiente ejemplo.

Ejemplo de Jmeter sobre agora-voting

En este ejemplo vamos a ver cuantas votaciones por segundo soporta nuestro sistema de votación, para ello, lo primero que vamos a realizar es una grabación del proceso de votación para ver la petición que tenemos que utilizar como test.

Lo primero que haremos será grabar lo que queremos testear, para ello lo que haremos será añadir en el Workbench un HTTP(S) Test Script Recorder, elegir un puerto y seleccionar un target controller, que como no tenemos ninguno, vamos a crearlo también. En Test Plan añadimos un Threads Group, y tras esto ya podemos seleccionar en el HTTP(S) Test Script Recorder el target controller Test Plan-->Thread Group.

Una vez hecho esto, necesitamos que el navegador funcione como proxy en el puerto seleccionado anteriormente. Mirar como hacer funcionar tu navegador como proxy Ejemplo de como hacerlo en firefox

Una vez hecho esto, dentro del HTTP(S) Test Script Recorder en Jmeter le damos a Start y navegamos haciendo las peticiones que queremos testear, en nuestro caso, realizar una votación. Una vez terminado el proceso, podemos parar la grabación en Jmeter.

Podemos ver que obtenemos muchas peticiones, de las cuales solo tenemos que quedarnos con las que nos interesan. En este caso con la petición "/elections/api/election/2/voter/xxxxxxxxxxxxxxxxxxx". Dentro de dicha petición, si la comparamos con la petición realizada en el navegador, nos falta un detalle en el request, y es el Authorization. Para verlo, dentro de la petición podemos ver que hay un HTTP Header Manager, y en las opciones nos falta el campo Authorization, que es donde tendríamos que poner el auth-token para que la petición sea válida.

Resumiendo, para realizar peticiones de votos necesitamos cambiar dos cosas:

  • Cambiar el HTTP Header Manager: añadir campo Authorization con el auth-token/hmac
  • Cambiar la url de la propia petición: cadena de texto parte del auth-token/hmac

Aquí entran en juego dos cosas:

  • CSV data: como explicamos anteriormente, nos servirá para cargar un CSV con el hmac por una parte, y otra parte del hmac para utilizar en la url por otra. Quedando nuestro csv con los campos: hmac,voter.
  • Variables en Jmeter: para utilizar variables en Jmeter podemos sustituir en cualquiera parte ${variable} y esto será sustituido por el contenido de la variable. Por ejemplo, la url quedaría "/elections/api/election/2/voter/${voter}"

Primero crearemos el csv con el contenido de las hmac y urlhamc, para ello utilizaremos este script en python Dentro tendremos que sustituir el shared_secret, el número de usuarios/hmacs que queramos generar y por que id de usuario empezamos (esto es importante porque si hacemos muchas pruebas no podremos votar con el mismo usuario las veces que queramos, ya que está limitado).

Una vez creado este csv, añadimos en Jmeter un CSV data dentro del hilo principal. Dentro de las opciones de este CSV data, añadimos el nombre del fichero y los campos del csv que usaremos como variables dentro del campo variables names, nosotros usaremos: hmac,voter

Después de escoger las variables, habrá que hacer 3 cambios para que todo funcione:

  • Añadir en el HTTP Request Manager dentro del test el campo Authorization con el valor ${hmac}
  • Sustituir el actual usuario de la url del test por el voter que hemos generado dentro del HTTP Request, quedando el path de dicha peticíon como: "/elections/api/election/2/voter/${voter}"
  • Por último, seleccionar la cantidad de usuarios que hayamos generado dentro del Thread Group y le damos al boton de PLAY para que estos test empiezen a correr.

Podemos ver que así corren los test pero no obtenemos feedback ninguno, ya que no hemos añadido ningún listener. Vamos a añadir los 4 listener explicados anteriormente, añadirlos al Thread Group y ejecutar de nuevo los test para ver los resultados.

Así ya tenemos el primer ejemplo y una pequeña guía de como utilizar Jmeter.

Fichero de ejemplo con otros test

Dejo un enlace a un fichero de configuración de Jmeter donde tenemos diferentes pruebas que serán necesarias para cualquier documentación de test sobre agoravoting:

  • test de carga y estrés para petición al election
  • test de carga y estrés para ficheros estáticos
  • test de carga y estrés para votos

Para que las pruebas funcionen, tenemos que cambiar las variables globales del server y el autheventid, las cuales están en Pruebas Agora Voting y tener en cuenta que tenemos que generar el csv con los datos de hmac y voter para los votos.

Jmeter command line

Como ahora comprobaremos, la ejecución de jmeter mediante linea de comandos es bastante sencilla. Lo único imprescindible será tener el fichero de configuración y el data.csv con los hmac generados en la misma carpeta.

jmeter -n -t file.jmx -l file.jtl -j file.log

  • -n: nogui
  • -t: fichero de configuración, para este caso nos descargamos el fichero ya creado para este fin desde [aquí](jmeter -n -t jmeterconfig/Pruebas\ Agora\ Voting.jmx -l data.jtl -j log.log).
  • -l: fichero con los resultados que vamos a obtener, el cual podremos abrir más adelante con la interfaz para ver gráficas y tablas.
  • -j: fichero con el log generado
Links

*¹ Estas opciones podemos utilizarla en diferentes niveles (thread, controllers o sampler), dependiendo de donde queramos incluirla y donde queramos que tenga efecto. *² Tener en cuenta que los ejemplos son asumiendo que existe una votación con id 2, esto podemos cambiarlo también en la configuración de la petición o en la configuración global del fichero de ejemplo.

Mas documentación y explicaciones en inglés aquí

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment