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.