Um debate recente dentro da minha equipe me fez pensar. O tópico básico é quanto e o que devemos cobrir com testes funcionais / de integração (com certeza, eles não são os mesmos, mas o exemplo é fictício onde não importa).
Digamos que você tenha uma classe "controller" algo como:
public class SomeController {
@Autowired Validator val;
@Autowired DataAccess da;
@Autowired SomeTransformer tr;
@Autowired Calculator calc;
public boolean doCheck(Input input) {
if (val.validate(input)) {
return false;
}
List<Stuff> stuffs = da.loadStuffs(input);
if (stuffs.isEmpty()) {
return false;
}
BusinessStuff businessStuff = tr.transform(stuffs);
if (null == businessStuff) {
return false;
}
return calc.check(businessStuff);
}
}
Precisamos de muitos testes de unidade com certeza (por exemplo, se a validação falhar ou se não houver dados no DB, ...), isso está fora de questão.
Nossa questão principal e sobre o que não podemos concordar é que a quantidade de testes de integração deve cobrir :-)
Estou do lado de que procuraremos menos testes de integração (pirâmide de teste). O que eu cobriria disso é apenas um caminho feliz e infeliz, em que a execução retorna da última linha, apenas para ver se eu coloco essas coisas juntas, não vai explodir.
O problema é que não é tão fácil dizer por que o teste resultou em falso, e isso faz com que alguns dos caras se sintam desconfortáveis com ele (por exemplo, se simplesmente verificarmos apenas o valor de retorno, fica oculto que o teste é verde porque alguém alterou a validação e ela retorna false). Claro, sim, podemos cobrir todos os casos, mas isso seria um imho excessivo.
Alguém tem uma boa regra de ouro para esse tipo de problema? Ou uma recomendação? Lendo? Conversa? Postagem no blog? Alguma coisa sobre o assunto?
Muito obrigado antecipadamente!
PS: Procure o exemplo feio, mas é muito difícil traduzir uma parte específica do código em um exemplo. Sim, pode-se discutir sobre lançar exceções / usar um tipo de retorno diferente / etc. mas nossa mão está mais ou menos limitada por causa de dependências externas.
PS2: mudei este tópico de SO para cá (pergunta original, marcada em espera )