Skip to content
Latchkey

O Que É uma Race Condition em Testes? Explicação

Uma race condition é um defeito cujo resultado depende do tempo ou da ordenação relativa das operações, então o desfecho muda conforme velocidade, escalonamento ou paralelismo.

Race conditions são uma das principais causas de testes flaky. Como o bug só aparece quando as operações se intercalam em uma ordem específica, ele surge de forma intermitente, em um runner lento, sob paralelismo pesado ou aparentemente ao acaso, o que o torna enlouquecedor de reproduzir.

O que é uma race condition

Uma race condition existe quando duas ou mais operações podem terminar em ordens diferentes, e ao menos uma ordenação produz um resultado errado. A "corrida" é entre elas; quem vence muda o desfecho. Código correto não deve depender de qual delas termina primeiro.

Por que elas causam flakiness

Testes muitas vezes assumem que uma operação terminou antes de fazer a assertion sobre seu resultado. Se a operação é assíncrona, uma máquina rápida pode deixá-la terminar a tempo enquanto uma máquina lenta ou carregada não deixa, então o mesmo teste passa localmente e falha em CI. O resultado depende do tempo, que é a definição de flaky.

Onde elas aparecem em testes

  • Fazer a assertion antes de uma operação assíncrona, timer ou promise ter resolvido.
  • Estado compartilhado mutado por testes ou workers paralelos sem isolamento.
  • Depender da ordem de itens que chegam de forma concorrente.
  • Confiar em um sleep fixo em vez de esperar por uma condição real.

Como corrigi-las

Substitua sleeps fixos por esperas explícitas pela condição real. Isole o estado compartilhado para que os testes não possam interferir. Use um race detector se sua linguagem oferecer um. O objetivo é tornar o teste determinístico para que seu resultado não dependa mais de quem vence a corrida.

A perspectiva da Latchkey

Uma race condition é um bug real no seu teste ou código, então a Latchkey não pode corrigi-la por você. Mas ao aplicar autocorreção às falhas transitórias de infraestrutura ao redor dela, a Latchkey reduz o ruído para que as falhas que restam sejam mais claramente race conditions genuínas que valem a pena corrigir.

Principais conclusões

  • Uma race condition faz os resultados dependerem de tempo ou ordenação.
  • É uma das principais causas de testes flaky que passam localmente mas falham em CI.
  • Assertions assíncronas, estado compartilhado e sleeps fixos são origens comuns.
  • Corrija esperando por condições reais e isolando o estado compartilhado.

Guias relacionados