Funciones Nativas de JMeter (parte 1)
Table of Contents
Intermedio - This article is part of a series.
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:
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:
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:
El script de JMeter con ejemplos de funciones de cáculos requiere Java 1.8+, JMeter 5+ and JMeter plugins.