Guia de testes de desempenho
Versão 1.0 de 06/12/2016.
Índice
- 1 Sobre este guia
- 2 Materiais de apoio
- 3 Softwares
- 4 Planejamento
- 4.1 Criação de cenários de teste no JMeter
- 4.1.1 Instalando e iniciando o JMeter
- 4.1.2 Instalando plugins
- 4.1.3 Configurando um thread group
- 4.1.4 Adicionando elementos de configuração
- 4.1.5 Adicionando controladores
- 4.1.6 Adicionando testadores
- 4.1.7 Gravação de cenários utilizando proxy
- 4.1.8 Adicionando ouvintes
- 4.1.9 Realizando extrações com RegExp e XPath
- 4.1.10 Configurando tempo de resposta variável
- 4.1.11 Trabalhando com arquivos CSV
- 4.1.12 Configurando a vazão
- 4.1.13 Tratando condicionais
- 4.1 Criação de cenários de teste no JMeter
- 5 Preparação do ambiente
- 6 Pré-execução
- 7 Execução dos testes distribuídos
- 8 Análise dos resultados
- 9 Reexecução
Sobre este guia
Este guia visa reunir informações úteis para o aprendizado e aplicação de testes de desempenho, bem como a utilização das ferramentas necessárias.
Materiais de apoio
- Configurações básicas para acesso ao ambiente de testes de desempenho
- Descrição de códigos HTTP
- Métodos HTTP
- Templates do Perfmon
- Contadores de desempenho
- Scripts para teste de desempenho
Softwares
- JMeter
- Remote Desktop Connection Manager
- Fiddler
- Perfmon
- Zabbix
- Microsoft Excel
- SQL Server Management Studio
- Notepad++
Planejamento
A etapa de planejamento visa levantar as necessidades do projeto em relação ao teste de desempenho. Entre as questões a serem respondidas, estão:
- Qual o objetivo do teste?
- Qual pergunta deve ser respondida com o resultado do teste?
- Qual tipo de teste deve ser executado? Desempenho, Stress, Carga?
- Quais serão os cenários?
- Quais os prazos?
- Os cenários definidos são compatíveis com os prazos?
Após as definições, o testador pode iniciar a criação dos cenários de teste.
Criação de cenários de teste no JMeter
O JMeter é uma ferramenta opensource, desenvolvida para criar e executar testes de carga em serviços computacionais. Para a elaboração dos planos de teste, o Jmeter pode te ajudar em:
- Configurar diversos tipos de requisição;
- Criar loops e condições lógicas para cada requisição;
- Importar dados para o plano através de arquivo .csv
- Simular ataque ao servidor
Instalando e iniciando o JMeter
O JMeter está disponível para download gratuito em http://jmeter.apache.org/download_jmeter.cgi
Para abrir a interface do JMeter é necessário executar o arquivo jmeter.bat
, localizado em [JMETER_HOME]/bin
Instalando plugins
O JMeter possui diversos plugins. Estes plugins podem, por exemplo, oferecer suporte ao JUnit, MongoDP, webdriver, oferecer novos ouvintes, monitorar servidores, etc. Os plugins estão disponíveis em https://jmeter-plugins.org
Os plugins devem ser instalados na pasta [JMETER_HOME]/lib
Principais plugins:
- Ultimate Thread Group
Configurando um thread group
O thread group é o início de qualquer plano de teste. É abaixo dele que ficarão todos os controladores e testadores do plano. Nele podemos estabelecer configurações como: número de usuários (threads), tempo de intervalo para cada usuário (ramp-up period) e o número de vezes que o teste será executado (loop count).
Para adicionarmos o elemento, basta clicar com o botão direito do mouse em cima do Plano de Teste em seguida em Adicionar > Threads (Users) > Grupo de usuários.
- Thread Grupo de usuários
- Número de usuários virtuais: número de usuários simultâneos
- Tempo de inicialização: tempo para subir todos os usuários
- Contador de iteração: quantas vezes os usuários irão executar as ações
- Thread Ultimate Thread Group
- Star Threads Count: número de usuários simultâneos
- Initial delay, sec: tempo de dalay para começar a subir os usuários
- Startup time: tempo para subir todos os usuários
- Hold Load For, sec: tempo de teste
Adicionando elementos de configuração
- Requisição HTTP: Padrões de Requisição HTTP (HTTP Request Defaults), que define valores padrões para as requisições HTTP. Para adicionarmos o elemento, basta clicar com o botão direito do mouse em cima do Plano de Teste em seguida em
Adicionar > Elementos de configuração > Padrões de Requisição HTTP
.
Neste elemento de configuração podemos definir os valores padrões das requisições HTTP que serão adicionadas posteriormente ao teste, como o endereço e a porta, sem necessidade de repetição.
- Gerenciador de cookies: O gerenciador de cookies possibilita o uso de cookies no plano de teste. Para adicionarmos o elemento, basta clicar com o botão direito do mouse em cima do Plano de Teste em seguida em
Adicionar > Elementos de configuração > Gerenciador de Cookie HTTP
.
- Gerenciador de cache: O gerenciador de cache possibilita o uso de cache no plano de teste. Para adicionarmos o elemento, basta clicar com o botão direito do mouse em cima do Plano de Teste e em seguida clicar em
Adicionar > Elementos de configuração > Gerenciador de Cache HTTP
.
- Configuração dos dados CSV: Permite importar dados de um arquivo CSV. Para adicionar,
Adicionar > Elementos de configuração > Configuração dos dados CSV
.
Adicionando controladores
- Controlador simples
- O Controlador simples permite organizar os samplers e outros controladores dentro da estrutura do JMeter.
- Controlador de transação
- The Transaction Controller generates an additional sample which measures the overall time taken to perform the nested test elements.
- Para adicioná-lo,
Adicionar > Controlador lógico > Controlador de transação
- Controlador aleatório (Random controller)
- A Random Controller will make one of samplers contained in it run in each loop of the thread and this sampler will be randomly selected.
- Para adicioná-lo,
Adicionar > Controlador lógico > Controlador aleatório
- Controlador de vazão (Throughput Controller)
- Permite definir a frequência de execução.
- Para adicioná-lo,
Adicionar > Controlador lógico > Controlador de vazão
The Throughput Controller can yield very complex behavior when combined with other controllers - in particular with interleave or random controllers as parents (also very useful).
- Controlador de gravação
- Não tem efeito sobre os testes, assim como o controlador simples. Serve como armazenamento padrão das gravações feitas pelo Servidor HTTP Proxy.
- Controlador Se
- The If Controller allows the user to control whether the test elements below it (its children) are run or not.
- Para adicioná-lo,
Adicionar > Controlador lógico > Controlador Se
Adicionando testadores
Requisição HTTP: Nele podemos definir o verbo que será utilizado (POST, GET, PUT, etc.), enviar parâmetros com a requisição, como por exemplo o email e senha de um usuário em um POST.
Para adicionarmos o elemento, basta clicar com o botão direito do mouse em cima do Grupo de usuário em seguida em Adicionar > Testador > Requisição HTTP
.
Atributos para configuração:
- Nome: nome para lembrar a responsabilidade do elemento;
- Nome do servidor ou IP: endereço ou IP que será testado
- Número da porta: porta que o servidor responde
- Protocolo: por default é o HTTP, podendos ser alterado.
- Método: método do HTTP
- Codificação do conteúdo: formato de codificação dos dados.
- Caminho: página acessada complementando o nome do servidor ou IP
- Enviar parâmetros com a requisição: parâmetros enviados no request.
Gravação de cenários utilizando proxy
É possível navegar e gravar o cenário enquanto navega no ambiente, para isso utiliza-se o proxy.
Para adicionar, basta clicar com o botão direito em Área de Trabalho e navegar por Adicionar > Elementos que não são de teste > Servidor HTTP Proxy
.
- Servidor HTTP Proxy
- Porta: porta para gravação. Deve ser uma porta disponível.
- Controlador alvo: local onde serão gravadas as requisições
- Agrupamento: opção de agrupamento das requisições capturadas. Geralmente utilizamos
Put each group in a new transaction controller
- Padrões de URL a serem excluídos: elementos que não serão capturados. Padrão:
(?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff)
Para iniciar a gravação, pressione o botão Iniciar
.
É importante configurar o navegador para utilizar o proxy na porta informada no Servidor HTTP Proxy.
Adicionando ouvintes
Ouvintes são elementos que capturam e exibem os resultados. Para adicionar um ouvinte ao plano de testes, basta ir até Adicionar > Ouvinte
Principais ouvintes:
- Árvore de resultados
- Este ouvinte permite visualizar todas as requisições, respostas, resultado do sampler, além de possuir diversos formatos de visualização (texto, html, json, ect.)
- Relatório agregado: Permite visualizar dados de tempo para cada controlador de transação.
- Samples: quantidade de samplers executados para cada controlador de transação
- Média (average): tempo médio de resposta
- Mediana: Significa que 50% dos samplers tiveram tempo menor do que a mediana. Consequentemente, outros 50% foram maiores que a mediana.
- 90% line: Significa que 90% dos samplers tiveram tempo menor que o tempo exibido. Consequentemente, outros 10% tiveram o tempo maior que o exibido.
- 95% line: o mesmo que 90% line.
- 99% line: o mesmo que 90% line.
- Min: menor tempo registrado pelos samplers.
- Max: maior tempo registrado pelos samplers.
- Error: percentagem de erros de cada sampler.
- Vazão (Throughput): Quantidade de requests por unidade de tempo.
- Escritor de dados simples: Este ouvinte apenas escreve os resultado em um arquivo configurado no campo Nome do arquivo. Indicado pois não consome muitos recursos computacionais.
- Ver resultados em tabela
- Tempo da amostra: Tempo total da requisição em m/s.
- Estado: Mostra se a requisição foi executada com sucesso ou se houve falhas.
- Bytes: Quantidade de dados retornados pelo servidor.
- Latency: Diferença entre o tempo que a requisição foi enviada e a hora em que a resposta foi recebida.
Realizando extrações com RegExp e XPath
- Extrator de expressão regular: Este elemento pode ser utilizado para obter dados de uma página através de expressões regulares, estes dados são atribuídos à variáveis que pode ser utilizadas em outra etapa do plano posteriormente. Para adicionar, clique com o botão direito em uma requisição e depois
Adicionar > Pós-processadores > Extrator de expressão regular
.- Nome da referência: variável onde o valor da extração será salvo
- Expressão regular: código da expressão regular
- Modelo: utilizar
$1$
- Número para combinação: define qual valor encontrado será utilizado. Geralmente é utilizado o valor 1, ou seja, o primeiro valor encontrado será utilizado.
- Valor padrão: valor caso não encontre entradas. Geralmente é utilizado ERRO para facilitar a identificação.
O valor extraído poderá ser utilizado em outra Requisição HTTP, no campo Enviar parâmetros com a requisição
.
- Nome: nome do id
- Valor: variável utilizada na extração. Deve ser utilizado o formato jacvascript. Exemplo:
${variavel}
Expressão regular: Provê uma forma concisa e flexível de identificar cadeiras de caracteres de interesse, como caracteres particulares, palavras ou padrões de caracteres. Caracteres:
| (barra vertical): separa alternativas
() (parênteses): definir escopo e precedência de operadores
? (interrogação): indica que há zero ou uma concorrência do elemento precedente.
* (asterisco): indica zero ou mais ocorrências do elemento procedente.
* (adição): indica que há uma ou mais ocorrência do elemento precedente.
. (ponto final): casa qualquer elemento
XPath: O XPath é uma linguagem de consulta, semelhante a expressão regular, para pesquisa em documentos com estrutura XML (como HTML por exemplo). É um recurso extremamente útil e muito utilizado durante a criação de scripts de testes de software em plataforma web. Caracteres:
/ (barra): Pesquisa a partir da raiz da árvore.
// (duas barras): Pesquisa em toda a árvore.
[ ] (colchetes): Definição das propriedades de um elemento.
@ (arroba)Propriedade do elemento.
* (asterisco): Todos os elementos.
Configurando tempo de resposta variável
Um temporizador deve ser adicionado após uma requisição gravada para refletir a situação real em que o usuário pararia por alguns instantes antes de clicar em algum link para entrar em outra página.
Para adicionar clique na Requisição HTTP e em seguida Adicionar > Temporizador > Temporizador constante
.
- Temporizador constante
- Atraso do usuário virtual (em milissegundos): adiciona um atraso fixo a todos os usuários.
- Temporizador aleatório gaussiano (Gaussian random timer)
- Desvio: tempo de desvio, para mais ou menos
- Offset do atraso constante: tempo de atraso variável
Trabalhando com arquivos CSV
A Configuração de conjunto de dados CSV permite a leitura de arquivos CSV e a atribuição desses dados em variáveis do JMeter que podem ser utilizadas durante o teste, como dados de login de usuários. O arquivo .csv
deve estar salvo no mesmo local que o arquivo do plano de teste.
Para adicionar, Adicionar > Elementos de configuração > Configuração dos dados CSV
Os campos deste elemento de configuração são:
- Nome do arquivo: caminho do arquivo. Exemplo: C:\apache-jmeter-3.0\bin\2016_015_Caminhos.csv
- Nome das variáveis: nome das variáveis. Uma variavel por coluna do arquivo. Exemplo: nome, id.
- Reciclar no final do arquivo: define se, ao final do arquivo, o JMeter irá iniciar do começo.
Configurando a vazão
O Controlador de vazão pode ser utilizado para definir a vazão de usuários em seus nós filhos. Pode ser utilizado com o Controlador aleatório. Exemplo:
Na imagem acima, os usuários serão redirecionados aleatoriamente, com 90% de chance, ao primeiro controlador de vazão.
Tratando condicionais
O Controlador Se pode ser utilizado para realizar o direcionamento dos testes de maneira condicional. Campos:
- Condição: Condição em javascript. Se a condição for verdadeira, os nós abaixo do controlador serão executados.
Na imagem acima, o Controlador de transação "02 Acessar um item de menu"só será executado se a condição do Controlador Se selecionado for verdadeira.
Preparação do ambiente
A equipe de desenvolvimento deve enviar o pacote para o DevOps realizar a atualização do ambiente de testes. A equipe do DevOps também pode auxiliar no entendimento da infra do cliente, a fim de simular o cenário ideal de teste.
Pré-execução
A etapa de pré-execução visa realizar as configurações necessárias nos softwares, ambientes e coletores, antes de iniciar o teste. As etapas são:
Preparar o relatório de resultados do JMeter
O JMeter será executado via linha de comando, a fim de que sua GUI não interfira nos contadores. Sendo assim, devemos configurar o ouvinte para salvar o relatório.
- Utilizar o ouvinte Escritor de dados simples
- Inserir um caminho no campo Nome do arquivo
Verificar se o arquivo .jmx é o mesmo no Master e nos Slaves
O arquivo .jmx deve ser o mesmo no Master e nos Slaves do JMeter.
Verificar local do arquivo CSV (se necessário)
Caso o teste utilize dados de um arquivo CSV, este deve estar no local indicado na Configuração dos dados CSV.
Preparar os coletores do Perfmon nos servidores WEB, SQL e ARR
- Para cada servidor WEB, acessar o
Performance Monitor / Data Collector Sets / User Defined / Nome do coletor
- Verificar o caminho onde será salvo o arquivo em cada servidor
- Dar play para começar a gravar e depois dar play no teste
Material de apoio: Templates do Perfmon
Definir e configurar os Slaves
- Quantos slaves utilizar? Com 50-100 usuários, geralmente 1 slave basta. Ou quando a memória está comprometida em mais de 75%.
- Quais slaves utilizar? No Master, editar o nome dos slaves no arquivo /bin/Jmeter.properties.
Definição da carga
Quando o teste é distribuído, deve-se atentar à quantidade de usuários configurados no Grupo de usuários.
Importante: o JMeter irá rodar a quantidade de usuários definida no Grupo de usuários para cada Slave. Se defini 50 usuários e minha configuração é 1 Master + 2 Slaves, meu teste terá um total de 100 usuários.
Execução dos testes distribuídos
- Nos slaves, iniciar o arquivo
/bin/jmeter.server
como admin - Iniciar a gravação dos contatores do Perfmon em todos os servidores
- No master, iniciar o teste via prompt de comando:
- Navegar no prompt até a pasta
[JMETER_HOME]/bin
- Executar o comando:
- Navegar no prompt até a pasta
jmeter.bat -n -t "caminho do arquivo de teste .jmx" -l "caminho pro arquivo de log de resultado" -j "caminho pro arquivo de log do jmeter" -r
- Durante os testes, acompanhar os principais recursos de hardware pelo Resource Monitor.
Análise dos resultados
- Acessar as VMs e coletar os arquivos de resultados do perfmon (WEB, SQL e ARR) e o CSV do JMeter.
- Separar esses arquivos em pastas por quantidade de usuários do teste, para melhor organização
- Rodar o script de Queries mais lentas
- Avg CPI Time (formatado), Tempo decorrido (formatado) e Instrução completa
- Verificar os logs de erro
- Estão em uma tabela do BD
- Em caso de dúvidas, tirar com a equipe de DEV
- Tabular os dados
Contadores e scripts
A análise dos dados deve ser feita com cuidado. Não é possível analisar os contadores separadamente. É necessário analisar todo o contexto do sistema e do ambiente.
Os principais contadores estão disponíveis em Contadores de desempenho.
Os scripts estão disponíveis em Scripts para teste de desempenho
Reexecução
Para realizar nova bateria de testes, com mais usuários por exemplo:
- Restaurar o backup do BD
- Limpar os caches dos sites, se necessário
- Reiniciar o SQL, se necessário - o SQL não desaloca a memória imediatamente após a carga, o que pode impactar nos resultados de outros testes.