Sicuramente. Alcuni dicono "qualsiasi test è meglio di nessun test". Non sono assolutamente d'accordo: i test scritti male impantanano i tempi di sviluppo e finisci per perdere giorni a correggere i test "non funzionanti" perché non erano dei buoni test unitari in primo luogo. Per me al momento, le due cose su cui mi sto concentrando per rendere i miei test preziosi, piuttosto che un peso, sono:
Maintainability
Dovresti testare il risultato ( cosa succede ), non il metodo ( come succede). Il tuo set-up per il test dovrebbe essere il più possibile disaccoppiato dall'implementazione: solo impostare i risultati per le chiamate di servizio ecc. Che sono assolutamente necessari.
- Utilizza un framework di simulazione per assicurarti che i tuoi test non dipendano da nulla di esterno
- Favorisci gli stub su mock (se il tuo framework li distingue) ove possibile
- Nessuna logica nei test! Se, switch, for-eaches, casi, try-catches ecc. Sono tutti grandi no-no, in quanto possono introdurre bug nel codice di test stesso
La leggibilità
Va bene consentire un po 'più di ripetizioni nei tuoi test, che normalmente non permetti nel codice di produzione, se li rende più leggibili. Basta bilanciare questo con la manutenibilità di cui sopra. Sii esplicito in ciò che sta facendo il test!
- Cerca di mantenere uno stile "ordina, recita, asserisci" per i tuoi test. Questo separa la configurazione e le aspettative dello scenario, dall'azione eseguita e dal risultato che si asserisce.
- Mantenere una logica asserzione per test (se il nome del test ha "e" in esso, potrebbe essere necessario scomporlo in più test)
In conclusione, dovresti essere molto interessato ai test "puzzolenti": possono finire per perdere tempo, senza fornire alcun valore.
Hai detto:
Unit testing usually requires various "smelly hacks" like stubbing functions.
Sembra che si possa sicuramente fare con la lettura di alcune tecniche di Unit Testing, come l'utilizzo di un framework di Mocking, per rendere la vita molto più semplice. Consiglio vivamente di The Art of Unit Testing , che copre quanto sopra e molto altro ancora. L'ho trovato illuminante dopo aver lottato con test scritti male, irrimediabilmente "maleodoranti" per molto tempo. È uno dei migliori investimenti in termini di tempo che ho fatto quest'anno!