Modelos abertos e fechados em testes de performance com k6.
Source: Dev.to
Conceitos básicos
Em um teste de performance, o modelo define como o sistema controla a chegada e a saída de usuários virtuais (VUs) durante o ciclo de execução.
- Modelo fechado – O número de VUs é fixo. Cada VU inicia a próxima iteração somente quando a anterior termina. A concorrência permanece constante.
- Modelo aberto – Novos VUs chegam a uma taxa constante, independente do que os VUs já ativos estejam fazendo. Esse comportamento se aproxima mais do que ocorre em sistemas reais, onde usuários chegam continuamente.
A escolha do modelo muda completamente a semântica do teste planejado. Em alguns cenários queremos controlar quantos usuários estão ativos ao mesmo tempo; em outros, queremos garantir que uma determinada taxa de requisições (RPS) seja mantida, independentemente do número de usuários necessários para atingi‑la.
Modelo Fechado
Exemplo de script
export const options = {
scenarios: {
modelo_fechado: {
executor: 'constant-vus',
vus: 50,
duration: '1m',
},
},
};
export default function () {
// sua lógica de teste
}
Consequência: se o sistema ficar lento, a taxa de requisições cai automaticamente, pois as VUs aguardam a resposta antes de iniciar uma nova iteração. O pool de usuários ativos nunca cresce além do valor configurado.
Quando usar
- Aplicações internas corporativas – grupo fixo de funcionários acessa o sistema simultaneamente.
- Sistemas com sessões controladas – plataformas de streaming com limite de conexões por conta.
- Testes de resistência (Soak Tests) – objetivo de manter carga constante por longos períodos e observar o comportamento ao longo do tempo.
Executores disponíveis (modelo fechado)
| Executor | Descrição |
|---|---|
constant-vus | Mantém um número fixo de VUs durante todo o teste. |
ramping-vus | Aumenta ou diminui gradualmente o número de VUs. |
per-vu-iterations | Cada VU executa um número fixo de iterações. |
shared-iterations | Um pool de VUs compartilha um número total fixo de iterações. |
Modelo Aberto
Exemplo de script
export const options = {
scenarios: {
modelo_aberto: {
executor: 'constant-arrival-rate',
rate: 100, // 100 VUs por unidade de tempo
timeUnit: '1s',
duration: '1m',
preAllocatedVUs: 50, // VUs pré‑alocadas antes do início
maxVUs: 200, // número máximo de VUs que podem ser criados
},
},
};
export default function () {
// sua lógica de teste
}
Comportamento: se o sistema ficar lento, o k6 precisará de mais VUs para manter a taxa configurada.
Quando usar
- APIs REST públicas – múltiplos clientes realizam requisições continuamente.
- E‑commerces e portais web – usuários chegam de forma independente.
- Testes de pico (Spike Tests) – simular aumento repentino e intenso de tráfego.
- Testes de capacidade (Capacity Tests) – descobrir quantas requisições por segundo o sistema sustenta antes de degradar.
Executores disponíveis (modelo aberto)
| Executor | Descrição |
|---|---|
constant-arrival-rate | Mantém uma taxa fixa de iterações por unidade de tempo. |
ramping-arrival-rate | Aumenta ou diminui gradualmente a taxa de chegada. |
Comparação resumida
| Característica | Modelo Fechado | Modelo Aberto |
|---|---|---|
| O que é controlado | Número de VUs | Taxa de chegada de iterações |
| Comportamento sob lentidão | Taxa de requisições cai | Número de VUs aumenta para manter a taxa |
| Realismo | Menor (adequado a ambientes controlados) | Maior para sistemas web com tráfego orgânico |
| Tipos de teste | Smoke, Soak, Load, Stress | Load, Spike, Capacity |
| Executores k6 | constant-vus, ramping-vus, … | constant-arrival-rate, ramping-arrival-rate |
Atenção ao escolher o modelo
Muitos times ainda utilizam o modelo fechado para todos os testes por ser o padrão e o mais simples de configurar. Em sistemas web com tráfego orgânico, isso pode mascarar problemas sérios de performance.
Cenário ilustrativo:
- O sistema começa a responder lentamente devido a sobrecarga.
- Modelo fechado: as VUs ficam aguardando respostas, a taxa de requisições cai automaticamente, reduzindo a pressão sobre a aplicação e gerando uma falsa impressão de estabilização.
- Modelo aberto: novos usuários continuam chegando na taxa configurada, expondo a degradação real da aplicação.
// Modelo fechado: a taxa de requisições cai quando o sistema fica lento
executor: 'constant-vus', vus: 100
// Modelo aberto: a pressão é mantida, e o sistema é exposto
executor: 'constant-arrival-rate', rate: 100, timeUnit: '1s'
Sistema em produção
Use o modelo fechado quando o número de usuários simultâneos é o que importa, e o modelo aberto quando a taxa de chegada de requisições é o fator crítico.
Gostou do conteúdo e quer saber mais sobre testes de performance com K6?
Confira meu curso na Udemy!