while java testing jmeter beanshell

java - while - jmeter variables



¿Cómo paso una variable de un grupo de subprocesos a otro en JMeter? (9)

Bueno, esta es una forma de hacerlo; siga estos pasos y funcionará, ¡más tarde puede ajustarlo a sus necesidades! Las variables no se comparten entre subprocesos (JMeter llama a esto una característica probablemente :)). ¡Pero las propiedades son! Así que establece tu variable como una propiedad así:

1) Haga clic en su plan de prueba y habilite ''Ejecutar grupos de subprocesos consecutivamente'' -> esto hace que los grupos de subprocesos se ejecuten de forma ordenada y no aleatoria. (Más tarde puede ajustarlo, pero por ahora para que funcione ...)

2) crear un grupo de hilos llamado ''configuración'', por ejemplo; en ese grupo de hilos, agregue una muestra de BeanShell con el siguiente código:

import org.apache.jmeter.util.JMeterUtils; JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");

¡Así que ahora la propiedad ha sido establecida! Si el valor que desea almacenar como propiedad es una variable ya establecida (variable definida por el usuario o variable reqex, por ejemplo), puede hacer lo siguiente:

JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));

3) agregue una "prueba real" de un grupo de prueba, por ejemplo, con un número de subprocesos superiores a 1; agregue una prueba y a esa prueba agregue un preprocesador de BeanShell con el siguiente código:

import org.apache.jmeter.util.JMeterUtils; vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));

Así que ahora ha creado una variable en ese hilo llamada theNameOfYourNewProperty, que tiene el valor de la propiedad del sistema theNameOfYourNewProperty. En su prueba, ahora puede acceder a ella como:

${theNameOfYourNewProperty}

Y funcionará para cada hilo, no solo el primer hilo ...

Tengo una prueba de JMeter con 2 grupos de subprocesos: el primero es un solo subproceso (lo que crea cierto inventario) y el segundo tiene varios subprocesos (que compran todo el inventario). Uso Aserciones de BeanShell y Extractores de XPath para analizar el valor devuelto (que es XML) y las variables de la tienda (como los ID de los artículos que se comprarán).

Pero, los valores que se crean en el primer Grupo de subprocesos, ya sea extraídos en variables de tipo ${jmeter} estándar, o ${__BeanShell(vars.get("jmeter"))} tipo vars, no están disponibles en el segundo Grupo de subprocesos. ¿Hay alguna forma de crear una variable en el primer grupo de subprocesos y hacerla visible para el segundo?


Démosle al tema una segunda vida :) Otra forma de transferir variables entre hilos es escribir / leer en un archivo. Pasar variables entre hilos


De acuerdo con la documentación de JMeter:

16.12 Compartir variables entre subprocesos y grupos de subprocesos

Las variables son locales a un subproceso, una variable establecida en un subproceso no se puede leer en otro. Esto es por diseño. Para las variables que se pueden determinar antes de que se inicie una prueba, ver Pruebas de parametrización (arriba). Si no se conoce el valor hasta que se inicia la prueba, hay varias opciones:

  1. Almacenar la variable como una propiedad: las propiedades son globales para la instancia de JMeter
  2. Escriba variables en un archivo y vuelva a leerlas.
  3. Utilice el espacio de nombres bsh.shared; consulte 16.8.2. Compartir variables.
  4. Escribe tus propias clases de Java

Otra forma de pasar la variable entre los hilos es usar plugins de jmeter como lo menciona Andrey Botalov a continuación .

Pero encontré que es un poco confuso usarlo por primera vez, pero da un control total de la variable durante el paso de un hilo a otro. Sigue mi ejemplo con el uso de BeanShell y verás qué fácil es:

A continuación, refiérase a las secciones de la imagen siguiente:

(1.1) Aquí he creado variables personalizadas en Variables definidas por el usuario (o puede hacerlo con BSF Proccessor - deshabilitado en este ejemplo (1.2))

(2.1) (2.4) Utilicé con éxito la variable en el primer hilo, nada especial :)

(2.2) Agregué BeanShell PostProcessor y personalicé mi variable

(2.3) Se agregó a la cola

(3.1) En el segundo subproceso, la variable se toma de la cola, con el nombre que desee. Pero ten cuidado, usa Timeout con prudencia, porque este hilo esperará hasta el final anterior para que pueda modificarse la variable (experimentar con una respuesta larga)

(3.2) (3.3) (3,4) Que los pasos repetidos de usar y modificar variable

(3.5) La variable se envía una vez más en la nueva cola, así que proporcione un nuevo nombre.

(4.1) (4.2) (4.3) La variable modificada tomada de la cola nueva funciona como el encanto

Advertencia

  1. Si agrega más subprocesos, agregue un grupo de contador a subproceso con variable y agregue este nombre de variable al nombre de la cola: haga lo mismo en el grupo de subprocesos donde intenta capturar la cola para que la cola tenga un nombre único para cada subproceso (escriba un comentario si necesita una explicación más clara)

  2. Si tiene más de una solicitud HTTP en un grupo de subprocesos, agregue el preprocesador de comunicación de subprocesos como elemento secundario de la última (u otra si desea lograr algo personalizado) Solicitud de http

Juega, modifica, personaliza para obtener el mejor resultado :) Agregar más hilos puede provocar un comportamiento no deseado, por lo que debes estar atento.


Encontré cuál creo que es la manera más simple de hacer esto.

Utilizar

Bean Shell PostProcessor

para establecer la variable ( http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables )

import org.apache.jmeter.util.JMeterUtils; JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");

O si estás leyendo de una variable

import org.apache.jmeter.util.JMeterUtils; JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));

Y luego desde el otro grupo de hilos, léelo a través de ( http://jmeter.apache.org/usermanual/functions.html#__property )

${__property(PC_CREATED_PROMO_CODE)}


Esto no es posible en JMeter, porque no es un comportamiento normal del cliente (compartiendo parámetros entre Threads). En lugar de esto, use un Thread-Group with Controllers:

Thread Group + Create inventory + + XPath + Loop + + Purchase inventory


JMeter Plugins tiene una comunicación entre subprocesos para este propósito.

Hay 2 métodos para usarlo:

  • PostProcesador / Preprocesador
  • Funciones __fifoPut y __fifoPop

En mi opinión, PostProcessor / PreProcessor es más fácil de usar.


No pude hacer esto con variables (ya que son locales a hilos individuales). Sin embargo, ¡pude resolver este problema con propiedades!

Nuevamente, mi primer ThreadGroup hace toda la configuración, y necesito que parte de la información de ese trabajo esté disponible para cada uno de los hilos en el segundo ThreadGroup. Tengo una Afirmación BeanShell en el primer ThreadGroup con lo siguiente:

${__setProperty(storeid, ${storeid})};

El $ {storeid} se extrajo con un XPath Extractor. La afirmación de BeanShell hace otras cosas, como verificar que storeid fue devuelto de la llamada anterior, etc.

De todos modos, en el segundo ThreadGroup, puedo usar el valor de la propiedad "storeid" en Samplers con lo siguiente:

${__property(storeid)}

¡Funciona de maravilla!


Otra solución es usar Simple Table Server para administrar el conjunto de datos. Esta característica fue agregar los plugins 1.2 JMeter.

"La idea principal es utilizar un pequeño servidor http en JMeter Plugins para administrar los archivos del conjunto de datos con comandos simples para obtener / agregar filas de datos en los archivos"

Mira la documentación: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

Saludos.


Simplemente agregue una afirmación de shell de bean use una función de propiedad para asignar el valor a una variable (como una variable global) que mantendrá el valor incluso después de que vaya a otro hilo.

grupo de hilos >> Agregar >> Afirmaciones >> Afirmación de shell de frijoles

${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}

y luego en el otro hilo puede llamar a esta variable global y puede usarla

a continuación está la función que necesita usar para llamar al valor almacenado:

${__property(global_variable_name)}

https://medium.com/@priyank.it/jmeter-passing-variables-between-threads-a4dc09903b59