JMeter – Arrancando con BeanShell


En los últimos días un visitante del blog consulto sobre el uso de los BeanShell, como el tema es muy extenso como para poder responder su comentario quedamos en que se lo enviaba por mail. En base a ese material que ya le envié a la persona que lo necesitaba me pareció bueno armar este post para que cualquiera que tenga algún inconveniente con los Beanshell pueda tener una guía a seguir.

Instalación

Desde la web de Beanshell podemos descargarlo y debemos colocar el jar en la carpeta %JMETER_HOME%/lib. (para los ejemplos de este post baje el jar «bsh-2.0b4.jar»)

Pueden visitar la web oficial para encontrar más información sobre beanshell.

Overview

BeanShell es un interpretador dinámico de Java, además de un lenguaje de scripting y un ambiente flexible, todo en un simple paquete .

Los BeanShell nos permiten extender las funciones de JMeter hasta donde nosotros deseemos, ya que mediante la programación de estos elementos en Java, el único límite es nuestra capacidad para codificar.

Cada elemento BeanShell tiene su propia copia del intérprete (para cada hilo). Si el elemento es llamado en repetidas ocasiones (por ejemplo, dentro de un bucle) el intérprete se mantiene entre las invocaciones a menos que la opción «reset bsh. Interpreter antes de cada llamada» este seleccionada.
Algunas pruebas de larga duración pueden provocar que el intérprete utilice mucha memoria, si este es el caso, hay que probar con la opción de reiniciar activada.

El código Java que utilicemos se puede probar fuera JMeter utilizando el intérprete de línea de comandos:

$ java -cp bsh-xxx.jar[;other jars as needed] bsh.Interperter file.bsh [parameters]

o con la siguiente linea:

$ java -cp bsh-xxx.jar bsh.Interperter
bsh% source("file.bsh");
bsh% exit();

¿Que BeanShell utilizar?

La ubicación va a depender del momento en que necesitamos  que se ejecute el código. Vamos a poner un BeanShell Preproccesor si adjuntamos el mismo como hijo del sampler donde vamos a usar el valor que nos devuelva el beanShell en el próximo sampler.
En el caso que el beanshell utilice un valor devuelto por un sampler, podemos adjuntarle  como listener del sampler en el que se extrae la información con un extractor de expresiones regulares (el beanshell se ejecutará antes del post-procesador). Si lo ponemos como PostProcesador y se ejecutará después del extractor de expresiones regulares.

Otra opción para aprovechar los beneficios de los Beanshell es llamar al interprete por medio de la función
${__BeanShell(Código)}, por ejemplo ${__BeanShell(123*456)} que devolvería 56088 y nos permite hacer uso desde cualquier lugar de JMeter.

Comportamiento general de todos los BeanShell

Antes de ejecutar el script del BeanShell, el contenido del campo «Parameters» se guarda en una variable homónima. También se setean una serie de valores por default.

Cuando se termina de ejecutar el script, se devuelve el control al sampler y copia el valor de las variables y copia el resultado final de las variables indicando si el script se ejecutó en forma correcta o no.

BeanShell Sampler

Nos permite escribir un sampler usando el lenguaje Beanshell.

BeanShell Listener

Nos permite utilizar codificación BeanShell para procesar guardar lo procesado por los samplers.

BeanShell Assertion

Nos permite utilizar codificación BeanShell para validar las respuestas.

BeanShell Timer

Nos permite utilizar codificación BeanShell para generar delays.

Pueden encontrar un ejemplo aquí.

BeanShell PreProcessor

Nos permite utilizar codificación BeanShell para ejecutar acciones arbitrarias previas a la ejecución del sampler que le prosigue.

BeanShell PostProcessor

Nos permite utilizar codificación BeanShell para ejecutar acciones arbitrarias luego de la ejecución del sampler que le antesigue.

Ejemplos:

Código para crear MD5 Hash

import java.security.MessageDigest;
import java.math.BigInteger;
String plaintext = vars.get("time") + "1js3kl23";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
vars.put("timehash",hashtext);

Código para acceder al body de un HttpRequest y modificarlo

sampler = ctx.getCurrentSampler ();
args = sampler.getProperty ("HTTPsampler.Arguments");
httpArg = args.getObjectValue ().getArguments ().get (0);
body = httpArg.getObjectValue ().getProperty ("Argument.value").getStringValue ();

Código para crear un log
import java.io.*;

public class SniffTest
{
public void makefile()
{
try{
String outfile = «C:output1.txt»;
BufferedWriter out = new BufferedWriter(newFileWriter(outfile));
out.write(«${sitemap}»);
out.close();
print(«${sitemap}»);
}
catch(Exception e){
}
}
}

Manejo de fechas

java.util.Calendar c = java.util.Calendar.getInstance();
c.setTime(new Date(System.currentTimeMillis()));
c.add(Calendar.DAY_OF_YEAR,+1);

s = (new java.text.SimpleDateFormat(«yyyyMMdd»)).format(c.getTime());
vars.put(«start_date», s);

t = (new java.text.SimpleDateFormat(«yyyy-MM-dd»)).format(c.getTime());
vars.put(«start_date2», t);

u = (new java.text.SimpleDateFormat(«HH:mm»)).format(c.getTime());
vars.put(«start_time», u);

u = (new java.text.SimpleDateFormat(«HHmm»)).format(c.getTime());
vars.put(«start_time2», u);

4 comentarios sobre “JMeter – Arrancando con BeanShell

  1. Hola, mencionas en el post que nuestro límite es la capacidad para codificar, en mi caso, solo he hecho pruebas funcionales y apenas empiezo con pruebas de carga en Jmeter.
    En otro post tuyo, leí que es posible escanear una carpeta con BeanShell preprocesor, pero no tengo idea de cómo hacerlo. Lo que necesito es que se scanee un directorio donde tengo XML y se manden a un webservice.
    Gracias de antemano.
    Saludos!

    Me gusta

    1. Sandra,

      Si son tus primeros pasos en pruebas de performance y con JMeter, te recomiendo que arranque por lo básico de grabación, ejecución y recolección de datos de un escenario simple y no ir directamente a los BeanShell. En caso de que sea muy necesario de que utilices BeanShell, te recomiendo que busques ayuda con los DEVs de tu equipo.

      Saludos,

      José

      Me gusta

Deja un comentario

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