zanfranceschi / rinha-de-backend-2024-q1

Repositório da 2ª edição da Rinha de Backend
https://twitter.com/rinhadebackend
MIT License
1.79k stars 933 forks source link

Teste de performance pode iniciar antes do fim dos testes de critérios, causando falsos negativos. #670

Closed felipemarkson closed 8 months ago

felipemarkson commented 8 months ago

Nas seguintes linhas:

https://github.com/zanfranceschi/rinha-de-backend-2024-q1/blob/80933286f8b7ba7a2007775d94ff68a2ddbdd393/load-test/user-files/simulations/rinhabackend/RinhaBackendCrebitosSimulation.scala#L300-L310

O teste criteriosClientes acontece em paralelo com criterioClienteNaoEcontrado.

Se o resultado de criterioClienteNaoEcontrado retornar antes da finalização de criteriosClientes, o teste de perfomance irá inicializar, causando falsos negativos no teste criteriosClientes, pois quando se faz o request do extrato, requisições do teste perfomance já podem ter sido iniciadas.

A solução seria adicionar um andThen para que o test de perfomance se inicie apenas após o teste, criteriosClientes.

).andThen(
  criteriosClientes.inject(
    atOnceUsers(saldosIniciaisClientes.length)
  ).andThen( // AQUI!
  criterioClienteNaoEcontrado.inject(
    atOnceUsers(1)
  ).andThen(
    debitos.inject(
      rampUsersPerSec(1).to(220).during(2.minutes),
      constantUsersPerSec(220).during(2.minutes)
    ),

Podem confirmar se eu entendi certo? Não tenho experiência com Gatling :(

zanfranceschi commented 8 months ago

Mmm, eu acho que vc tá certo... talvez eu tenha errado o aninhamento dos andThen... Vou dar uma conferida depois. Valeu!

zanfranceschi commented 8 months ago

Dei uma olhada aqui e tá certo mesmo. O próximo cenário (seguido de andThen) não começa antes de todos os anteriores terminarem. Ufa, não vou ter que testar tudo de novo kkkk

felipemarkson commented 8 months ago

Vishe, eu to com algum problema então. Porque tá dando problema exatamente nesse cenário. quando eu coloco o andThen volta a funcionar.

Acho que um teste possível seria colocar um "sleep" asincrono (se tiver usando aync) nas requisições de transferência.

Isso só acontece se o serviço for async ou paralelizado e muitas conexões no DB. Tem que dar tempo para iniciar o teste de criterioClienteNaoEcontrado

@zanfranceschi

felipemarkson commented 8 months ago

Oi, eu consegui criar um exemple minino que reproduz esse problema:

https://github.com/felipemarkson/rinhatest

É em JavaScript, mas acho que qualquer linguagem com async é possível reproduzir.

Pode abrir de novo essa issue?

@zanfranceschi