Funciones Nativas de JMeter parte 1

title

Decidí dejar la traducción literaria en este caso porque me parece que la idea original sigue intacta. Al contrario en algunas partes le agregue más información que he recabado desde que se publicó este artículo hace casi 1 año. Aquí puedes ver la versión original de la publicación en idioma inglés

Hace tiempo, cuando me inicié en JMeter. Pensé que debía de hacer mi propio código para todas las funciones que necesitará desarrollar en mis scripts. Me encontraba desarrollando funciones en Beanshell para cada reto enfrentado, debido a que las funciones de JMeter no eran tan populares o "buenas" para tareas básicas. Pero versión a versión estás funciones fueron creciendo en número y capacidad, volviéndose soluciones comprensibles para una gran variedad de requerimientos de prueba.

En estos tiempos, no puedo crear un script de JMeter sin utilizar al menos un par de funciones nativas. Son tan populares que también se utilizan para preguntas de entrevistas laborales o técnicas. A lo largo de esta publicación espero poder describir algunos de sus usos más comunes y como sacar provecho de ello.

¿ Qué es una función de JMeter?

Una función de JMeter es una evaluación que regresar un valor o un resultado. Estas funciones pueden cubrir una variedad de necesidades, como de información de la prueba, lógica, variables y/o propiedades, por nombrar algunas.

¿ Dónde puedo utilizar las funciones de JMeter ?

Las funciones de JMeter se pueden utilizar en cualquier componente del test plan, que siga en el orden de ejecución. En otras palabras, la orden de ejecución de JMeter debe pasar por ese componente para ejecutar la función.

Primeramente, debemos agrupar las funciones por el tipo de función o funcionalidad. Eso podrá darnos una mejor idea de dónde utilizarla. También les proporcionaré algunos ejemplos que le develarán cómo manejarlas y complementen su aprendizaje.

Podemos clasificar las funciones en 7 tipos:

Type Tipo Descripción
Information Información Regresa valores del entorno del plan pruebas
File Input Entradas por archivo Manipulación de entradas por medio de archivos
Calculation Cálculos Generación aleatoria de datos, fechas o números, también manipulación numérica
Scripting Lenguajes de programación Lógica de programación en los lenguajes soportados por JMeter
Properties Propiedades Manipulación de variables globales
Variables Variables Manipulación de variables locales
Strings Cadenas de carácteres Formateo y manipulación de cadenas de texto

Aquí las funciones de JMeter que cubriremos en esta publicación:

funciones

1. Funciones de información

Las funciones de información se vuelven particularmente útiles para identificar los datos del hilo o grupo de hilos en ejecución, la dirección IP del generador de carga o su nombre del servidor, u obtener la hora local en múltiples formatos. Yo diría que estas funciones son la ley cuando debugeamos un script. Por ejemplo, la función de bitácora (log) nos habilita poder enviar por medio de un mensaje los datos de cualquier nivel de detalle a la bitácora jmeter.log

Los datos regresados para la mayoría de las funciones es obtenida directamente del servicio de contexto de JMeter, el cual es como un servicio API que contiene toda la información de la prueba e hilos. Si tu quieres un valor en particular de algún hilo o grupo de hilos puedes acceder a su información, cada uno de ellos contiene su propio contexto en donde se almacenan todos sus datos.

Ejemplos de las funciones de información:

Función Ejemplo Resultado esperado
threadNum ${__threadNum} Un valor numérico del identificador del hilo en ejecución
threadGroupName ${__threadGroupName} Cadena de caracteres del nombre del grupo de hilo en ejecución
samplerName ${__samplerName} Nombre del muestreador en ejecución
machineIP ${__machineIP} Dirección IP del equipo o generador de carga
machineName ${__machineName} Nombre del equipo o generador de carga
time ${__time} Despliega la hora local del equipo o generador de carga en formato EPOCH
time ${__time(dd-MM-YYYY,)} Despliega la hora local del equipo o generador de carga en formato dd-MM-YYYY
timeShift ${__timeShift(dd-MM-YYYY,,P4D,,)} Con base en la hora local del equipo se aumentan 4 días, con formato dd-MM-YYYY
timeShift ${__timeShift(dd-MM-YYYY,,P-6D,,)} Con base en la hora local del equipo se restan 6 días, con formato dd-MM-YYYY
log ${__log(Hello World)} Despliega "Hola Mundo" en el nivel por definición INFO
logn ${__logn(${TESTSTART.MS},ERR)} Despliega el inicio de la prueba, en el nivel ERR

Así mismo incluimos imágenes de los ejemplos y el archivo lo puedes descargar abajo:

information-setup
information-response

El script de JMeter con ejemplos de funciones de información requiere Java 1.8+, JMeter 5+ and JMeter plugins.

2. Funciones de archivos de entrada

Cuando se manejan grandes volúmenes de datos, siempre es recomendable utilizar datos estáticos por archivos. Esos valores pueden ser entregados a JMeter por medio de ficheros separadors por comas (CSV), cada renglón será leído y segmentado para guardar los valores en variables. No soy un fan del uso de archivos CSV o similares para los scripts, personalmente prefiero generar mis propios datos aleatoriamente.

Sin embargo, hay ocasiones en las que no contamos con otra opción o tenemos opciones limitadas al uso de entradas externas. Pero tampoco hay que abusar de estas soluciones porque si la entrada es de tamaño considerable podría ocupar gran parte de nuestros recursos, en particular consumir mucha memoria RAM. En contaste accesando a ellos renglón por renglón con las funciones CSVRead o todo el archivo con StringFromFile.

Ejemplos de las funciones de archivos de entrada:

Función Ejemplo Resultado esperado
StringFromFile ${__StringFromFile(file.txt,RowAsString,,)} Lee el archivo file.txt y guarda el primer renglón en la variable RowAsString, se incrementa por iteración
FileToString ${__FileToString(filex.txt,FileAsString,,)} Lee el archivo file.txt y guarda todo el contenido en la variable FileAsString
CSVRead ${__CSVRead(file.csv,0)} Regresa la columna 0, del primer renglón del archivo file.csv, se incrementa por iteración
XPath ${__XPath(file.xml,..//[@id=book]/div/a)} Regresa el valor de la evaluación del Xpath en el archivo file.xml
StringToFile ${__StringToFile(file.out,"Hello World")} Escribe "Hola Mundo" en el archivo file.out, también se pueden escribir variables

3. Funciones de cálculos

Los cálculos matemáticos o valores aleatorios son a menudo necesarios para nuestra lógica de negocio. Por ejemplo, pensemos en el número de boletos de avión o para un concierto que vamos a comprar. Ese requerimiento pudiera ser fácilmente solventado con la generación de un valor aleatorio entre 1 y 10. Pero esta función tiene sus limitantes, de ninguna manera lo recomendaría para generar un número de tarjeta de crédito de 16 dígitos. Para ello hay otras funciones que lo harían de manera mucho más fácil y eficientemente, como por ejemplo RandomString.

Si estás manejando fechas, o eventualmente necesitas calcular una fecha en el futuro, pero dentro de un rango de tiempo. La función RandomDate es la solución ideal. Yo personalmente utilizo esta función en conjunto con la función timeShift para calcular una fecha dentro del rango de 10 a 60 días en el futuro, y eso sería algo como esto.

      ${__RandomDate(MM/dd/YYYY,${__timeShift(MM/dd/YYYY,,P10D,,)},${__timeShift(MM/dd/YYYY,,P60D,,)},,)}

Adicionalmente, si requieres llevar la cuenta particular de un número preciso de iteraciones o peticiones sobre un servicio o producto. La función counter pudiera ser utilizada dentro de la petición involucrada y así llevaremos la cuenta secuencial de las ocurrencias o invocaciones. Esta variable pudiera crecer por hilo o grupo de hilos, dependiendo de nuestras necesidades.

Ejemplos de las funciones de cálculos:

Función Ejemplo Resultado esperado
counter ${__counter(TRUE,C1)} Contador de ejecuciones por hilo
counter ${__counter(FALSE,C2)} Contador de ejecuciones por grupo de hilos, opción por definición
digest ${__digest(MD5,Test1234,,,)} Encripción de el texto "Test1234", utilizando MD5
digest ${__digest(SHA-256,Test1234,mysalt,,)} Encripción de el texto "Test1234", utilizando SHA-256 con una salt
intSum ${__intSum(10,20,IntSum)} Despliega la suma de dos números enteros, también guarda el resultado en la variable IntSum
longSum ${__longSum(65535,65535,LongSum)} Despliega la suma de dos números enteros, también guarda el resultado en la variable LongSum
RandomDate ${__RandomDate(,,2021-01-01,,)} Generación aleatoria de una fecha entre el día de hoy y 2021-01-01
RandomFromMultipleVars ${__RandomFromMultipleVars(Var1|Var2,)} Escoge una variable aleatoria y despliega su resultado
RandomString ${__RandomString(16,1234567890,)} Genera una cadena de 16 caracteres y en cada posición se elige aleatoriamente un valor de la entrada
RandomString ${__RandomString(16,abcdefghijkl,)} Genera una cadena de 16 caracteres y en cada posición se elige aleatoriamente un valor de la entrada
UUID ${__UUID()} Genera un UUID aleatorio de 16 bytes o 128 bits

Así mismo incluimos imágenes de los ejemplos y el archivo lo puedes descargar abajo:

calculations-setup
calculation-response

El script de JMeter con ejemplos de funciones de cáculos requiere Java 1.8+, JMeter 5+ and JMeter plugins.

Continuara...

-Antonio