Non solo i test unitari facilitano la progettazione, ma questo è uno dei loro principali vantaggi.
Scrivere test-first elimina la modularità e la struttura pulita del codice.
Quando scrivi il tuo codice test-first, scoprirai che qualsiasi "condizione" di una determinata unità di codice viene naturalmente espulsa alle dipendenze (di solito tramite mock o stub) quando le assumi nel tuo codice.
"Data condizione x, aspettarsi comportamento y" diventerà spesso uno stub da fornire x
(che è uno scenario in cui il test deve verificare il comportamento del componente corrente) e y
diventerà un mock, una chiamata a cui verrà verificato all'indirizzo la fine del test (a meno che non sia un "dovrebbe restituire y
", nel qual caso il test verificherà semplicemente il valore restituito in modo esplicito).
Quindi, una volta che questa unità si comporta come specificato, si passa alla scrittura delle dipendenze (per x
e y
) scoperte.
Ciò rende la scrittura di codice pulito e modulare un processo molto semplice e naturale, dove altrimenti è spesso facile confondere le responsabilità e accoppiare i comportamenti senza rendersene conto.
Scrivere test in seguito ti dirà quando il tuo codice è scarsamente strutturato.
Quando scrivere test per un pezzo di codice diventa difficile perché ci sono troppe cose da stubare o deridere, o perché le cose sono troppo strettamente accoppiate insieme, sai che hai miglioramenti da apportare al tuo codice.
Quando "cambiare i test" diventa un peso perché ci sono così tanti comportamenti in una singola unità, sai che hai miglioramenti da apportare nel tuo codice (o semplicemente nel tuo approccio alla scrittura dei test - ma questo non è solitamente il caso nella mia esperienza) .
Quando i tuoi scenari diventano troppo complicati ("if x
and y
and z
then ...") perché devi estrarre di più, sai che hai dei miglioramenti da apportare al tuo codice.
Quando finisci con gli stessi test in due dispositivi diversi a causa della duplicazione e della ridondanza, sai di avere miglioramenti da apportare al tuo codice.
Ecco un eccellente discorso di Michael Feathers che dimostra la stretta relazione tra testabilità e design nel codice (originariamente pubblicato da displayName nei commenti). Il discorso affronta anche alcune lamentele comuni e idee sbagliate sul buon design e testabilità in generale.