"Nosso teste de carga passou com 10.000 usuários". Ótimo. Mas seu teste simula o comportamento real de 10.000 pessoas diferentes, ou 10.000 robôs fazendo a mesma coisa? A diferença entre tráfego real e simulado pode ser a diferença entre sucesso e desastre em produção.
Um teste de carga só é tão bom quanto sua capacidade de simular a realidade.
A Ilusão do Tráfego Sintético
O problema
Teste típico:
- 1000 virtual users
- Todos fazem login
- Todos buscam "produto X"
- Todos adicionam ao carrinho
- Todos fazem checkout
Realidade:
- 70% apenas navegam
- 20% buscam produtos diferentes
- 8% adicionam ao carrinho
- 2% fazem checkout
- Cada um em velocidades diferentes
Por que isso importa
Teste sintético:
- Cache hit rate: 99% (todos buscam "produto X")
- DB connections: estáveis
- Resultado: "Sistema aguenta 10K users"
Produção real:
- Cache hit rate: 40% (buscas diversas)
- DB connections: picos por queries variadas
- Resultado: Sistema cai com 3K users
Diferenças Fundamentais
1. Distribuição de ações
Tráfego Real:
┌─────────────────────────────────┐
│ Ação │ % dos usuários │
├───────────────┼────────────────┤
│ Home │ 100% │
│ Browse │ 80% │
│ Search │ 45% │
│ Product View │ 60% │
│ Add to Cart │ 15% │
│ Checkout │ 3% │
│ Payment │ 2.5% │
└─────────────────────────────────┘
Teste Sintético Típico:
- Todos passam por todos os passos
- Funil artificial de 100%
2. Think time
Tráfego Real:
- Usuário lê página: 30s-5min
- Decide se compra: variável
- Distrai, volta depois: comum
Teste Sintético:
- Think time fixo: 5s
- Sem variação
- Comportamento robótico
3. Dados únicos
Tráfego Real:
- Milhões de produtos diferentes
- Milhares de termos de busca
- Cada usuário tem histórico único
Teste Sintético:
- 10 produtos de teste
- 5 termos de busca
- IDs sequenciais
4. Padrões temporais
Tráfego Real:
- Ramp-up orgânico ao longo de horas
- Picos em horários específicos
- Variação por dia da semana
Teste Sintético:
- Ramp-up de 60s para carga total
- Carga constante
- Sem variação temporal
Impacto no Sistema
Cache effectiveness
Real:
GET /product/12345 → cache miss
GET /product/67890 → cache miss
GET /product/11111 → cache miss
Cache hit rate: 30-40%
Sintético:
GET /product/TEST1 → cache miss
GET /product/TEST1 → cache hit
GET /product/TEST1 → cache hit
Cache hit rate: 95%
Resultado: DB sobrecarrega em produção
Connection patterns
Real:
- Conexões persistentes variam
- Sessões longas e curtas misturadas
- Reconexões frequentes
Sintético:
- Pool de conexões estáveis
- Reuso máximo
- Sem churn de conexões
Query diversity
Real:
SELECT * FROM products WHERE name LIKE '%sapato%'
SELECT * FROM products WHERE category = 'eletrônicos'
SELECT * FROM products WHERE price < 100
→ Query plans variados, índices diferentes
Sintético:
SELECT * FROM products WHERE id = 1
SELECT * FROM products WHERE id = 1
SELECT * FROM products WHERE id = 1
→ Mesmo query plan, cache do DB maximizado
Como Aproximar da Realidade
1. Analisar tráfego real primeiro
-- Distribuição de endpoints
SELECT
endpoint,
count(*) as hits,
count(*) * 100.0 / sum(count(*)) over() as percentage
FROM access_logs
WHERE timestamp > now() - interval '7 days'
GROUP BY endpoint
ORDER BY hits DESC;
-- Termos de busca mais comuns
SELECT
search_term,
count(*) as frequency
FROM search_logs
WHERE timestamp > now() - interval '30 days'
GROUP BY search_term
ORDER BY frequency DESC
LIMIT 1000;
2. Modelar distribuições reais
// k6 com distribuição realista
export default function () {
const action = randomWeighted({
browse: 0.80,
search: 0.45,
view_product: 0.60,
add_cart: 0.15,
checkout: 0.03,
});
// Think time com distribuição log-normal
// (mais realista que uniforme)
sleep(randomLogNormal(30, 2));
// Dados variados de pool realista
const product = getRandomProduct(productPool);
const searchTerm = getRandomSearchTerm(searchTerms);
}
3. Usar dados de produção (anonimizados)
Ideal:
- Export de IDs de produtos reais
- Termos de busca reais (sem PII)
- Distribuição de categorias real
Processo:
1. Query em produção para extrair dados
2. Anonimizar/mascarar dados sensíveis
3. Criar pool de dados para teste
4. Usar pool com distribuição proporcional
4. Simular padrões temporais
// Simular ramp-up orgânico
export const options = {
scenarios: {
organic_ramp: {
executor: 'ramping-arrival-rate',
startRate: 10,
timeUnit: '1m',
preAllocatedVUs: 50,
maxVUs: 500,
stages: [
{ duration: '2h', target: 100 }, // Manhã
{ duration: '2h', target: 300 }, // Pico
{ duration: '2h', target: 200 }, // Tarde
{ duration: '2h', target: 400 }, // Pico noturno
{ duration: '2h', target: 50 }, // Madrugada
],
},
},
};
5. Incluir comportamentos edge-case
Não esqueça:
- Usuários que abandonam no meio
- Requisições duplicadas (double-click)
- Timeouts e retries do cliente
- Sessões que expiram
- Browsers antigos/lentos
- Mobile vs Desktop mix
Validando a Simulação
Comparar métricas
Métricas para validar:
Cache:
Produção hit rate: 42%
Teste hit rate: 85% ← Muito alto, ajustar
DB:
Produção queries/s: 5000
Teste queries/s: 1200 ← Muito baixo
Latency distribution:
Produção p99/p50 ratio: 8x
Teste p99/p50 ratio: 2x ← Muito uniforme
Checklist de realismo
## Validação de Cenário
### Dados
- [ ] Pool de produtos > 1000 itens?
- [ ] Termos de busca > 500 únicos?
- [ ] IDs de usuário não sequenciais?
### Comportamento
- [ ] Funil reflete conversão real?
- [ ] Think time é variável?
- [ ] Mix de ações reflete analytics?
### Temporal
- [ ] Ramp-up > 30 minutos?
- [ ] Variação de carga incluída?
- [ ] Duração mínima 1 hora?
### Edge cases
- [ ] Abandono incluído?
- [ ] Erros do cliente simulados?
- [ ] Mix de dispositivos?
Técnicas Avançadas
Traffic replay
Conceito:
Capturar tráfego real de produção
Reproduzir em ambiente de teste
Ferramentas:
- GoReplay (goreplay)
- TCPReplay
- Custom log replay
Cuidados:
- Anonimizar dados sensíveis
- Ajustar timestamps
- Escalar proporcionalmente
Shadow traffic
Conceito:
Duplicar % do tráfego real para ambiente de teste
Comparar comportamento em tempo real
Vantagem:
Tráfego 100% real
Desvantagem:
Requer infra duplicada
Cuidado com side effects
Production testing (com cautela)
Técnicas:
- Canary deployment
- Feature flags
- Traffic shifting gradual
Permite:
Validar com tráfego real
Em escala real
Com rollback rápido
Conclusão
Tráfego sintético é necessário, mas precisa ser realista:
- Analise produção primeiro - entenda o comportamento real
- Modele distribuições - não use valores fixos
- Diversifique dados - evite cache artificial
- Simule padrões temporais - ramp-up orgânico
- Valide contra produção - compare métricas
O objetivo não é passar no teste. É prever o comportamento em produção.
Este artigo faz parte da série sobre a metodologia OCTOPUS de Performance Engineering.