Un recente dibattito all'interno del mio team mi ha fatto meravigliare. L'argomento di base è che quanto e cosa copriremo con test funzionali / di integrazione (certo, non sono gli stessi ma l'esempio è fittizio dove non ha importanza).
Diciamo che hai una classe "controller" come:
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);
}
}
Abbiamo bisogno di un sacco di test delle unità (ad esempio, se la convalida fallisce, o nessun dato in DB, ...), è fuori questione.
Il nostro problema principale e su cosa non possiamo essere d'accordo è che quanti test di integrazione lo devono coprire: -)
Sono dalla parte che punteremo a meno test di integrazione (test piramide). Quello che vorrei coprire da questo è solo un singolo percorso felice-infelice in cui l'esecuzione ritorna dall'ultima riga, solo per vedere se metto insieme queste cose non esploderà.
Il problema è che non è così facile capire perché il risultato del test è falso, e questo fa sentire a disagio alcuni dei ragazzi (ad esempio, se controlliamo solo il valore restituito, è nascosto che il il test è verde perché qualcuno ha cambiato la validazione e restituisce false). Certo, sì, possiamo coprire tutti i casi, ma quello sarebbe un pesante effetto eccessivo.
Qualcuno ha una buona regola empirica per questo tipo di problemi? O una raccomandazione? Lettura? Parlare? Post sul blog? Qualcosa sull'argomento?
Grazie mille in anticipo!
PS: Sry per l'esempio brutto, ma è piuttosto difficile tradurre una parte di codice specifica in un esempio. Sì, si può discutere di lanciare eccezioni / usare un tipo diverso di ritorno / ecc. ma la nostra mano è più o meno vincolata a causa di dipendenze esterne.
PS2: ho spostato questo argomento da SO qui (domanda originale, contrassegnata in attesa )