# Teste de Performance
Teste de performance é um subgrupo da Engenharia de Performance, é um processo de avaliar o comportamento de um sistema sob diversas condições extremas.
O principal objetivo é monitorer e melhorar indicadores chave de performance, como tempo de resposta, taxa de transferência, memória, uso de CPU e mais.
Os três objetivos são:
- Velocidade: Tempo de resposta a requests;
- Escalabilidade: Carga de usuários máxima que a aplicação aguenta;
- Estabilidade: Determina se a API é estável sob diversas cargas;
# Por Que Aplicar o Teste de Performance?
Features e Funcionalidades suportadas por um software não são as únicas preocupações. A performance de uma API, como o seu tempo de resposta, confiabilidade, uso de recursos e escalabilidade, também importam.
O objetivo não é localizar bugs mas sim eliminar gargalos de performance.
O teste é aplicado para prover os investidores com informações sobre suas aplicações, acerca dos fatores de performance. E, mais importante, o teste revela o que precisa ser melhorado antes do produto ir a mercado.
Sem este teste, o software provavelmente sofreria de problemas como, baixo desempenho sob stress, inconsistências entre diferentes sistemas operacionais e baixa usabilidade.
O teste determinará se o software atinge parâmetros de performance sob cargas de trabalho previstas. Aplicações enviadas ao mercados com baixas métricas de performance devido a testagem inexistente ou inadequada irão, provavelmente, adquirir uma má reputação, e não atingir seus objetivos de vendas.
Além disso,aplicações críticas como programas de lançamento espacial, equipamentos médicos e etc devem ser testados para performance a fim de garantir funcionalidade plena.
# Tipos de Teste de Performance
Teste de Carga: Checa a capacidade da aplicação de performar sob cargas de usuários previsíveis, para identificar gargalos antes que a aplicação seja lançada;
Teste de Stress: Envolve tester a aplicação sob cargas extremas, para auferir como o sistema lida com o tráfego e processamento de dados. O objetivo é identificar o ponto de ruptura da aplicação;
Teste de Spike: Testa a reação do software frente a um pico súbito na carga gerada por usuários;
Teste de Resistência: É feito para garantir que o software consiga lidar com a carga prevista durante um longo período de tempo;
Teste de Volume: Vasta quantidade de dados é inserida no database e o comportamento geral do sistema é monitorado. O objetivo é checar a performance em níveis diferentes de volumes na database;
Teste de Escalabilidade: Determina a efetividade do software sob cargas crescentes, de forma a comportar um aumento no número de usuários. Isto ajuda a planejar melhorias de capacidade para o sistema;
Teste de Capacidade
# Problemas de Performance Comuns
A maioria dos problemas de performance giram em torno de velocidade, tempo de resposta, tempo de load e baixa escalabilidade. A velocidade, é um dos atributos mais importante, uma aplicação lenta vai perder potenciais usuários. O teste de performance garante que um aplicativo seja executado rápido o suficiente para manter a atenção e interesse de um usuário. Na seguinte lista verificamos como a velocidade é um problema constante.
- Alto Tempo de Carregamento: Tempo de load é normalmente o período que uma aplicação leva para iniciar, ele deveria, geralmente, ser o menor possível. Enquanto algumas aplicações são impossíveis de serem iniciadas em menos de um minuto, o tempo de carregamento deveria ficar abaixo de alguns segundos se possível;
- Tempo de Resposta Inadequado: Aqui tratamos do tempo que leva entre um input do usuário e o output da aplicação para este input. Geralmente deveria ser muito rápido, pois novamente, se a espera for longa, o usuário perde interesse;
- Baixa Escalabilidade: Um produto software sofre de baixa escalabilidade quando ele não suporta o número previsto de usuário ou quando não acomoda um espectro satisfatório de usuários;
- Gargalo: São obstruções em um sistema que degradam a performance geral. Acontecem quando erros de código ou hardware causam uma diminuição na taxa de transferência sob certas cargas. A chave para localizar um problema de gargalo é encontrar a seção de código que gera a lentidão, e corrigí-la. O gargalo é comumente solucionado ao corrigir as linhas de código ou adicionar hardware. Alguns comuns são:
- Uso de CPU;
- Uso de Memória;
- Uso de Network;
- Limitações do Sistema Operacional;
- Uso de Disco;
# Como Aplicar o Teste de Performance
A metodologia adota para testes de performance podem variar, mas objetivo permanece.
Fluxograma genérico do teste de performance:
- Identificar o Ambiente de Testes: Conheça o seu ambiente físico de testes, de produção e quais ferramentes de testes estão disponíveis. Entenda detalhes do hardware, software e configurações de networks usadas durante a testagem, antes de inicia-la. Este processo promove uma maior eficiência.
- Identifique os Critérios de Aceite da Performance: Isto inclui objetivos e restrições da taxa de transferência, tempos de resposta e aloção de recuros. Também é necessário para identificar os critérios de sucesso do projeto além destes objetivos e restrições. Testers tambem devem estar empoderados para definir os critérios de performance e objetivos, uma vez que, geralmente, as especificações do projeto não incluirão uma variedade ampla o suficiente de benchmarks para performance. Quando possível encontrar uma aplicação similar para de fins de comparação pode auxiliar na definição dos objetivos de performance.
- Planejamento e Design dos Testes de Performance: Determine o quanto a usabilidade irá variar entre os usuários finais para identificar cenários chave de testes para todos os casos de uso possíveis. É necessário simular uma variedade de usuários finais, planejar os dados para testes de performance e delimitar quais métricas serão coletadas.
- Configuração do Ambiente de Testes: Prepare o ambiente de testes antes de sua execução, além disso, organize ferramentas e demais recursos.
- Implemente o Design de Testes: Crie os testes de performance de acordo com o seu design original.
- Execute os Testes
- Analise, Ajuste e Reteste: Consolide, analise e compartilhe os resultados dos testes. Então, ajuste de forma específica e retestes para observar se existem melhorias ou declínios na performance. Uma vez que melhorias geralmente diminuem a cada teste, pare quando o gargalo é causado pela CPU. Para então poder considerar a opção de aumento do poder da CPU.
# Métricas do Teste de Performance: Parâmetros Monitorados
- Uso do Processador: A quantidade de tempo que um processador gasta executando threads ativas;
- Uso de Memória: Espaço físico disponível em memória para processos no computador;
- Tempo de Disco: Período em que o disco ocupa-se para executar uma request de leitura ou escrita (read/write);
- Bytes Privados: número de bytes que um processo alocou que não podem ser compartilhados entre demais processos. Estes são utilizados para medir vazamentos e uso de memória.
- Memória Dedicada: quantidade de memória virtual utilizada;
- Memory pages por segundo: Número de páginas escritas ou lidas a partir do disco com o objetivo de resolver falhas graves na página. Falhas graves identificam-se quando um código que não do grupo atualmente sob teste recebe um call de algum outro lugar e é buscado de um disco;
- Falhas na Página por Segundo: A taxa geral em que falhas são processadas pelo processador. Novamente, ocorrem quando um processo requer código de fora do grupo sob teste;
- Interrupções da CPU por Segundos: Número médio de interrupções no hardware que um processador esta recebendo e processando a cada segundo;
- Comprimenta da Fila do Disco: Número médio de requests para read e writes na fila para o disco selecionado durante uma amostragem de tempo;
- Comprimento da Fila do Output na Network: Comprimento da fila dos pacotes de output. Qualquer coisa superior a 2 significa um delay, e o gargalo precisa ser solucionado
- Total de Bytes na Network por Segundo: Taxa em que bytes são enviados e recebidos na interface, incluindo caracteres de enquadramento;
- Tempo de Resposta: Tempo entre a request do usuário e o recebimento do primeiro caracter da resposta;
- Taxa de Transferência: Taxa em que um computador ou rede recebe requests por segundo;
- Quantidade do Pool de Conexões: Número de requests de usuários que são atentidas por um pool de conexões. Quanto mais requests são atendidos por conexões na pool, melhor é a performance;
- Máximo de Sessões Ativas;
- Taxas de Acerto: Tem a ver com o número de statements SQL processados por dados em cache ao invez de operações I/O caras. Aqui é um bom ponto de partida para soluções de gargalo
- Acertos por Segundo: O número de acertos um servidor web durante cada segundo de um teste de carga;
- Segmento de Reversão: Quantidade de dados que podem ser revertidos a qualquer momento;
- Travas da Database: O trancamento de tables e databases precisão ser monitorados e ajustados com cuidado;
- Maiores Esperas: São monitoradas para determinar quais tempos de espera podem ser diminuídos ao lidas com o quão rápido os dados são buscados na memória;
- Contagem de Threads: A saúde de uma aplicação pode ser medida pelo número de threads que estão ativas e em execução;
- Coleta de Lixo: Refere-se ao retorno de memória não utilizada de volta ao sistema. A coleta de lixo precisa ser monitorada para eficiência;
# Exemplos de Casos de Teste
- Verifique que o tempo de resposta é de não mais que 4 segundos quando 1000 usuários acessarem o site simultâneamente;
- Verifique se o tempo de resposta da aplicação sob carga esta dentro dos parâmetros aceitáveis quando a conectivade da rede está baixa;
- Cheque qual o número máximo de usuários que a aplicação aguenta antes de crashar;
- Verifique o tempo de execução do banco de dados quando 500 registros são lidos/escritos simultâneamente;
- Verifique a CPU e uso de memória da aplicação e database em condições de pico da carga;
- Valide o tempo de resposta da aplicação sob condições de carga baixas, normais, moderadas e excessivas;
# Ferramentas para Teste de Performance
Algumas das ferramentas mais populares para teste de performance são: