1
resposta

[Reclamação] Tests Flakes

O curso está até entregando bem quando a ensinar o uso da ferramenta. Mas está com algumas más praticas que geram muitos testes flakes. Quando o aluno roda a switch de testes inteira, isso pode e provavelmente vai fazer alguns testes passarem as vezes sim e as vezes não. Isso pode causar muita duvida pra quem está iniciando na area e acho que deveriam ter tomado mais cuidado com isso. Poderiam ter pelo menos passado os testes com a estrategia de rodar transações e rollbacks no final de cada teste. Assim evitaria um teste interferir em outro. Enfim, tem muitas estretegias que poderiam ter sido abordadas para resolver esse problema.

1 resposta

Olá, Jonas! Tudo bem?

Entendo perfeitamente a sua frustração e agradeço demais por trazer esse ponto com a autoridade de quem atua como Engenheiro de Software. Você tocou em uma ferida real de projetos de larga escala: os Test Flakes (ou testes não determinísticos).

Concordo com você que, para quem está começando, ver um teste passar "agora sim, agora não" sem mudar uma linha de código é a receita ideal para a confusão. O fenômeno ocorre justamente porque os testes de integração, por natureza, tocam em recursos externos (como o banco de dados) e, sem o devido isolamento, um teste acaba herdando o "lixo" ou o estado deixado pelo anterior.

Sobre a estratégia de Transações e Rollbacks

Sua sugestão é cirúrgica. Utilizar IDbContextTransaction com um rollback ao final de cada Fact ou Theory é uma das formas mais elegantes e performáticas de garantir que o banco volte ao estado original sem o custo de deletar e recriar o esquema a cada execução.

Outras abordagens que poderiam mitigar isso no contexto do curso seriam:

  • Respawn: O uso de bibliotecas como o Respawn para resetar o banco de dados para um estado limpo rapidamente.
  • Isolamento por Banco: Criar um banco de dados único (como um GUID no nome do DB) por classe de teste ou coleção.
  • Data Cleaning: Métodos de Dispose mais rigorosos para garantir a limpeza.

O equilíbrio no ensino

Muitas vezes, em cursos introdutórios de ferramentas específicas (como o uso de uma biblioteca de API), acaba-se priorizando o "como a ferramenta funciona" em detrimento do design de infraestrutura de teste para manter a carga cognitiva focada no novo framework. No entanto, como você bem pontuou, as boas práticas de engenharia não deveriam ser sacrificadas, pois elas evitam que o aluno aprenda "vícios" de desenvolvimento.

Sua observação é extremamente valiosa para a evolução do material. Vou registrar esse feedback internamente para que a equipe de conteúdo avalie a inclusão de uma aula extra ou um artigo complementar abordando exatamente essas estratégias de isolamento de estado, transformando essa "má prática" em uma oportunidade de ensinar sobre resiliência de suítes de teste.

Obrigado por contribuir para elevar o nível técnico da comunidade!

Espero que possa ter lhe ajudado!