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:
- Correlación: https://josepablosarco.wordpress.com/2009/06/24/extractor-de-expresiones-regulares/
- Manejo de Sesiones de Usuario: https://josepablosarco.wordpress.com/2009/09/01/http-url-re-writing-modifier/
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:
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
- 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:
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:
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)
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Gindo,
Tendrias que ubicar el csv en la misma carpeta donde se encuentra el script y no en el bin.
Saludos,
Jose
Me gustaMe gusta
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 gustaMe gusta
Daniel,
Si bien no me queda muy en claro cual es tu pregunta, creo que una solución podria ser usar un extractor de expresiones regulares que procese los URLs en busca de esas variables que decis.
Saludos,
Jose
Me gustaMe gusta
POST Fastastico, muchas gracias Jose!
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Hola amigo muy bueno tu blog y el post, una pregunta si aprendo a manejar este programa y a entender en si este tipo de pruebas ¿crees que sea facil migrar a programas como load runner o qa load?
Saludos.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Muchas gracias, exactamente es lo que necesitaba.
Me gustaMe gusta
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 gustaMe gusta
Pablo H,
Exactamente, la diferencia esta en la version de JMETER que en el vídeo es la 2.3. En la version 2.5 tenes las opciones del lado izquierdo, en forma de combo debajo del árbol de resultados.
Podes ver más info en este link: http://jakarta.apache.org/jmeter/usermanual/component_reference.html#View_Results_Tree
Espero que se de ayuda.
José
Me gustaMe gusta
Si muchas, ya me di cuenta que era tema de la versión.
Me gustaMe gusta
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 gustaMe gusta
Hola djcl,
Si se puede y para ello puedes utilizar el listener Save_Responses_to_a_file.
Espero que sea de ayuda.
Saludos!
José
Me gustaMe gusta
muchas gracias por la ayuda
Me gustaMe gusta