viernes, 7 de octubre de 2011

JMeter (III). Depurando scripts


JMeter (III).Depuración del script
Continuando con la serie ,tras los pasos de grabación y modificación de planes de prueba con JMeter, procedemos a explicar otra parte más del proceso de creación de pruebas de prestaciones con esta herramienta de carga.

En este momento es cuando se tiene que empezar a plantear introducir las validaciones de las respuestas obtenidas. Para ello, podemos hacer uso de los listener, un elemento de configuración del plan de prueba, que nos permite observar la respuesta obtenida y aplicarle un gestor, de manera que
· Compruebe la validez de la respuesta ,bien sea por comparación con respecto a un valor o por seguimiento de un patrón
· Dirija el flujo de ejecución a través de código por el script.
Depuración
Otro elemento necesario para la depuración del script es el Listener de “Ver Árbol de Resultados”. Este elemento permite ver la petición efectuada, con la instaciación de las variables, y las respuestas obtenidas entre otros formatos
  • Texto
  • XML
  • Expresión regular
  • HTML
  • Modo gráfico HTML

Ilustración 1. Listener Ver Árbol de Resultados
Esta capacidad debe ser usada sólo durante la depuración del script, dado el elevado uso de recursos de CPU y memoria que realiza.
Describimos a continuación las opciones más usadas habitualmente
Ilustración 2. Opciones del listener Ver Árbol de Resultados
  • Resultado del muestreador, permite observar la respuesta por la petición HTTP
  • Petición, que muestra el envio de la petición, con las variables instanciadas que use
  • Datos de Respuesta , que muestra en diferentes formatos la respuesta y sobre la que se puede aplicar búsquedas, bien de texto libre (si utilizamos la opción del desplegable “Text”) ,bien por expresiones regulares (Opción “Regular Expr.” Del mismo desplegable)
También permite ver la salida en formato similar al de la página web, con las limitaciones inherentes a un seudo navegador…

Validación de la respuesta
Una vez realizada la petición, se debe poder validar que dicha respuesta es correcta. Esto puede hacerse desde dos puntos de vista
  • Respuesta del servidor web
  • Respuesta en la lógica de la aplicación
La primera opción valida el código http devuelto, comprobando si es un código considerado válido (200 OK, 302 en caché), mientras que las respuestas de la famila 400 (404 Not Found, 401 Unauthorized, 403 Forbidden…) y la familia 500 serían consideradas a priori como fallidas
La respuesta en la lógica de la aplicación comprueba por el contenido de la misma o por el significado del valor . Así ,un servidor http que funcione correctamente ,pero que muestre errores del middleware o el backend (agotamiento de los threads, timeout en la respuesta del middleware, caída de la base de datos..etc) devuelve un código 200, aunque el contenido de lo que muestre sea un mensaje de error de la BBDD.
Para ambos casos usamos una aserción de respuesta, que permite realizar ambos tipos de validación, utilizando distintos tipos que ofrece JMeter. Para incluirlas se selecciona con el botón derecho del ratón sobre una petición http, se añade una aserción y entre las disponibles, escoger la “Aserción de Respuesta”

Ilustración 3. Añadir Aserción de Respuesta a petición HTTP
Existe dentro de la variedad de aserciones disponibles, algunas que permiten verificar el tamaño de la respuesta, la duración en milisegundos de la misma, aserción HTML, XML…etc. Dependiendo de la necesidad puede ser usada una u otra, incluso pudiendo combinar varias para una respuesta.
Un ejemplo de las opciones que se incluyen se muestran el la siguiente imagen

Ilustración 4.Aserción de respuesta en JMeter
Podemos ver que se están usando variables en el nombre de la aserción. Esto es útil a la hora de detectar con qué valores o situaciones se encuentra un fallo
También podemos ver que la aserción puede aplicarse bien al flujo http devuelto por el servidor directamente a la petición o a las peticiones subsecuentes
Como ya se indicó, la validación puede aplicarse a la respuesta textual, en el código http de respuesta, en las cabeceras de la respuesta (para evitar realizar un trabajo de búsqueda sobre un cuerpo de un gran tamaño).
Las reglas de Coincidencia de Patrones permiten indicar si la respuesta debe ser exactamente el patrón a probar, debe estar contenido en la respuesta o si debe ser una cadena textual. Lo habitual es utilizar la opción de “contiene” ,habilitando la casilla de “No” ,para indicar que no debe aparecer en la respuesta esperada, Es decir, podemos usarlo como lógica inversa, a la hora de validar un mensaje que sabemos de partida que es indicador de fallo.
Una validación que sirve para capturar una respuesta es el muestreador de expresiones regulares. Con esta utilidad se consigue un efecto similar a la correlación de la herramienta Loadrunner. Se basa en el mismo concepto, esto es, definir un patrón de búsqueda en las respuestas a una petición, de manera que se capturen valores dinámicamente. Dichos valores pueden ser usados como validación de un paso o reutilizarse como variables o datos necesarios para seguir con la lógica del proceso
Ilustración 5. Extractor de expresiones regulares
Para verificar que le expresión regular o patrón de búsqueda que estamos usando para localizar un valor en la respuesta es correcto, es muy útil usar la opción “Ver datos de respuesta” del listener “Ver Árbol de Resultados”, seleccionando como formato de salida el de la expresión regular.

Ilustración 6. Expresiones regulares en respuesta capturada por "Ver Árbol de Resultados"
En la casilla marcada como “Regular expression”, podemos incluir el patrón a buscar y ,pulsando el botón “Test”, validaríamos el número de respuestas que corresponden con el mismo.

La siguiente entregá continuará incluyendo código para manejar el flujo de comportamiento. ¡No se lo pierdan!


Si quieres saber más de como depurar scripts visita nuestra nueva entrada

15 comentarios:

  1. Buenos días,

    Tengo instalado el JMeter para trabajar con MyEclipse y a la hora de hacerle el testeo me da los siguientes errores:









    ya me estoy volviendo loco de mirar por todos lados y nadie es capaz de darme una solucion.

    Podrías ayudarme?, muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola

      Lamentablemente ,no conseguimos ver ningún mensaje en el mensaje que nos dejas en el comentario. Pero como recomendación general, lo mejor es ir probando "capa a capa" . Es decir:
      -empieza haciendo funcionar JMeter de la manera más sencilla posible contra una URL que sepas que funciona (sin cifrado, para evitar que pueda ser un punto de error) y grabando .
      -Una vez que puedas descartar cualquier problema relativo a la configuración (Java y los PATH del sistema, que la URL no responda ..etc9 ir "hacia arriba".

      Espero que te sirva de ayuda.

      Saludos

      Eliminar
  2. Buenos días,

    Gracias por responderme, los mensajes de error a lo mejor no salen pq no lo permite el servidor (es un decir). Voy ha intentar explicarme mejor.

    La aplicación lleva años funcionando de forma interna en la empresa el tema es que se ha asumido un cliente que trae con sigo mas usuarios. Lo que se quiere verificar es si unos 250 usuarios podrían estar trabajando de forma concurrente contra la aplicación y contra la BBDD.

    Las pruesbas las estoy haciendo en el servidor de pruebas (valga de rebundancia) siendo este un clon del servidor por el cual se conectaran los nuevos usuarios.

    El aplicativo está programado en Java a traves de MyEclipse, la BBDD está en Oracle y trabajamos contra glasfish.

    Los errores que actualmente se me están produciendo son "Unexpected end of ZLIB input stream"

    ResponderEliminar
    Respuestas
    1. Hola de nuevo

      El error cuyo mensaje incluyes, aparece como un problema de programación tras una búsqueda en Google. Es decir, si es un problema funcional o de operatividad de la aplicación es complicado poder hacer pruebas de rendimiento.

      Si como indicas, la máquian es una copia de la que se usará en Producción , lo ideal es confirmar previamente que tenga el mismo comportamiento que el entorno real.

      Otra cosa es si este problema se te presenta en concurrencia. En ese caso, te sugiero que localices en que puntos de llamada desde la herramienta de pruebas se generan estos mensajes y que se analice el código funcionalmente o incrementando el nivel de trazas.

      Espero que esto te pueda dar una idea de por dónde buscar.

      Saludos.

      Eliminar
  3. Ok, perfecto muchisimas gracias por la ayuda.

    Voy a ver si soy capaz de arreglarlo y te cuento

    Un saludo

    ResponderEliminar
  4. Buenos días,

    He conseguido medio aclarme con todo esto.....

    Al final he tenido q generar los hilos de pruebas con badboy poruq el JMeter daba problemas.

    Ahora mismo el JMeter por pantalla muestra q esta todo OK pero si reviso el jmeter.log da el siguiente error:

    2013/09/17 11:02:48 INFO - jmeter.engine.StandardJMeterEngine: All threads have been started
    2013/09/17 11:02:48 INFO - jmeter.threads.JMeterThread: Thread started: Thread Group 1-1
    2013/09/17 11:02:49 ERROR - jmeter.threads.JMeterThread: Error while processing sampler ':///AdeaNet/block/send-receive-updates' : java.lang.IllegalArgumentException: Host of origin may not be blank
    at org.apache.commons.httpclient.cookie.CookieSpecBas e.match(CookieSpecBase.java:461)
    at org.apache.commons.httpclient.cookie.CookieSpecBas e.match(CookieSpecBase.java:557)
    at org.apache.jmeter.protocol.http.control.CookieMana ger.getCookiesForUrl(CookieManager.java:338)
    at org.apache.jmeter.protocol.http.control.CookieMana ger.getCookieHeaderForURL(CookieManager.java:350)
    at org.apache.jmeter.protocol.http.sampler.HTTPSample r.setConnectionCookie(HTTPSampler.java:357)
    at org.apache.jmeter.protocol.http.sampler.HTTPSample r.setupConnection(HTTPSampler.java:229)
    at org.apache.jmeter.protocol.http.sampler.HTTPSample r.sample(HTTPSampler.java:487)
    at org.apache.jmeter.protocol.http.sampler.HTTPSample rBase.sample(HTTPSamplerBase.java:1037)
    at org.apache.jmeter.protocol.http.sampler.HTTPSample rBase.sample(HTTPSamplerBase.java:1023)
    at org.apache.jmeter.threads.JMeterThread.process_sam pler(JMeterThread.java:346)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterT hread.java:243)
    at java.lang.Thread.run(Unknown Source)

    Esto lo produce con un unico hilo

    ResponderEliminar
    Respuestas
    1. Saludos.

      Yo no te recomendaria usar bad boy, trata de usar el play-record de jmeter, servidor proxy, y depura las peticiones que vas a utilizar en tu test, puedes guiarte haciendo un test manual en el navegador y revisando la consola del navegador, para ver que parametros se envian en cada peticion y a que urls redirige..

      Eliminar
  5. Hola chicos, me encanto el blog!, y estoy teniendo un problema con jmeter, recien lo empiezo a usar y cuando corro el test, el arbol de resultados indica dos errores, (digo errores porque aparecen en rojo), uno es de la Aserción de respuesta indica que un error interno 500, pero la app anda bien, el muestrador me dice:
    Nombre del hilo:persona "Detalle" 2-1
    Comienzo de muestra:2014-04-30 15:34:39 ART
    Tiempo de carga:733
    Latencia:464
    Tamaño en bytes:112789
    Headers size in bytes: 147
    Body size in bytes: 112642
    Conteo de muestra:1
    Conteo de error:1
    Código de respuesta:500
    Mensaje de respuesta:Internal Server Error

    Cabeceras de respuesta:
    HTTP/1.1 500 Internal Server Error
    Content-Type: text/html
    Transfer-Encoding: chunked
    Date: Wed, 30 Apr 2014 18:35:02 GMT
    Connection: close


    HTTPSampleResult campos:
    ContentType: text/html
    DataEncoding: null

    Tienen idea de que puede ser?, muchisimas gracias!

    ResponderEliminar
    Respuestas
    1. Saludos.

      No agregues assercion a la peticion, y prueba, por otro lado
      Cabeceras de respuesta:
      HTTP/1.1 500 Internal Server Error
      Content-Type: text/html

      Esto indica que tu server esta respondiendo mal, revisa la configuración de la petición pudiera ser que apuntas mal al servidor y por eso no responde correctamente

      Eliminar
  6. Hola Laura!.
    Gracias por seguir nuestra opublicación. Respecto a tu pregunta: El error que te aparece en la aserción y marcado como rojo desconozco cúal puyede ser (posiblemente se base en lo que hayas puesto como texto o elemento a validar en la aserción. ) También puede deberse a que si se basa en el código de respuesta HTTP , interpretaré el código HTTP 500 como erróneo (claro )
    Respecto a qué puede estar pasando para que te genere el error ,pero sin embargo la aplicación siga respondiendo correctamente pueden pasarte estas opciones
    !) La petición HTTP previa de tu script , envia algún valor que genera el error HTTP 500 , bien porque le estés pasando algún dato erróneo o porque se produzca un fallo propio del servidor : imagina que es una petición para enviar la edad y que le mandas un valor que no es lógico (tengo -3 años, por ejemplo) .

    2) La ejecución del script ,junto con la actividad del sistema causa un error de servidor , pero este es puntual y sólo afecta a la sesión iniciada por JMeter. Si se produjera de manera masiva podrías llegar a causar la caida de la aplicación o su indisponibilidad si hay un número elevado de estos errores.

    Espero que te pueda dar alguna pista .

    Saludos

    ResponderEliminar
  7. Hola buenas tardes, gracias por la información dada para poder entender mejor JMeter, aun así necesito una ayudita y ver si me pueden orientar, ya que estoy haciendo una grabación que tiene distintos formularios htm ajax y javaxfaces, y cuando lo ejecuto la mayoría de estos formularios me cargan correctamente con la información que se les ingreso mas las variables reemplazadas en algunos parámetros, pero tengo un formulario que no me deja avanzar mostrandome error 500: The server encountered an unexpected condition which prevented it from fulfilling the request.
    Por favor se agradece si me pudieran ayudar y lo peor de todo no me muestra ningún tipo de error de parámetro todo esta bien no se que mas hacer.

    Muchas gracias y saludos

    ResponderEliminar
  8. Ante todo, saludos y gracias por seguir nuestro blog.
    Respecto al problema que ns comentas , aunque es dificil de decir lo que te puede estar pasando al ser una aplicación con AJAX/Javafeces , lo primero que se me pasa por la cabeza es comprobar si alguno de los parámetros o valores pasados en alguna de las peticiones es calculada dinámicamente en algún javascript local. Por las particularidades de este tipo de aplicaciones puede presentarse esa situación y las soluciones son
    1)Localizar el valor erróneo que se envia e intentar correlacionarlo con el javascript que lo genera dinámicamente . En se caso , ver si se puede generar un beanshell scipt que lo calcule según la fórmula del javascript y que lo utilice como una variable más
    2) Comprobar mediante alguna otra herrramienta las peticiones HTTP que se reciben /envían y confirmar si te falta algún otro parámetro que no hayas tenido en cuenta.

    Espero que te pueda ser de ayuda.

    ResponderEliminar
    Respuestas
    1. Antonio muchas gracias por tu ayuda, te comento después como me va.

      Saludos

      Eliminar
  9. Nombre del hilo:Grupo de Hilos 1-1
    Comienzo de muestra:2015-02-26 14:16:48 CST
    Tiempo de carga:58
    Latencia:58
    Tamaño en bytes:242
    Headers size in bytes: 242
    Body size in bytes: 0
    Conteo de muestra:1
    Conteo de error:1
    Código de respuesta:403
    Mensaje de respuesta:Forbidden

    Cabeceras de respuesta:
    HTTP/1.1 403 Forbidden
    Date: Thu, 26 Feb 2015 20:25:17 GMT
    Server: Apache/2.4.10 (Unix) PHP/5.6.2
    X-Powered-By: PHP/5.6.2
    Content-Length: 0
    Keep-Alive: timeout=5, max=96
    Connection: Keep-Alive
    Content-Type: text/html; charset=UTF-8

    Hola, tengo un gran problema al ejecutar un script en jmeter, grabe el script paso a paso, pero al correrlo me sale varias alertar iguales a esta y no se cual sea el error, es un sistema que realiza registros y la alerta sale justo en el login y no realiza el registro, agradecería mucho si pudieran dar luz para que pueda resolver este problema gracias
    HTTPSampleResult campos:
    ContentType: text/html; charset=UTF-8
    DataEncoding: UTF-8

    ResponderEliminar
    Respuestas
    1. Es un poco o difícil dar una respuesta sin conocer datos sobre la arquitectura de la aplicación. El error que estás recibiendo es porque estas intentando acceder de manera era incorrecta a la aplicación, seguramente porque junto con la petición de login se envía información grabada que en el momento de la ejecución ya no es válida.

      Una pista de lo que esta pasando nos lo puede proporcionar una nueva grabación. Comparando la información grabada en ambas sesiones podemos detectar las diferencias. Esas diferencias son candidatas a ser correlacionadas (capturadas, almacenadas en una variable y utilizadas en el resto del script).

      Mucha suerte y gracias por leer nuestro blog.

      Eliminar