Le migliori pratiche hanno sempre uno scopo, un motivo dietro di loro. È sempre una buona idea considerare questi motivi nel tuo progetto, specialmente quando stai cercando di decidere come e quanto difficile seguire queste migliori pratiche.
In questo caso, il ragionamento principale alla base del rendere ogni test una cosa sola è che se la prima cosa fallisce, la seconda non verrà testata. Dal momento che troppi opinionisti sembrano trovare il merito di spezzare tutto nei pezzetti più piccoli possibili e di avvolgerli il più possibile in eccesso, ciò ha dato vita all'idea che ogni test dovrebbe contenere una singola affermazione.
Non seguirlo ciecamente. Anche se ogni test dovrebbe testare una cosa, dovresti comunque pensare a decidere quanto grande o piccola dovrebbe essere ogni "cosa", e per farlo devi tenere presente il motivo per cui vuoi che ogni test test una cosa - per assicurarti un bug nella prima cosa non sta lasciando la seconda cosa non testata.
Quindi, devi chiederti: "Ho davvero bisogno di questa garanzia qui?"
Diciamo che c'è un bug nel primo caso di test - il codice di risposta HTTP no 200
. Quindi inizi a hackerare il codice, scopri perché non hai ricevuto il codice di risposta che dovresti avere e risolvi il problema. E adesso?
- Se si esegue nuovamente il test manualmente, per verificare che la correzione abbia risolto il problema, è necessario eseguire qualsiasi altro problema nascosto dal primo errore.
- Se non lo esegui manualmente (forse perché impiega troppo tempo?) E spingi semplicemente la correzione in attesa che il server dei test automatizzati esegua tutto, allora potresti voler inserire assert diversi in test diversi. I cicli in questo caso sono molto lunghi, quindi vale la pena fare lo sforzo di scoprire quanti più bug in ogni ciclo.
Ci sono alcune altre cose da considerare:
Dipendenze delle asserzioni
So che i test che hai descritto sono solo un esempio, e i tuoi test reali sono probabilmente più complicati, quindi quello che sto per dire potrebbe non essere valido con la stessa forza nei test reali, ma potrebbe comunque essere in qualche modo efficace potrebbe voler considerarlo.
Se si dispone di un servizio REST (o di qualsiasi altro protocollo HTTP) che restituisce risposte in formato JSON, di solito si scrive una semplice classe client che consente di utilizzare i metodi REST come i normali metodi che restituiscono oggetti regolari. Supponendo che il cliente abbia test separati per assicurarsi che funzioni, avrei abbandonato le prime 3 affermazioni e ne avrei conservate solo 4!
Perché?
- La prima asserzione è ridondante: la classe client dovrebbe generare un'eccezione se il codice di risposta HTTP non è 200.
- La seconda asserzione è ridondante: se la risposta è vuota, l'oggetto risultato sarà nullo o un'altra rappresentazione di un oggetto vuoto e non avrai nessun posto dove mettere la chiave X.
- La terza asserzione è ridondante: se JSON non è valido, si otterrebbe un'eccezione quando si tenta di analizzarla.
Quindi non è necessario eseguire tutti questi test: basta eseguire il quarto test e se si verifica uno dei bug che i primi tre tentativi di rilevare si verificano, il test fallirà con un'eccezione adeguata prima ancora di ottenere l'asserzione effettiva.
Come si desidera ricevere i rapporti?
Supponiamo che non riceviate e-mail da un server di prova, ma invece il dipartimento di controllo qualità esegue i test e avvisa l'utente dei test non riusciti.
Jack del QA bussa alla tua porta. Dice che il primo metodo di test non è riuscito e che il metodo REST ha restituito un codice di risposta errato. Lo ringrazi e inizi a cercare la causa principale.
Quindi arriva Jen dal QA e afferma che il terzo metodo di test ha avuto esito negativo: il metodo REST non ha restituito un JSON valido nel corpo della risposta. Le dici che stai già esaminando quel metodo e ritieni che la stessa cosa che ha causato la restituzione di un codice di uscita errato abbia causato anche la restituzione di qualcosa che non è un JSON valido e assomiglia più a una traccia dello stack delle eccezioni.
Torna a lavorare, ma poi arriva Jim dal QA, dicendo che il quarto metodo di test ha fallito e non c'è la chiave X nella risposta ...
Non puoi nemmeno cercare il motivo perché è difficile guardare il codice quando non hai uno schermo di computer. Se Jim fosse stato abbastanza veloce avrebbe potuto schivare in tempo ...
Le e-mail dal server di test sono più facili da eliminare, ma comunque - non preferiresti essere avvisato UNA VOLTA che qualcosa non va con il metodo di test e guardare tu stesso i log di test pertinenti?