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);
Hola tienes mas ejemplos esta funcionalidades o la pratica con estos artefactos ya depende de cada uno en la forma de aplicar el codigo?
Me gustaMe gusta
Javier,
En la pagina que puedes ver en el post (http://www.beanshell.org) hay una gran cantidad de ejemplos y practicas, luego, dependerá de tu necesidad adaptar los mismos para que sean útiles en tus pruebas.
Saludos!
José
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta