Non solo i test unitari facilitano la progettazione, ma questo è uno dei loro principali vantaggi.
La scrittura di test-first elimina la modularità e la struttura del codice pulita.
Quando scrivi per la prima volta il tuo test di codice, scoprirai che ogni "condizione" di una data unità di codice viene naturalmente spinta alle dipendenze (di solito tramite mock o stub) quando le assumi nel tuo codice.
"La condizione data x, aspetto il comportamento y", spesso diventa uno stub per 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à verificata alla fine del test (a meno che non sia un "dovrebbe restituire y
", nel qual caso il test verificherà solo esplicitamente il valore di ritorno).
Quindi, una volta che questa unità si è comportata come specificato, passerai alla scrittura delle dipendenze (per x
e y
) che hai scoperto.
Ciò rende la scrittura di codice pulito e modulare un processo molto semplice e naturale, dove altrimenti è spesso facile sfocare le responsabilità e accoppiare i comportamenti insieme senza rendersene conto.
Scrittura di test successivi ti dirà quando il tuo codice è strutturato in modo scadente.
Quando scrivere i test per un pezzo di codice diventa difficile perché ci sono troppe cose da mozzare o da mockare, o perché le cose sono troppo strettamente accoppiate, sai che hai miglioramenti da apportare al tuo codice.
Quando "cambiare i test" diventa un fardello perché ci sono così tanti comportamenti in una singola unità, sai che hai dei miglioramenti da fare nel tuo codice (o semplicemente nel tuo approccio alla scrittura dei test - ma questo di solito non è il caso la mia esperienza).
Quando i tuoi scenari diventano troppo complicati ("se x
e y
e z
poi ...") perché devi astrarre di più, sai che hai miglioramenti da apportare al tuo codice.
Quando finisci con gli stessi test in due fixture diverse a causa della duplicazione e della ridondanza, sai che hai 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 e idee sbagliate comuni sul buon design e testabilità in generale.