It seems like writing tests is extra work, gives people a crutch when they write the real code, and might not be effective very often.
Il test unitario ha valore come stampella. Supporta i tuoi sforzi di sviluppo, permettendoti di cambiare la tua implementazione senza temere che la tua applicazione smetta di funzionare come richiesto. I test unitari sono anche molto più di una stampella, dato che ti danno uno strumento con cui puoi verificare che la tua implementazione corrisponda ai requisiti.
Tutti i test, sia che si tratti di test unitari, test di accettazione, test di integrazione e così via, sono efficaci quanto quelli che li utilizzano. Se ti avvicini al tuo lavoro in modo sconsiderato, i tuoi test saranno sciatti e la tua implementazione avrà dei problemi. Allora perché preoccuparsi? Ti impegni a testare perché devi dimostrare a te stesso e ai tuoi clienti che il tuo software funziona e non ha alcun problema che potrebbe impedire l'utilizzo del software. Sì, i test sono sicuramente un lavoro extra, ma il modo in cui procedi con i test determinerà quanto impegno dovrai porre per correggere i bug dopo il rilascio e quanto impegno richiederà il codice per cambiare e mantenere.
I understand how unit tests work and how to write them, but can anyone make the case that it's really a good idea and worth the effort and time?
TDD, e davvero qualsiasi metodo che richiede di scrivere test prima che il codice prenda l'approccio che hai messo in atto in anticipo come un acconto sul debito tecnico futuro. Mentre lavori attraverso il progetto, tutto ciò che viene perso, o non implementato correttamente, incorre in un debito più tecnico sotto forma di maggiori difficoltà di manutenzione, che influisce direttamente sui costi futuri e sui requisiti di risorse. Testare in anticipo assicura che non solo ti sei sforzato di affrontare il debito tecnico futuro, ma anche di codificare le tue esigenze in modo tale che possano essere verificate semplicemente eseguendo il tuo codice. Il primo test ti dà anche l'opportunità di convalidare la tua comprensione del dominio del problema prima di impegnarti a risolvere il problema nel codice e convalida i tuoi sforzi di implementazione.
Si tratta davvero di cercare di massimizzare il valore commerciale del tuo codice. Il codice ampiamente non testato e difficile da mantenere è generalmente economico e veloce da creare e molto costoso da mantenere per tutta la durata del prodotto dopo il rilascio. Il codice che è stato testato a fondo a livello di unità è generalmente più costoso da creare, ma costa relativamente poco da mantenere per tutta la durata del prodotto dopo il rilascio.
Also, is there anything that makes TDD especially good for SCRUM?
Il TDD non è specifico per una particolare metodologia. È semplicemente uno strumento. Una pratica che puoi integrare nei tuoi processi di sviluppo per aiutarti a raggiungere i tuoi risultati specifici. Quindi, per rispondere alla tua domanda, TDD è complementare al tuo metodo, che sia SCRUM o qualsiasi altro approccio.