Testes devem começar dessa forma:
Primeiro, Deus criou o céu e a terra…
E Deus disse, “Haja luz”…
E devem terminar da seguinte:
a besta que viste, era e não é, está para emergir do abismo e caminha para a destruição
Quando você começa a escrever o teste, não deve existir nenhuma dependência com o estado de um teste anterior. Se você vai usar o banco, ele deve estar vazio. Se vai usar uma classe que guarda estado em um campo static (ugh!), precisa (além de refatorar esse código), reiniciá-la.
Tem uma razão para que isso seja feito. Cada teste deve se comportar como um experimento que sempre dará o mesmo resultado (desde que você não mude o código) não importa quantas vezes você o rode.
Porque você quer isso? Para que não aconteçam falsos negativos e nem falsos positivos. Seus testes precisam ser confiáveis ou você vai passar a ignorá-los.
Imaginem o seguinte caso:
public void testaQueSalvaOsDados(){
//Código que salva "bobagem"
String dado = //código que recupera "bobagem";
assertEquals("bobagem", dado);
}
public void testaQueListaDados(){
List<String> dados = //código que busca todos os dados;
assertEquals(1, dados.size());
assertEquals("bobagem", dados.get(0));
}
Se você rodasse esses testes, o segundo teste passaria apenas na primeira vez. Após isso, ele iria falhar no primeiro assert (o do tamanho da lista).
Esse é um caso bem óbvio de utilização de efeitos colaterais de outro teste. E pode acontecer coisa pior. Imagine que depois de rodar os testes a primeira vez, você quebra o “código que busca todos os dados” e ele passa a trazer apenas o primeiro encontrado. Você terá um bug muito difícil de encontrar, porque os testes passam.
Novamente, esse é um caso bem óbvio. Interações bem mais sutis que essas podem acontecer e você vai sofrer muito para encontrar.
Por isso, sempre que seu teste causar algum efeito colateral, desfaça esse efeito. A sanidade dos programadores que vão dar manutenção no seu código agradece.
Se quiser aprender mais sobre testes, dê uma olhada em nosso treinamento Scrum Developer Skills.