Performance Testing con JMeter: Paso por Paso para Mejorar los escenarios Grabados


Mejorando el script GrabadoEn esta nueva entrega de  “JMeter: Performance Testing con JMeter” vamos a ver como utilizar JMeter para mejorar los escenarios GRABADOS. Para mas información sobre grabar escenarios puede ingresar aquí.

La idea es que ya teniendo el escenario base grabado prosigamos con las mejoras en correlación, parametrización, manejo de sesiones y cookies del mismo para realizar las pruebas de Performance de manera real.

Para que los pasos a realizar sean más entendibles, primero les paso algunos links importantes sobre conceptos que debemos tener claros antes de realizar la mejora del escenario de pruebas:

Paso por Paso para Mejorar los escenarios Grabados

Primero que todo necesitamos ejecutar JMeter, para esto ejecutamos el archivo jmeter.bat (requerimientos de JMeter) que se encuentra en la carpeta bin. Una vez que ya tenemos JMeter corriendo y el escenario base (Sin mejora alguna) abierto tendríamos que tener una ventana como esta:

Test Plan Base del escenario de pruebas
Test Plan Base del escenario de pruebas

Un consejo, antes de realizar cualquier tipo de cambios sobre la grabación base de nuestro escenario de pruebas les recomiendo que guarden el script con otro nombre para no pisar el escenario base y en ante cualquier necesidad de volver atrás no tengamos que grabar nuevamente el escenario base.

Como primer paso debemos verificar que acciones (GET, POST, PUT, etc…) realizan los requests grabados y verificar que variables deberíamos parametrizar.

En este caso tenemos las siguientes variables a parametrizar:

–         Estáticas (las ingresaremos nosotros):

  • name
  • password1
  • password2
  • email
  • password

–         Dinámicas (son generadas por la aplicación):

  • rev
  • ticket
  • savetext

Debemos decidir que control usaremos para cargar los valores estáticos ingresados por nosotros en nuestras pruebas, dependiendo del tamaño de nuestras pruebas agregamos un elemento para manejo de variables el cual puede ser (hay otros que no vienen al caso por una cuestión de preferencias mías):

  • Configuración del CSV Data Set en caso de que manejemos muchos usuarios
  • Parámetros de Usuario en caso de que manejemos pocos usuarios

En este caso voy a utilizar el elemento de configuración “Configuración del CSV Data Set” del cual obtendremos la parametrización para las variables que serán seteadas por nosotros, generando un archivo CSV con la siguiente estructura:

  • En el elemento CSV hacemos referencia a nuestras variables de la siguiente forma:

nombre,password,mail

  • Debemos tener un archivo CSV junto al script con la estructura:

TutorialJmeter1,password.JM,mail1@hotmail.com

TutorialJmeter2,password.JM, mail2@hotmail.com

….

TutorialJmeterN,password.JM, mailN@hotmail.com

Una vez identificadas las variables a parametrizar y decidido que elemento vamos a utilizar para el manejo de los mismos, pasamos a reemplazar los valores de las variables por la llamada a los parámetros:

–         name: ${nombre}

–         password1: ${password }

–         password2: ${password }

–         email: ${mail}

–         password: ${password }

Las variables dinámicas deberemos capturarlas con un extractor de expresiones regulares y reenviarlas en el próximo POST.

En este momento el Test Plan esta formado de la siguiente manera:

Test Plan mejorado
Test Plan mejorado

Probamos ejecutar el escenario con los cambios recientes y verificamos si se completa de manera exitosa.

En este caso, vemos que en el listener «Ver Árbol de Resultados» los request y respuestas que obtenemos no son los esperados luego de loguearse, ya que al querer navegar la aplicación la sesión se pierde y no puede completar el escenario.

Si verificamos las URLs grabadas no hay signos de que la aplicación utilice JSESSIONID para el manejo de la sesión por lo que el manejo de la misma debe ser por medio de cookies. Agregamos un cookie manager a nuestro test plan y probamos nuevamente.

Verificamos nuevamente el Ver Árbol de Resultados y el usuario se loguea y puede navegar la aplicación sin problemas :D.

El último paso en nuestro escenario es agregar asserts para verificar que la aplicación se comporta de la manera esperada durante las pruebas. Los asserts se pueden evitar si el Test Plan esta quedando demasiado cargado ya que al igual que los Listeners pueden afectar la performance de Jmeter y podríamos obtener resultados poco confiables.

Finalmente, nuestro escenario mejorado queda estructurado de la siguiente forma:

Test Plan Mejorado y listo para correr las pruebas
Test Plan Mejorado y listo para correr las pruebas

Ya esta listo para correr con muchos usuarios sin problemas!!!

Espero que sea de utilidad la guia, cualquier duda  consulten en el foro QALATINOAMERICA.

Si tienen quejas o no están de acuerdo con algo de la guia, por favor, comenten.

Les dejo un video tutorial donde se muestran los pasos escritos arriba:

Mejorando el script Grabado (Bajen el archivo, esta grabado con screen2exe para que sea mas liviano)

32 comentarios sobre “Performance Testing con JMeter: Paso por Paso para Mejorar los escenarios Grabados

  1. Hola, estoy intentando aprender a usar JMeter. He visto que en el ejemplo añades comprobaciones, como por ejemplo ver si se ha registrado. ¿Cómo se añaden estas comprobaciones? Por ejemplo, cuando un usuario se loguea, podría comprobar que sus datos se muestran en la página siguiente ¿?
    Saludos y gracias

    Me gusta

    1. Si, en el ejemplo se puede ver en el ultimo paso se agregan los asserts para verificar que el camino se esta ejecutando según lo esperado, validando que el usuario se haya registrado, luego logueado, si cancela la edición y si se desloguea. Si bien en el post no detallo mucho el paso, lo puedes ver en el vídeo que puse al final del post (debes descargarlo).
      Los asserts de respuesta usan expresiones regulares y se agregan a los request sobre los cuales se quiere validar la respuesta.
      Si no queda muy claro en el vídeo, puedes encontrar mas info en la pagina de JMeter:
      http://jakarta.apache.org/jmeter/usermanual/component_reference.html#Response_Assertion

      Espero que la respuesta sea de ayuda,

      Saludos,

      Jose

      Me gusta

  2. Hola: Estoy tratando de leer un archivo csv para una prueba de stress masiva, en la configuración de «scv data set» escribí correctamente como aparece en el tutorial de JMeter los parámetros
    -nombre de archivo = pruebas.csv,
    -nombre de variable = rut,dv,clave
    -recycle onn EOF ? = false
    Las variables en el archivo las ingresé separándolas por coma, el archivo lo dejé en el directorio bin de JMeter.
    No he creado «user parameter», no tengo muy claro si es que es necesario usarlo. Te agradecería algún consejillo

    Me gusta

  3. Hola, estoy trabajando con JMeter pero nos hemos visto con un problema:

    La mayoria de variables que guardamos lo hacemos mediante request.GetSession().setAttribute. Luego en el JSP lo recogemos por la sesion tambien.

    Entonces, a la hora de hacer test de estres me gustaria pasarle ademas de variables normales, las variables estas que deberian de estar en la sesion, y es aqui donde esta el problema: ¿Donde se definen las variables necesarias residentes en la request de sesion?

    Gracias y saludos

    Me gusta

  4. Hola..

    tengo una pregunta si puedo configurar los usuario con su login y su password, puedo tambien configurar las acciones que tendrán cada uno de sus usuarios por ejemplo cada uno va a descargar un archivo determinado según el usuario logueado. Si es posible como puedo hacerlo.

    Gracias

    Me gusta

    1. Hola Leidy,

      Si es posible realizar lo que preguntas. Si solo depende de un nombre de archivo a bajar podrias solo agregar una variable mas al CSV data Set (user, pass, archivo) y para aquellos casos en que puede variar el request a realizar puedes agregar una variable (user, pass, realizaDescarga) y luego poner un control IF que verifique la condicion y tome el camino deseado segun la variable realizaDescarga.

      Espero que sea de ayuda la respuesta.

      Saludos,

      José Pablo Sarco

      Me gusta

  5. Gracias, por la respuesta pero ahora me encuentro con otro problema es que debo de simular una carga de un archivo según el usuario logueado en la aplicación… esto también lo hago como la generación… Disculpa pero es que estoy planeando unas pruebas y necesito tener claridad en esto para saber si JMeter me puede servir..

    Gracias…

    Me gusta

    1. Leidy,

      No cambiaría mucho la respuesta anterior ya que podrías agregar un Extractor de Expresiones regulares para capturar algún valor en pantalla que sea propio del usuario logueado y combinarlo con un control IF para seguir distinto caminos dependiendo del valor que capturaste. Esto es solo una posible solución ya que no conozco el contexto del proyecto.
      Espero que sea de ayuda.
      Saludos,
      José

      Me gusta

    1. Edisanluck,

      Los programas como LoadRunner y QaLoad básicamente siguen los mismos conceptos que los demás herramientas para pruebas de Performance, esto es, grabación, correlación/parametrización y mejoras para luego concluir con la ejecución. Para realizar estas tareas la gran mayoría incluyen conceptos como Transacciones, correlación, Request, parámetros y expresiones regulares entre otros. Por lo que la respuesta a tu pregunta es sí, es más, me aventuro a decir también (basado en mi experiencia) que tal vez hasta te sea más fácil entender LoadRunner habiendo tenido experiencia anterior con una herramienta para pruebas de performance como JMeter.

      Espero que sea de ayuda la respuesta.

      Saludos!

      José

      Me gusta

  6. Hola, tengo problemas con las sesiones, apesar de que coloco un gestor de cookie, sólo obtengo una única sesion (la sesion con la que obtuve los scripts) asi coloque varios usuarios y cuando esta sesion expira lo hacen todos lo usuarios

    Me gusta

    1. Cyntia,

      Por lo que cuentas, pareciera que te falta parametrizar la información. Cuando dices «la sesion con la que obtuve los scripts» ¿Te refieres que le has dejado el JSessionID que se grabó? Si es así, necesitas parametrizar el mismo mediante el control HTTP URL Re-writing Modifier y remover el cookie manager ya que tu aplicación estaría manejando las sesiones mediante el servidor y no por cookies; si no es el caso, te pediría que nos brindes más información para poder ayudarte.

      Muchas Gracias,

      José

      Me gusta

  7. Hola José, gracias por tu respuesta. Para grabar un escenario lo hice con un usuario y el problema que tenía era cuando trataba de simular para N usuarios, siempre se mostraba la sesión del usuario con el que había grabado los escenarios. Pero la solución que tome fue dejar el «Gestor de cookie» activando «limpiar las cookies en cada iteración?», agregar «Valores por Defecto para Petición HTTP» activando «Recuperar los recursos empotrados dearchivos HTML» y para cada «Petición HTTP», colocar como método POST. Luego de simular con los N usuarios, ya no tenía problemas con las sesiones.Pero eso de estar cambiando para todas las peticiones es una tarea larga por eso voy a probar lo que me recomiendas y veremos que pasa. Gracias

    Me gusta

  8. Hola que tal estoy tratando de hacer unas pruebas de estrés pero tengo un inconveniente, que no la puedo realizar porque estamos trabajando con cas el cual te guarda una cookie de sesión, ¿como hago para loguearme con muchos usuarios?
    Muchas Gracias

    Me gusta

    1. Emiliano,

      En ese caso lo que tendrías que agregar un Cookie manager a nivel Grupo de Hilos y JMeter se encargará de manejar las sesiones de los distintos usuarios. Debes considerar también la parametrizacion de los datos para no tener problemas.

      Saludos,

      José

      Me gusta

  9. hola Jose, estamos implementando la ejecucion de este tipo de pruebas, tus post me has servido muchisimo para entender como funcionan, sobre todo con el uso de JMeter….gracias por esa información. En este momento tengo un problema, una de las funcionalidades que debemos implementar funciona cargando unos archivos fisicos los cuales tienen asociado un codigo que va en el nombre del archivo y la aplicación http valida que esto sea correcto, cuando capturo el script la ruta desde donde es cargado el archivo inicial queda en el objeto en una sesion que se llama «enviar un archivo con la peticion», lo que necesito es obtener los archivos que se encuentran en una carpeta de mi computador dependiendo del usuario que se conecte pero no he logrado modificar el script para esto…muchas gracias por la orientacion que me puedas dar.

    Me gusta

    1. mariate,

      Me alegra que el blog les sea de ayuda.

      En cuanto a tu consulta, sin conocer muy bien el contexto de tus pruebas me animo a sugerir lo siguiente:

      *Posibilidad 1 (simple):
      Puedes agregar un elemento CSV Data Set Config donde vas a leer los nombres de los archivos que serán enviados. En el request HTTP debes parametrizar el nombre del archivo a enviar de la forma ${archivo}. En el CSV indicas en que archivos vas a guardar la ubicación del archivo que buscas enviar y le indicas como llamaras a esa ubicación (por ejemplo lo puedes llamar «Archivo») por lo cual jmeter reemplazará la parametrizacion ${archivo} por ‘C:/enviar.txt’ (la ubicación del archivo a enviar)

      *Posibilidad 2 (compleja): Puedes hacer lo mismo que en la posibilidad 1, pero reemplazando la parte del CSV Data Set Config por un BeanShell pre procesor que realice un scan de determinada carpeta y guarde el nombre del archivo y ruta en una variable llamada ${archivo} para ser enviada con el request.

      Esas son las dos opciones posibles que se me ocurren, si necesitas profundizar en alguna puedes escribirme un mail con un poco más de información y podemos ver que solución encontrarle.

      Saludos,

      José

      Me gusta

  10. Hola José,

    Gracias por tu blog, en el momento estoy aprendiendo a manejar el jmeter para hacer pruebas a una aplicacion web la cual tenemos un laboratorio para ello, si bien ya he grabado el escenario y cada vez que envio una prueba tengo resultados exitosos, tengo una inquietud yo grabé mi escenario con un usuario, el cual entra a la aplicación busca un usuario, edita el nombre de este usuario y luego se desloguea de la aplicación, ese es mi escenario, mi pregunta es: yo edito con otro nombre en mi escenario el mismo usuario y vuelvo a correr la herramienta pero en mi laboratorio real no hace el cambio, en el jmeter me dice que fue exitoso pero no veo el cambio en mi lab, esta herramienta me permite hacer cambios a mi laboratorio o no puedo hacer esto, realmente no se si el jmeter me permite hacer cambios reales o siemplemente eso es lo que hace?

    Desde ya muchas gracias por tu respuesta

    saludos

    César

    Me gusta

    1. Cesar,

      Jmeter simula la interacción del browser con la aplicación, por lo que, si el escenario que estas ejecutando contiene toda la información que se maneja cuando lo realizas desde el navegador, los cambios se deberían ver impactados en tu aplicación. Te recomiendo que hagas una revisión más detallada del escenario que estas ejecutando y lo compares con la información que maneja el browser (puedes utilizar HTTPFox o Fiddler) para esto.

      Espero que sea de ayuda,

      Saludos!

      José Pablo

      Me gusta

  11. Muy buen artículo, tengo la siguiente duda; he utiilzado LoadRunner y ahí se manejan 3 secciones Init, Action y End, yo distribuía la información de la siguiente manera:

    Init: El login de usuario, solamente se se ejecutaba una vez al correr la prueba, de tal manera que el usuario virtual solo se logueaba una vez a la aplicación

    Action: Se colocaba todo el código que el usuario iba a probar luego de haberse logueado, y solamente esta sección se ejecutaba N veces mientras dure la ejecución de la prueba.

    End: Se colocaba el código para deslogueo, tambièn se ejecuta solo una vez al final de la prueba.

    De los ejemplos que he visto de Jmeter, el usuario siempre se loguea, ejecuta las acciones que tenga que ejecutar, se desloguea y en la siguiente interacción vuelve nuevamente a loguearse y hacer todo el proceso de nuevo.

    Lo que necesito saber es lo siguiente: ¿es posible hacer que una parte se ejecute solo una vez (login) y otra sección se ejecute N veces una vez que el usuario ya se haya logueado?

    Espero me puedas ayudar.

    Gracias.

    Me gusta

    1. Pablo,

      Lo que estas buscando es posible con JMeter, es más, hasta cierto punto es exigible que se realice asi para que el caso de prueba sea eficiente y legible por cualquiera que tenga que trabajar sobre él.
      Para correr una seria de request solo una vez tienes el controlador logico «Once Only Controller» que te servirá en tu caso para el login. Luego puedes utilizar el controlador logico ‘Loop Controller‘ (o cualquiera de los otros controladores de repetición como el ForEach, While, etc…) para agrupar los request que son necesarios ejecutar muchas veces.

      Espero que la respuesta sea de ayuda.

      Saludos,

      José

      Me gusta

  12. En el video se puede apreciar que el visor de resultados de arbol puedes visualizar la Imagen HTM de la pantalla y tienes opciones como «Show Text», «Render HTML», etc; yo agregué el control «View Results Tree» sin embargo no puedeo ver esas opciones, solo me muestra texto.

    ¿Es otro control el que se utiliza?

    Tengo la version 2.5 de Jmeter

    Me gusta

  13. hooolaaa muy buen blog en verdad me ha ayudado mucho
    una pregunta se puede hacer una prueba con jmeter para descargar archivos pdf o excel que genere la pagina que se le este haciendo la prueba

    Me gusta

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.