Teste de carga versus teste de estresse: Diferenças, métricas e exemplos k6
Uma prova que seu sistema lida com o tráfego que você espera. O outro descobre onde quebra e como se recupera. Aprenda quando executar cada um, em quais números confiar e como planejar um teste que forneça respostas reais.
- O teste de carga verifica se um sistema atende às metas abaixo do tráfego esperado.
- Os testes de estresse superam a capacidade de encontrar o ponto de ruptura e estudar a recuperação.
- As ferramentas geralmente são as mesmas. O que difere é o objetivo e o padrão de tráfego.
- Julgue os resultados com percentis como p95 e p99, pois as médias podem esconder problemas sérios.
Seu aplicativo funciona perfeitamente com dez usuários. O que acontece no dia da liquidação, com dez mil? Teste de carga versus teste de estresse descreve duas maneiras diferentes de responder a isso, e misturá-las leva a testes que não comprovam o que você pensa que eles fazem.
Este guia explica o que cada um mostra, os tipos de testes relacionados e como ler os resultados. Executamos o pequeno cálculo de percentil abaixo no Python 3.13, com números simulados. Os scripts k6 são exemplos ilustrativos que não executamos, e as contagens e alvos de usuários são inventados, então substitua-os pelos seus próprios. Execute esses testes apenas em sistemas que você possui ou tem permissão para testar, pois o tráfego intenso pode parecer um ataque e causar interrupções reais.
A resposta curta
Um teste de carga pergunta: podemos lidar com o tráfego que esperamos e atingir nossas metas ao fazê-lo? Um teste de estresse pergunta: quanto podemos aguentar antes de falhar, como falhamos e com que rapidez nos recuperamos?
Pense em uma ponte. Um teste de carga conduz o número esperado de caminhões e confirma que está tudo bem. Um teste de estresse continua adicionando peso para saber seu limite e se ele avisa primeiro. Felizmente, é mais barato quebrar um software do que uma ponte.
Teste de carga versus teste de estresse lado a lado
| Aspecto | Teste de carga | Teste de estresse |
|---|---|---|
| Pergunta principal | Atingimos as metas com a carga esperada? | Onde e como quebramos? |
| Nível de tráfego | Pico normal ao esperado | Acima do pico esperado |
| Padrão | Acelere, mantenha-se firme | Continue aumentando até falhar |
| Falha | Um teste falhado | O resultado esperado |
| Métricas principais | Tempo de resposta, rendimento, erros | Ponto de ruptura, modo de falha, tempo de recuperação |
| Tempo típico | Antes de cada grande lançamento ou evento | Depois que o sistema estiver estável sob carga |
| Resultado | Aprovar ou falhar contra alvos | Um limite de capacidade e uma lista de pontos fracos |
O que é teste de carga?
O teste de carga simula o tráfego realista esperado e mede como o sistema se comporta. Ele precisa de uma meta para testar, por exemplo: “com 500 usuários simultâneos, 95% das solicitações de checkout terminam em 800 ms, com menos de 1% de erros”.
Aqui está como isso poderia parecer um script k6. Os testes k6 são escritos em JavaScript e thresholds transformam seus alvos em um resultado de aprovação ou reprovação:
import http from "k6/http";
import { sleep } from "k6";
export const options = {
stages: [
{ duration: "5m", target: 500 }, // ramp up
{ duration: "20m", target: 500 }, // hold at expected peak
{ duration: "2m", target: 0 }, // ramp down
],
thresholds: {
http_req_duration: ["p(95)<800"],
http_req_failed: ["rate<0.01"],
},
};
export default function () {
http.get("https://staging.example.com/products");
sleep(1); // think time, as real users pause
}
O sleep é importante. Sem tempo para pensar, cada usuário virtual sobrecarrega o servidor continuamente, produzindo muito mais tráfego do que o mesmo número de pessoas reais produziria.
O que são testes de estresse?
Os testes de estresse vão deliberadamente além dos níveis esperados. Você não está tentando passar. Você quer respostas para perguntas como:
- Em que nível o desempenho começa a desmoronar?
- Qual componente falha primeiro: o banco de dados, os servidores de aplicativos ou uma chamada de terceiros?
- Ele falha normalmente com erros claros ou trava e perde dados?
- Ele se recupera sozinho quando o tráfego cai?
export const options = {
stages: [
{ duration: "5m", target: 500 }, // expected peak
{ duration: "5m", target: 1000 }, // beyond it
{ duration: "5m", target: 2000 }, // further
{ duration: "5m", target: 4000 }, // likely to break
{ duration: "10m", target: 0 }, // recovery: does it come back?
],
};
Essa fase final de recuperação é frequentemente esquecida e pode ser a mais valiosa. Um sistema que lida bem com falhas, mas nunca se recupera sem uma reinicialização manual, ainda significa uma interrupção para alguém consertar no meio da noite. Idealmente, sob carga extrema, um sistema deve interromper o trabalho de maneira controlada, retornando 503 respostas claras em vez de atingir o tempo limite.
Spike, molho e outros tipos
Os testes de carga e de estresse pertencem a uma família mais ampla de testes de desempenho:
| Tipo | Padrão | O que encontra |
|---|---|---|
| Fumaça (atuação) | Alguns usuários, brevemente | Se o script e o sistema funcionam |
| Carregar | Pico esperado, mantido | Se as metas são atingidas |
| Estresse | Aumento da capacidade anterior | Limites e modos de falha |
| Espiga | Um salto repentino, depois uma queda | Escalonamento automático e comportamento da fila |
| Mergulhe (resistência) | Carga normal por horas | Vazamentos de memória, conexões que acabam |
| Capacidade | Aumento gradual | A carga máxima dentro dos seus alvos |
Os testes de absorção detectam problemas que os testes curtos nunca detectam. Um pequeno vazamento de memória pode parecer inofensivo por vinte minutos e só interromper o serviço após dois dias. Os testes de pico são adequados para eventos como vendas relâmpago, onde o tráfego não aumenta gradualmente.
Métricas que importam
| Métrica | Significado | Preste atenção |
|---|---|---|
| Tempo de resposta (percentis) | Quanto tempo demoram as solicitações | p95 e p99 subindo |
| Taxa de transferência | Solicitações tratadas por segundo | Achatando à medida que os usuários aumentam |
| Taxa de erro | Porcentagem de solicitações com falha | Qualquer aumento repentino |
| CPU e memória | Uso de recursos do servidor | Saturação ou crescimento constante |
| Banco de dados | Consultas lentas, uso do pool de conexões | Esgotamento da piscina, bloqueio aguarda |
| Profundidade da fila | Trabalho aguardando processamento | Crescimento que nunca se esgota |
Por que as médias enganam
As médias escondem as solicitações lentas das quais as pessoas reais reclamam. Para mostrar isso, geramos 100 tempos de resposta simulados, onde 95 foram rápidos (80 a 200 ms) e 5 foram muito lentos (2,5 a 4 segundos), e então calculamos as estatísticas comuns:
import math, random, statistics
random.seed(3)
times = [random.randint(80, 200) for _ in range(95)] \
+ [random.randint(2500, 4000) for _ in range(5)]
def pct(values, p):
values = sorted(values)
return values[math.ceil(p / 100 * len(values)) - 1]
print("avg", round(statistics.mean(times)), "p50", pct(times, 50),
"p95", pct(times, 95), "p99", pct(times, 99), "max", max(times))
# avg 302 p50 150 p95 199 p99 3740 max 3896
Observe atentamente esses números. A média de 302 ms não descreve ninguém. As solicitações típicas demoravam cerca de 150 ms, enquanto as lentas demoravam mais de 3 segundos. Até o p95 parece saudável em 199 ms, e apenas o p99 revela o problema. Um número como p95 significa que 95% das solicitações foram tão rápidas ou mais rápidas.
E um por cento das solicitações não é um evento raro. Se uma página fizer 50 solicitações, um p99 lento afetará uma grande parte das visualizações de página. Defina metas nos percentis que são importantes para você e analise vários deles juntos.
Dica: Procure o “joelho” em seus gráficos. À medida que a carga aumenta, os tempos de resposta permanecem estáveis por um tempo e depois aumentam repentinamente, enquanto a produtividade para de crescer. Esse ponto é a sua capacidade prática, e muitas vezes surge bem antes de qualquer coisa realmente falhar.
Ferramentas
| Ferramenta | Scripts | Conhecido por |
|---|---|---|
| k6 | JavaScript | Amigável ao desenvolvedor, limites adequados para CI |
| JMeter | GUI e XML | Maduro, suporta muitos protocolos |
| Gatling | Scala, Java, Kotlin e outros | Baseado em código, eficiente |
| Gafanhoto | Pitão | Comportamento do usuário simples baseado em Python |
Qualquer um deles pode executar testes de carga e de estresse. Escolha aquele que se adapta às habilidades da sua equipe, em vez de buscar uma lista de recursos. Para usar um em seu pipeline, consulte o que é CI/CD.
Como planejar um teste
- Defina metas. Use análises reais para encontrar seu pico de tráfego e definir metas.
- Escolha jornadas. Modele comportamentos realistas do usuário, como navegar, pesquisar e finalizar compra, em proporções realistas. Acessar apenas a página inicial prova pouco.
- Use um ambiente realista. Um pequeno servidor de teste não pode prever a produção. Observe quaisquer diferenças.
- Prepare os dados. Use volumes realistas, porque uma consulta rápida em 100 linhas pode rastrear 10 milhões.
- Avise as pessoas. Informe sua equipe de operações e terceiros e não faça testes de carga em um provedor de pagamento por acidente. Simule serviços externos quando apropriado.
- Comece aos poucos. Execute primeiro um pequeno teste de fumaça para confirmar se seu script funciona.
- Monitore tudo. Sem as métricas do servidor, você verá que ele ficou lento, mas não por que.
- Repita. Execute-o novamente após cada correção e mantenha uma linha de base para comparação.
Lendo os resultados
| Sintoma | Possível causa |
|---|---|
| Respostas lentas, mas baixa CPU | Esperando em um banco de dados, bloqueio ou serviço externo |
| A CPU do banco de dados está alta | Índices ausentes ou consultas ineficientes |
| Erros repentinos de conexão | Pool de conexões ou limite de arquivos atingido |
| A memória sobe constantemente | Um vazamento ou um cache ilimitado |
| A CPU do gerador de carga está alta | A ferramenta de teste é o gargalo, não o seu sistema |
Os bancos de dados são um gargalo comum, portanto, se o problema for consultas, leia nosso guia sobre otimização de consultas SQL. Essa última linha da tabela é uma armadilha importante: verifique sempre também o estado da máquina que gera a carga.
Erros comuns
- Confundir usuários com solicitações. Deixe claro se um alvo significa usuários simultâneos ou solicitações por segundo.
- Deixar de lado o tempo de reflexão. Isso aumenta o tráfego e gera resultados enganosos.
- Teste tarde demais. Uma semana antes do lançamento não sobra tempo para corrigir problemas de arquitetura.
- Usando um único endpoint. O tráfego real combina leituras, gravações e pesquisas.
- O cache esconde tudo. Solicitações repetidas idênticas podem apenas testar seu cache, portanto varie os dados.
- Testando uma vez. O desempenho muda a cada versão, portanto, execute testes regularmente.
Considerações finais
Execute testes de carga para confirmar se você consegue lidar com o tráfego esperado e testes de estresse para saber o que acontece quando você não consegue. Comece aos poucos: escolha a jornada do usuário mais importante, defina uma meta clara e execute um breve teste de teste com monitoramento ativado. Essa primeira execução geralmente ensina algo e você pode construir a partir daí.
Perguntas frequentes
Qual é a principal diferença entre testes de carga e testes de estresse?
O teste de carga verifica o comportamento do tráfego esperado em relação aos alvos definidos. Os testes de estresse vão além da capacidade de encontrar o ponto de ruptura e como o sistema se recupera.
Devo executar testes de carga ou testes de estresse primeiro?
Teste de carga primeiro. Depois que o sistema atingir suas metas com o tráfego esperado, execute testes de estresse para explorar seus limites. Os resultados do estresse significam pouco em um sistema instável.
Qual é a diferença entre um teste de estresse e um teste de pico?
Um teste de estresse normalmente aumenta a carga passo a passo até a falha. Um teste de pico salta repentinamente para um nível alto, para ver como o sistema lida com mudanças abruptas.
Qual é o tempo de resposta p95?
Isso significa que 95% das solicitações foram concluídas nesse horário ou menos. Ele descreve a experiência da maioria dos usuários melhor do que a média.
Posso executar testes de carga em produção?
Você pode, mas com cuidado, com permissão, monitoramento e uma forma de parar rapidamente. A maioria das equipes começa com um ambiente de teste semelhante ao de produção para reduzir o risco para usuários reais.
Continue aprendendo
Precisa de ajuda com testes, WordPress ou SEO?
Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.
Mais guias sobre testes, IA e desenvolvimento moderno
Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.
Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las
Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…
Leia o artigo →DevOpsVariáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos
Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…
Leia o artigo →Desenvolvimento de softwareExplicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429
Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…
Leia o artigo →Automação de testesZombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem
Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…
Leia o artigo →Teste de softwareCobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa
Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…
Leia o artigo →Bancos de dados e SQLDELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um
DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…
Leia o artigo →Bancos de dados e SQLExibições SQL explicadas: crie, use e evite as armadilhas, com exemplos
Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…
Leia o artigo →Desenvolvimento de softwareInterface TypeScript vs tipo: diferenças reais, testadas com o compilador
Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…
Leia o artigo →Desenvolvimento de softwarePython *args e **kwargs explicados: funções flexíveis com exemplos claros
Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…
Leia o artigo →Desenvolvimento de softwareFunções Python Lambda: sintaxe, usos reais e quando não usá-los
Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …
Leia o artigo →Inteligência artificialO que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar
O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …
Leia o artigo →DevOpsMonitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos
Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…
Leia o artigo →DevOpsDocker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa
Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…
Leia o artigo →Automação de testesTDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um
TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…
Leia o artigo →Teste de softwareTeste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais
Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…
Leia o artigo →Bancos de dados e SQLValores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas
Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…
Leia o artigo →Bancos de dados e SQLInstrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns
SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…
Leia o artigo →Desenvolvimento de softwareO que é JWT? JSON Web Tokens explicados com um exemplo prático
O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…
Leia o artigo →Desenvolvimento de softwareLoop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos
O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…
Leia o artigo →Desenvolvimento de softwareGeradores Python e rendimento explicado: economize memória com exemplos reais
Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…
Leia o artigo →Inteligência artificialO que são incorporações? Similaridade de vetores e cossenos explicada de forma simples
O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…
Leia o artigo →DevOpsImplantação azul-verde vs canário: diferenças, compensações e como escolher
Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…
Leia o artigo →Automação de testesTestes instáveis: o que os causa e como corrigi-los para sempre
Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…
Leia o artigo →Teste de softwareTeste de carga versus teste de estresse: diferenças, métricas e exemplos k6
Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…
Leia o artigo →Teste de softwareCaso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um
Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…
Leia o artigo →Bancos de dados e SQLOtimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos
Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…
Leia o artigo →Bancos de dados e SQLSQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado
SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…
Leia o artigo →Desenvolvimento de softwareTutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite
Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …
Leia o artigo →Desenvolvimento de softwareManipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos
Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…
Leia o artigo →Desenvolvimento de softwareClasses e objetos Python: tutorial OOP com exemplos reais
Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…
Leia o artigo →Inteligência artificialO que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros
O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…
Leia o artigo →DevOpsComandos Linux para iniciantes: o guia essencial do terminal com exemplos
Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …
Leia o artigo →Automação de testesSelenium vs Playwright: principais diferenças, código comparado e qual escolher
Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …
Leia o artigo →Teste de softwareParticionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos
Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…
Leia o artigo →Teste de softwareGravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais
Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…
Leia o artigo →Bancos de dados e SQLTutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos
Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…
Leia o artigo →Bancos de dados e SQLTransações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento
Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …
Leia o artigo →Desenvolvimento de softwareGit merge vs rebase: diferenças, exemplos e quando usar cada um
Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.
Leia o artigo →Desenvolvimento de softwareList comprehension em Python: sintaxe, exemplos e quando evitar
List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.
Leia o artigo →Bancos de dados e SQLSQL JOIN explicado com exemplos (Inner, Left, Right, Full)
Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…
Leia o artigo →