Orden de ejecución en JMeter

ejecucion-title

Quizá, uno de los problemas más comunes en JMeter es el desconocimiento del orden de ejecución, esto es muy recurrente sobre todo al querer obtener resultados concretos por hilo o por grupo de hilos. Primero debemos de entender que JMeter ejecuta el test plan o script de manera secuencial, pero dentro de esta secuencia existe un orden y una jerarquía que es respetada en forma de árbol.

El orden de ejecución lo puedes encontrar en esta referencia, apartado 3.9 y es el siguiente:

  1. Elementos de configuración
  2. Pre-Procesadores
  3. Temporizadores
  4. Muestreadores
  5. Post-Procesadores (a menos que la respuesta sea nula)
  6. Aserciones (a menos que la respuesta sea nula)
  7. Receptores (a menos que la respuesta sea nula)

Esto quiere decir que primero se ejecutará cualquier elemento de configuración al nivel del plan de pruebas o test plan y de igual forma conforme descienda la secuencia en los niveles inferiores del árbol. En segundo término se ejecutará los pre-procesadores, aunque estos suelen encontrarse casi siempre unidos a un muestreador debido a que amplian o modifican su alcance.

En tercer lugar tenemos a los temporizadores y le dedicó un párrafo completo debido a que es muy común encontrar un test plan con más de un temporizador, sí bien es factible o posible tener múltiples temporizadores, no es recomendable tenerlos a un mismo nivel. Sí quieres que un temporizador afecte única y exclusivamente a un muestreador, este deberá encontrarse en el nivel inferior al mismo. De encontrarse uno o más de un temporizador al mismo nivel estos tiempos se sumarán y podría afectar gravemente tus resultados.

En cuarto sitio tenemos a los muestreadores y es aquí donde empezamos a ver resultados en los receptores, debido que estas son las peticiones que enviamos a los servidores en el protocolo seleccionado. En quinta posición se encuentran los post-procesadores, a partir de esta posición es necesario que el muestreador arrojé algún dato de salida, en caso de ser nulo estos posiblemente fallarán. En este sitio se ubican todos los extractores que se utilizan para realizar las correlaciones, debido a que los mismos requieren de información para extraer los valores que servirán en adelante.

Una vez extraída la información requerida, se ejecuta la sexta y penúltima posición que son las aserciones, estas nos sirven para validar la respuesta recebida, al buscar valores específicos dentro de la misma y actuar con base a ello. En el séptimo y último puesto tenemos a los receptores, en dónde podemos visualizar las peticiones y respuestas de las peticiones, el receptor más útil para ello es el visualizador de resultados en árbol.

Es muy importante familiarizarse y conocer esta secuencia de ejecución, porque se repetirá en cada nivel del árbol. Existen componentes que heredan sus valores a los niveles inferiores, como es el caso de los temporizadores, los cuales impactan a los muestreadores en todos sus subniveles, como podemos ver en la siguiente imagen:

ejecucion-ejemplo

En el ejemplo anterior solo tenemos un temporizador a nivel del grupo de hilos, este no solo afectará a los muestreadores de peticiones HTTP 1, 4, 5, "Debug" y "JSR223", también impactará a los muestreadores de peticiones HTTP 2 y 3 que se encuentran dentro del "Controlador de Transacción", es fácil de corroborar esto pues en el recuadro rojo podemos ver el tiempo total de ejecución el cual es de 36 segundos, y el temporizador fue configurado a 5 segundos, que fue invocado por los 7 muestreadores dando un total de 35 segundos de espera + 1 segundo de tiempos de respuesta.

No importa cuántos subniveles existan los temporizadores siempre heredarán sus valores, otro par de ejemplos de herencia serían el HTTP Header Manager y el HTTP Request Defaults, para el caso del administrador de encabezados podríamos colocar un solo componente a nivel del plan de pruebas que afectaría a todos los grupos de hilos para que utilizarán un valor único del User-Agent para todas los peticiones HTTP o HTTPS. De igual forma la petición por definición substituirá los valores del protocolo y/ó dirección IP y/ó nombre del servidor y/ó puerto que se utilizarán en todas las peticiones HTTP, siempre y cuando se encuentren vacios en los muestreadores HTTP.

En un futuro generaré una entrada exclusivamente para hablar más detalladamente acerca de las ventajas de utilizar la herencia, sobre todo para reutilizar los scripts en diferentes ambientes de prueba.

-Antonio