Skip to content

Repetidoras

As repetidoras permitem executar várias vezes uma mesma requisição HTTP. Existem cenários em que isso é útil:

  • Para obter respostas diversas de um mesmo endpoint.
  • Para baixar vários arquivos de um site.
  • Para garantia de qualidade, executando repetições para cada caso de teste.
  • Para executar testes de carga.
  • Entre outros.

ExemploRepetidora

Modos de repetição

Simples

Nesse tipo, a requisição é invariável - sempre a mesma para todas as execuções.

Seqüencial

As repetições seqüenciais requerem dados de entrada (leia mais a seguir), sendo que cada linha de entrada corresponderá a uma requisição. Não há paralelismo no modo seqüencial - uma requisição é enviada apenas após o fim da anterior, como em uma fila.

Aleatório

No modo aleatório, cada requisição utilizará uma linha de entrada aleatória escolhida dentre o conjunto fornecido. Há suscetibilidade de redundância, isto é, uma linha de entrada pode acabar sendo usada em mais de uma requisição.

Parâmetros

A quantidade é o número de requisições que serão disparadas.

Paralelismo é o número máximo de requisições que podem ocorrer simultaneamente.

A espera é o tempo aguardado entre o fim de uma requisição e o início da próxima.

INFO

Em caso de paralelismo, a espera ocorre de forma independente em cada "pista" paralela.

Dados de entrada

Os dados de entrada fornecem valores para variáveis das requisições, permitindo variações entre as chamadas.

Suponha que você quer consultar uma API de frutas e obter dados sobre laranja (orange), morango (strawberry) e abacaxi (pineapple). Você pode fazer isso criando uma requisição HTTP base, GET https://www.fruityvice.com/api/fruit/{{fruta}}, e em seguida criar uma repetidora, com os seguintes dados de entrada:

json
[
  { "fruta": "orange" },
  { "fruta": "strawberry" },
  { "fruta": "pineapple" },
]

O vídeo abaixo mostra como usar dados de entrada em repetições.

O formato dos dados de entrada é um array JSON de objetos, cada objeto formado por pares chave-valor de string-string. Cada objeto é considerado uma linha de entrada e cada par chave-valor é uma variável (nome-valor).

json
[
  // linha 1
  {
    "variavel1": "ABC",
    "variavel2": "123"
  },
  // linha 2
  {
    "variavel1": "DEF",
    "variavel2": "456"
  },
  // linha 3
  {
    "variavel1": "GHI",
    "variavel2": "789"
  },  
  {
    "variavel1": "GHI",
    "variavel2": 789 // inválido: precisa ser string-string
  }, 
  {
    "variavel1": "GHI",
    "variavel2": true // inválido: precisa ser string-string
  }, 
]

TIP

Em repetidoras, variáveis de entrada têm precedência sobre variáveis de coleção e de ambiente.

Relatórios

Ao fim da execução, você pode extrair um relatório CSV das repetições, contendo informações sobre o status das respostas (exceção, cancelamento, HTTP status code), momento de início, duração e quais foram as variáveis usadas para aquela chamada.

Testes de carga

As repetidoras podem ser usadas para testes de carga, através do desktop ou por dotnet test e console.

O Pororoca, pelo menos por enquanto, não mensura latência (ping) e banda (throughput).

INFO

HTTP/2 e HTTP/3 operam de forma diferente em relação ao HTTP/1, pois multiplexam várias chamadas em uma mesma conexão, enquanto que o HTTP/1 cria novas conexões TCP se não houver conexões ociosas disponíveis na pool; essa é uma das principais razões de as versões novas do HTTP serem mais eficientes e rápidas.

Essa distinção implica que o paralelismo com HTTP/2 e HTTP/3 funciona apenas até certo ponto, porque internamente as requisições entram em uma fila antes de serem enviadas através da conexão. O número máximo de requisições / streams concorrentes em uma mesma conexão é determinado do lado do servidor. Há uma issue interessante no GitHub sobre esse assunto.

Automação e linha de comando

Leia mais na página Testes automatizados.

Espera e rate-limiting

Esse tempo é útil em casos de limitação de chamadas por tempo (rate-limiter).

Considere uma API que tolera apenas N chamadas por segundo. Supondo que cada chamada demore um tempo T de resposta, então o tempo de espera mínimo E é:

E >= (1/N) - T

Por exemplo: se o tempo de resposta T for de 10ms e N for de 5 reqs/segundo, então o tempo de espera precisa ser de pelo menos 190ms (1s/5 - 10ms).