Guia de testes de desempenho

De MSTECH wiki
Ir para: navegação, pesquisa
Versão 1.0 de 06/12/2016.

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

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:


ControladorVazao.png


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.


ControladorSE.png


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:
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.