I test unitari hanno qualcosa di misterioso al giorno d'oggi. Le persone lo trattano come se la copertura del test al 100% fosse un santo graal e come se il test unitario fosse l'unico vero modo di sviluppare software.
Manca il punto.
Il test unitario non è la risposta. Il test è.
Ora, ogni volta che sorge questa discussione, qualcuno (spesso anche io) traccerà la citazione di Dijkstra: "I test del programma possono dimostrare la presenza di bug, ma mai dimostrare la loro assenza". Dijkstra ha ragione: i test non sono sufficienti per dimostrare che il software funziona come previsto. Ma è necessario : a un certo livello, deve essere possibile dimostrare che il software sta facendo quello che vuoi.
Molte persone testano a mano. Anche gli appassionati di TDD faranno test manuali, anche se a volte non lo ammetteranno. Non può essere aiutato: poco prima di entrare nella sala conferenze per dimostrare il tuo software al tuo cliente / capo / investitori / ecc., Lo attraverserai a mano per assicurarti che funzioni. Non c'è niente di sbagliato in questo, e in effetti sarebbe folle solo aspettarsi di tutto per andare senza problemi, senza che l'attraversa manualmente - cioè, testarlo - anche se si dispone di una copertura unit test al 100% e la massima fiducia nei test .
Ma i test manuali, anche se necessari per la creazione di software, raramente sono sufficienti . Perché? Perché i test manuali sono noiosi, dispendiosi in termini di tempo ed eseguiti da esseri umani. E gli umani sono notoriamente cattivi nell'esecuzione di compiti noiosi e dispendiosi in termini di tempo: evitano di farli quando possibile e spesso non li fanno bene quando sono costretti a farlo.
Le macchine , d'altra parte, sono eccellenti nell'esecuzione di compiti noiosi e che richiedono tempo. Questo è ciò per cui i computer sono stati inventati, dopo tutto.
Pertanto, i test sono cruciali e i test automatici sono l'unico modo ragionevole per garantire che i test vengano utilizzati in modo coerente. Ed è importante testare e ripetere il test, poiché il software è sviluppato. Un'altra risposta qui rileva l'importanza dei test di regressione . A causa della complessità dei sistemi software, le modifiche spesso apparentemente innocue a una parte del sistema causano cambiamenti non intenzionali (ad esempio bug) in altre parti del sistema. Non è possibile scoprire queste modifiche indesiderate senza una qualche forma di test. E se vuoi avere dati affidabili sui tuoi test, devi eseguire i tuoi test in modo sistematico, il che significa che devi avere un qualche tipo di sistema di test automatizzato.
Cosa c'entra tutto questo con i test unitari? Bene, per la loro natura, i test unitari vengono eseguiti dalla macchina, non da un essere umano. Pertanto, molte persone hanno la falsa impressione che il test automatizzato sia uguale al test unitario . Ma non è vero: i test unitari sono solo test automatizzati di dimensioni molto ridotte .
Ora, qual è il valore nei test automatici extra piccoli ? Il vantaggio è che testano i componenti di un sistema software in modo isolato , il che consente un targeting più preciso dei test e aiuta il debug . Ma test unitari non significa intrinsecamente test di qualità superiore . Spesso conduce a test di qualità più elevata, grazie alla copertura di software con un livello di dettaglio più fine. Ma è possibile testare completamente il comportamento solo di un sistema completo, e non delle sue parti composite, e comunque testarlo a fondo.
Ma anche con una copertura del test unitario del 100%, un sistema potrebbe non essere ancora completamente testato. Perché i singoli componenti possono funzionare perfettamente in modo isolato, ma comunque fallire se usati insieme. Quindi i test unitari, sebbene estremamente utili, non sono sufficienti per garantire che il software funzioni come previsto. In effetti, molti sviluppatori integrano i test unitari con test di integrazione automatizzati, test funzionali automatizzati e test manuali.
Se non vedi valore nei test unitari, forse il modo migliore per iniziare è utilizzare un diverso tipo di test automatico. In un ambiente Web, l'utilizzo di uno strumento di test di automazione del browser come Selenium offre spesso una grande vittoria per un investimento relativamente piccolo. Dopo aver immerso le dita dei piedi nell'acqua, sarai più facilmente in grado di vedere quanto sono utili i test automatizzati. E una volta che hai i test automatizzati, i test unitari hanno molto più senso, dal momento che fornisce un turnaround più veloce rispetto ai grandi test di integrazione o end-to-end, poiché puoi indirizzare i test solo al componente su cui stai attualmente lavorando.
TL; DR: non preoccuparti ancora dei test unitari . Preoccupati solo di testare prima il tuo software.