Le risposte esistenti sono certamente buone, ma non ho visto nessuno affrontare questo equivoco fondamentale nella domanda:
in qualsiasi momento devono passare tutti i test unitari
No. Sicuramente, questo non sarà vero. Durante lo sviluppo di software, NCrunch è spesso marrone (errore di compilazione) o rosso (test non riuscito).
Dove NCrunch deve essere verde (tutti i test che superano) è quando sono pronto a inviare un commit al server di controllo del codice sorgente, perché a quel punto altri potrebbero dipendere dal mio codice.
Ciò alimenta anche l'argomento della creazione di nuovi test: i test dovrebbero far valere la logica e il comportamento del codice. Condizioni al contorno, condizioni di errore, ecc. Quando scrivo nuovi test, provo a identificare questi "punti critici" nel codice.
I test unitari documentano come mi aspetto che venga chiamato il mio codice: presupposti, risultati previsti, ecc.
Se un test si interrompe a seguito di una modifica, devo decidere se il codice o il test sono in errore.
Come nota a margine, i test unitari a volte vanno di pari passo con Test Driven Development. Uno dei principi di TDD è che i test rotti sono i tuoi punti di riferimento. Quando un test ha esito negativo, è necessario correggere il codice in modo che il test abbia esito positivo. Ecco un esempio concreto dall'inizio di questa settimana:
Background : ho scritto e ora supporto una libreria utilizzata dai nostri sviluppatori che viene utilizzata per convalidare le query Oracle. Avevamo test che affermavano che la query corrispondeva a un valore atteso, il che rendeva il caso importante (non è in Oracle) e approvava allegramente le query non valide purché corrispondessero completamente al valore previsto.
Invece, la mia libreria analizza la query utilizzando Antlr e una sintassi Oracle 12c, quindi avvolge varie asserzioni sull'albero della sintassi stesso. Cose come, è valido (non sono stati generati errori di analisi), tutti i suoi parametri sono soddisfatti dalla raccolta dei parametri, tutte le colonne previste lette dal lettore di dati sono presenti nella query, ecc. Tutti questi sono elementi che sono passati a produzione in vari momenti.
Uno dei miei colleghi ingegneri mi ha inviato una query lunedì che era fallita (o meglio, era riuscita quando avrebbe dovuto fallire) durante il fine settimana. La mia libreria ha detto che la sintassi andava bene, ma è esplosa quando il server ha tentato di eseguirla. E quando ha guardato la domanda, era ovvio il perché:
UPDATE my_table(
SET column_1 = 'MyValue'
WHERE id_column = 123;
Ho caricato il progetto e aggiunto un test unit che ha affermato che questa query non dovrebbe essere valida. Ovviamente, il test ha fallito.
Successivamente, ho eseguito il debug del test non riuscito, ho esaminato il codice in cui mi aspettavo che generasse l'eccezione e ho capito che Antlr stava generando un errore sulla finestra aperta, ma non nel modo previsto dal codice precedente. Ho modificato il codice, verificato che il test ora era verde (superando) e che nessun altro aveva interrotto il processo, impegnato e spinto.
Ciò ha richiesto forse 20 minuti e nel frattempo ho effettivamente migliorato notevolmente la libreria perché ora supportava un'intera gamma di errori che in precedenza aveva ignorato. Se non avessi test unitari per la biblioteca, la ricerca e la risoluzione del problema avrebbero potuto richiedere ore.