Funcionalidades Nativas do JMeter (Parte 2)
Tabela de conteúdos
intermediário - This article is part of a series.
Bem-vindo à segunda parte dos funções nativas do JMeter. Espero que esta publicação conclua a descrição das funcionalidades que nos ajudarão a resolver complexas lógicas para nossos requisitos de teste sem mais nada, deixando o quadro das funcionalidades que abordaremos nesta publicação:
4.- Funções de Programação #
Esta é provavelmente a função mais controversa da JMeter porque são muito amplas e podem levar a infinitos possíveis. Não podemos entrar nisso, pois há inúmeras maneiras de usá-las, mas gostaria de mostrar alguns casos onde essas funções funcionam bem com IF e WHILE.
As opções de linguagens de programação são: Beanshell, Groovy, JavaScript e JEXL. Isso é por isso que podemos escolher o nosso preferido para lidar com qualquer lógica complexa ou simples. No entanto, provavelmente usaremos apenas algumas linhas de código no máximo. Por quê? Porque se você quiser usar mais do que isso, recomendo melhor usar pre-processador, módulo de leitura prévia ou post-processador.
Beanshell #
Beanshell é um interpretador de Java criado 20 anos atrás e o último conhecido update foi lançado em 2003. Obviamente, está obsoleto mas ainda funciona. Eu aprendi JMeter juntamente com Beanshell no início de 2012 até 2017 quando Groovy tomou posse e sua eficiência e velocidade rapidamente superaram Beanshell, especialmente se o código compilado é cacheado. Por mais que tenha usado Beanshell para lidar com quase todos os requisitos lógicos em fluxos, principalmente como pré-processador ou post-processador, raras vezes como mule, pois não gostava de sua influência nos resultados.
Groovy #
É estranho, mas o Groovy foi lançado no mesmo ano que a última versão estável de Beanshell, que foi lançada em 2003. Desde então, o Groovy se tornou o linguagem de script mais popular para JMeter. Alguns dos seus principais benefícios incluem:
- É uma linguagem orientada a objetos.
- Compila diretamente em bytecode como rápido que o código Java.
- Cacheia o código compilado.
- Manutenção e atualização constantes.
Hoje não há lugar para comparar entre Groovy e BeanShell porque BeanShell não foi atualizado mais de 16 anos. No entanto, a única situação em que recomendaria usar BeanShell seria quando se trata de scripts de JMeter de versão antiga que não podem ser migrados para novas versões de JMeter. Nesses casos, recomendo migrar para Groovy, pois é mais rápido e não requer muita mudança no código; porque Groovy reconhece quase todos os sintaxes do BeanShell.
javascript #
JavaScript ou ECMAScript é outra linguagem interpretada que pode ser usada em JMeter. Basicamente, os controles IF e WHILE avaliam a expressão com esta linguagem para permitir que as threads continuem, saírem de loops ou sejam redirecionadas para algumas branches. Apesar de ser uma excelente linguagem, o sampler JSR223 só permite cachear apenas por Groovy, tornando JavaScript menos eficiente para repetições grandes. De acordo com minha opinião, é melhor usar JavaScript para pequenas avaliações mas não para tarefas complexas.
JEXL #
JEXL significa Linguagem de Expressões Java. É o linguagem de programação mais limitada, mas isso é exatamente o que torna ela tão popular; sua simplicidade. O código é pequeno e rápido, avaliando uma expressão booleana, e provavelmente a maioria das utilizações com JEXL em JMeter, embora também possa ser usada em modelos de carga ou declarações de avaliação.
exemplos de funções de linguagens de programação:
Função | Exemplo | Resultado Esperado |
---|---|---|
Groovy | ${__groovy(props.get(“START.MS”).substring(0\,2),)} | Imprime a substring 0-2 do propriedade START.MS |
BeanShell | ${__BeanShell(123*456,)} | Imprime o resultado da multiplicação de 123x456 |
JavaScript | ${__javaScript(new Date(),)} | Imprime uma nova data em formato extenso |
Jexl2 | ${__jexl2(1 < 1,)} | Imprime o resultado da avaliação: False |
Jexl3 | ${__jexl2(1 >= 1,)} | Imprime o resultado da avaliação: True |
Todos os linguagens de programação têm acesso a recursos do JMeter. A tabela seguinte descreve a relação entre recursos e linguagens de programação:
Populares Usos:
Se você está usando controles IF
ou WHILE
, esses controles exigem uma declaração baseada em um valor booleano para decidir se continuar ou descartar, então os melhores opções para este tarefa seriam JavaScript
e JEXL
, embora possamos usar qualquer. No entanto, sempre tenha cuidado ao selecionar a opção para avaliar a declaração como uma variável de expressão. Alguns usos populares incluem:
Aqui está um exemplo do script WebTours que usa um modelo de carregamento com CONTROLLERS IF. O script para JMeter com exemplos de usar CONTROLLERS IF para modelar e distribuir carregamentos requer Java 1.8+, JMeter 5+ e plugins.
Por que usar o Controle Se em vez do Controle de Trafego? #
Isso é uma boa pergunta, mas responder a ela não é fácil. Personalmente, eu acho que o Controle de Trafego realiza muitas contas para determinar se parte da fluxo deve ou não ser executada, baseando-se em execuções anteriores, contagem de iterações por propriedades e avaliações para corrigir valores. Este consumo de recursos CPU e memória é muito maior se houver múltiplos Controles de Trafego na mesma script para modelar carga. No entanto, o Controle Se apenas realizará uma avaliação usando JEXL para calcular e decidir se a porcentagem gerada pelo variável aleatória está dentro do intervalo ou não. Além disso, enquanto o Controle de Trafego requer um número mínimo de execuções como base para corrigir a tendência se você parar o teste antes da expectativa, ele é incapaz de corrigi-lo. Em contraste, com um Controle Se em qualquer momento, os números gerados aleatoriamente devem satisfazer ou não, baseando-se na distribuição uniforme.
5.- Funções de Propriedade #
Na JMeter, as propriedades são como variáveis em um ambiente global. Isso significa que todos os threads podem acessar essas valores e também atualizá-los. Muitos desses “propriedades” são definidos a partir dos .properties encontrados na pasta bin, como user.properties e jmeter.properties. Lembre-se de reiniciar JMeter se você atualizar algum desses valores.
Não recomendamos modificar nenhum parâmetro sem ter a certeza exata sobre o que está fazendo, pois isso pode afetar negativamente o comportamento de JMeter e consequentemente os resultados. Apesar da existência de um risco latente em modificar esses propriedades, a vantagem dessa configuração é bastante ampla, sendo uma das mais comuns utilizadas ser configurar o número de threads, ramp-up ou duração do script, como podemos apreciar neste artigo.
jmeter.sh -n -t TestPlan.jmx -Jthreads=100 -Jrampup=100 -Jduration=600 -l TestPlan.jtl
Outra boa exemplo é configurar objetos globalmente. Não estou apenas falando sobre strings, inteiros ou booleanos. Também podemos configurar matrizes, vetores, filas, listas e qualquer tipo de estrutura de dados que você possa precisar para sua lógica de teste. Publiquei artigos na Grafana por muito tempo, onde eu estava coletando múltiplas respostas usando uma lista para enviar-as ao InfluxDB em um único pedido HTTP, aqui você pode consultar o artigo.
Exemplos de funções de propriedade: propriedades threads: 1 rampup: 1 duracao: 60
Função | Exemplo | Resultado Esperado |
---|---|---|
éPropDefinido | ${__isPropDefined(threads)} | Imprime o valor booleano se propriedade for definida, neste caso true |
propriedade | ${__property(threads)} | Imprime o valor da propriedade threads: 1 |
P | ${__P(duration)} | Imprime o valor da propriedade: 60 |
P | ${__P(duration,90)} | Atualiza o valor da propriedade para 90 |
setProperty | ${__setProperty(propname,propvalue,)} | Atribui um valor a uma propriedade |
Assim, incluímos imagens dos exemplos e você pode baixar abaixo:
O script do JMeter com exemplos de funções de propriedades requer Java 1.8+ , JMeter 5+ e plugins de JMeter.
6.- Funções de Variáveis #
Em JMeter, as variáveis são simplesmente variáveis locais. Isso significa que elas são criadas e destruídas durante cada iteração da thread. A maioria dos dados usados na execução de uma thread (como correlações) é armazenada em propriedades que desaparecerão quando a thread terminar e começar um novo iterativo. Se você precisar salvar qualquer valor, o melhor é armazená-lo em uma propriedade; no entanto, os valores em propriedades também desaparecem quando o teste parar, então é melhor salvá-los em um arquivo de arquivamento.
Examples of variable functions: variables Test_1: Flood Test_2: io Vars: 12345|67890|10293848576|5647382910 Variable: Test_1 es “${Test_1}” y Test_2 es “${Test_2}” Numero: 2
Função | Exemplo | Resultado Esperado |
---|---|---|
split | ${__split(${Vars},splitVar,|)} | Divide a variável Vars com o delimitador pipe, e os resultados são armazenados na variável splitVar |
eval | ${__eval(Test_1 es “${Test_1}” y Test_2 es “${Test_2}”)} | Imprime a string: Test_1 é “Flood” e Test_2 é “io” |
evalVar | ${__evalVar(Variable)} | Imprime o resultado da avaliação da variável: Test_1 é “Flood” e Test_2 é “io” |
isVarDefined | ${__isVarDefined(Variable)} | Imprime o valor booleano caso a variável seja definida, neste caso true |
V | ${__V(Test_${Numero})} | Imprime a string: io que é o conteúdo da variável Test_2 |
V | ${__V(splitVar_${Numero})} | Imprime a string: 67890 que é o conteúdo da variável splitVar_2 |
Assim, incluímos imagens dos exemplos e você pode baixá-las abaixo:
O script do JMeter com exemplos de funções variáveis requer Java 1.8+ , JMeter 5+ e plugins de JMeter.
7.- Funções de String #
É muito comum na atmosfera de testes modificar e atualizar valores de string. Também é possível realizar transformações, conversões, cortes ou divisões desses mesmos. Algumas das utilizações mais comuns são a codificação e decodificação de URL utilizando as funções urlencode e urldecode, ambas essas funções são realmente úteis quando se trata de páginas web e publicação de parâmetros. Embora as funções string estejam destinadas à conversão, temos duas funções que podem não ser tão relacionadas a tais tarefas. Por exemplo, regexFunction, que é uma extrator regular muito semelhante a post-processamento, e dateTimeConvert, que nos ajuda a transformar diferentes formatos de tempo.
Exemplos de Funções de String:
Função | Exemplo | Resultado |
---|---|---|
char | ${__char(165)} | Imprime o caractere 165: ¥ |
char | ${__char(182)} | Imprime o caractere 182: ¶ |
changeCase | ${__changeCase(Mayusculas,UPPER,Tmp)} | Caso a condição seja verdadeira, altera o caso para maiúsculo e armazena na variável Tmp |
changeCase | ${__changeCase(Minusculas,LOWER,Tmp)} | Caso a condição seja verdadeira, altera o caso para minúsculo e armazena na variável Tmp |
escapeOroRegexpChars | ${__escapeOroRegexpChars([0-9].+?,)} | Imprime a string: [0-9].+? |
escapeXml | ${__escapeXml(“Valor”+&+’Value’)} | Imprime a string: "Valor"+&+?Value? |
regexFunction | ${__regexFunction(min(.+),$1$,1,,,,Tmp)} | Retorna o resultado da avaliação do regular expression na variável Tmp: sculas |
escapeHtml | ${__escapeHtml(“Comillas Dobles”+‘sencillas’)} | Imprime a string: "Comillas Dobles"+‘sencillas’ |
unescapeHtml | ${__unescapeHtml("Comillas Dobles"+‘sencillas’)} | Imprime a string: “Comillas Dobles”+‘sencillas’ |
unescape | ${__unescape(\ttabulador)} | Imprime a string: tabulador |
urlencode | ${__urldecode(%5Bflood%5D%3D%28element%29)} | Imprime a string: [flood]=(element) |
urldecode | ${__urlencode([flood]=(element))} | Imprime a string: %5Bflood%5D%3D%28element%29 |
Assim, incluímos imagens dos exemplos e você pode baixá-las abaixo:
O script do JMeter com exemplos de funções de strings requer Java 1.8+ , JMeter 5+ e plugins de JMeter.
Conclusão #
As funções do JMeter cresceram em número e valor, embora também existam funcionalidades adicionais que podem ser incluídas usando o Add-Ons de Funções Custom JMeter e são extremamente úteis, especialmente Base64 quando precisamos calcular cabeçalhos de autenticação baseado em. Não abordei essas funcionalidades neste publicação, mas parece necessário ensinar como pescar ao invés de apenas dar o peixe, simplesmente instalando os addons, selecionando Funções Custom JMeter do menu e reiniciando. Espero que esta informação tenha sido útil. Use com prazer as funções do JMeter!