Anche se sono tutto per i test unitari, a volte mi chiedo se questa forma di sviluppo del primo test sia davvero vantaggioso ...
Test piccoli e banali come questo possono essere il "canarino nella miniera di carbone" per la tua base di codice, avvisando del pericolo prima che sia troppo tardi. I test banali sono utili da tenere in giro perché ti aiutano a ottenere le giuste interazioni.
Ad esempio, pensa a un test banale messo in atto per sondare come utilizzare un'API con cui non hai familiarità. Se quel test ha qualche rilevanza per ciò che stai facendo nel codice che utilizza l'API "per davvero", è utile mantenere quel test in giro. Quando l'API rilascia una nuova versione ed è necessario eseguire l'aggiornamento. Ora hai le tue ipotesi su come ti aspetti che l'API si comporterà registrate in un formato eseguibile che puoi utilizzare per catturare le regressioni.
... [I] n un processo reale, hai 3-4 livelli sopra il tuo codice (richiesta commerciale, documento dei requisiti, documento dell'architettura), dove la regola di business definita effettiva (prezzo scontato è prezzo - sconto) potrebbe essere definita in modo errato. Se è così, il tuo unit test non significa nulla per te.
Se codifichi da anni senza scrivere test, potrebbe non essere immediatamente ovvio che ci sia un valore. Ma se sei dell'idea che il modo migliore per lavorare sia "rilascia presto, rilascia spesso" o "agile" in quanto desideri la capacità di implementare rapidamente / continuamente, allora il tuo test significa sicuramente qualcosa. L'unico modo per farlo è legittimare ogni modifica apportata al codice con un test. Non importa quanto piccolo sia il test, una volta che hai una suite di test verde, sei teoricamente OK da distribuire. Vedi anche "produzione continua" e "beta perpetua".
Non devi nemmeno essere "testato prima" per essere di questa mentalità, ma questo è generalmente il modo più efficiente per arrivarci. Quando esegui TDD, ti blocchi in un piccolo ciclo di Red Green Refactor da due a tre minuti. In nessun momento non sei in grado di fermarti e andartene e avere un pasticcio completo tra le mani che impiegherà un'ora per eseguire il debug e rimontare.
Inoltre, il tuo unit test è un altro punto di errore ...
Un test di successo è quello che dimostra un errore nel sistema. Un test fallito ti avviserà di un errore nella logica del test o nella logica del tuo sistema. L'obiettivo dei test è rompere il codice o dimostrare che uno scenario funziona.
Se stai scrivendo test dopo il codice, corri il rischio di scrivere un test che è "cattivo" perché per vedere che il tuo test funziona davvero, devi vederlo sia rotto che funzionante. Quando scrivi dei test dopo il codice, questo significa che devi "far scattare la trappola" e introdurre un bug nel codice per vedere il test fallire. La maggior parte degli sviluppatori non solo è a disagio per questo, ma sosterrebbe che è una perdita di tempo.
Cosa ci guadagniamo qui?
C'è sicuramente un vantaggio nel fare le cose in questo modo. Michael Feathers definisce "codice legacy" come "codice non testato". Quando si adotta questo approccio, si legittima ogni modifica apportata alla propria base di codice. È più rigoroso che non usare i test, ma quando si tratta di mantenere una grande base di codice, si ripaga da solo.
A proposito di piume, ci sono due ottime risorse che dovresti controllare in merito a questo:
Entrambi spiegano come trasformare questi tipi di pratiche e discipline in progetti che non sono "Greenfield". Forniscono tecniche per scrivere test su componenti strettamente accoppiati, dipendenze cablate e cose su cui non si ha necessariamente il controllo. Si tratta di trovare "giunzioni" e testarle intorno.
[I] Se il prezzo scontato è sbagliato, il team di test troverà comunque il problema, come ha fatto il test unitario a risparmiare lavoro?
Abitudini come queste sono come un investimento. I resi non sono immediati; si accumulano nel tempo. L'alternativa al non test è essenzialmente assumersi il debito di non essere in grado di catturare regressioni, introdurre codice senza timore di errori di integrazione o guidare le decisioni di progettazione. Il bello è che legittimi ogni cambiamento introdotto nella tua base di codice.
Cosa mi manca qui? Per favore, insegnami ad amare il TDD, poiché finora ho difficoltà ad accettarlo come utile. Lo voglio anch'io, perché voglio rimanere progressista, ma per me non ha senso.
La considero una responsabilità professionale. È un ideale verso cui tendere. Ma è molto difficile da seguire e noioso. Se ti interessa e ritieni di non dover produrre codice non testato, sarai in grado di trovare la forza di volontà per apprendere buone abitudini di test. Una cosa che faccio molto ora (come fanno gli altri) è timebox io stesso un'ora per scrivere codice senza alcun test, quindi avere la disciplina per buttarlo via. Può sembrare uno spreco, ma non lo è davvero. Non è che l'esercizio costa a un'azienda materiali fisici. Mi ha aiutato a capire il problema e come scrivere codice in modo tale che sia di qualità superiore e testabile.
Il mio consiglio alla fine sarebbe che se davvero non hai il desiderio di essere bravo, allora non farlo affatto. Test scadenti che non vengono mantenuti, non funzionano bene, ecc. Possono essere peggio che non avere alcun test. È difficile imparare da soli e probabilmente non lo amerai, ma sarà quasi impossibile da imparare se non hai il desiderio di farlo o non riesci a vedere abbastanza valore in esso per garantire l'investimento di tempo.
Un paio di persone continuano a dire che i test aiutano a far rispettare le specifiche. È stata la mia esperienza che anche le specifiche sono state sbagliate, il più delle volte ...
La tastiera di uno sviluppatore è dove la gomma incontra la strada. Se la specifica è sbagliata e non alzi la bandiera, è molto probabile che tu venga incolpato per questo. O almeno lo farà il tuo codice. La disciplina e il rigore coinvolti nei test sono difficili da rispettare. Non è affatto facile. Ci vuole pratica, molto apprendimento e molti errori. Ma alla fine ripaga. In un progetto frenetico e in rapida evoluzione, è l'unico modo per dormire la notte, non importa se ti rallenta.
Un'altra cosa a cui pensare qui è che le tecniche che sono fondamentalmente le stesse dei test hanno dimostrato di funzionare in passato: "clean room" e "design by contract" tendono entrambi a produrre gli stessi tipi di costrutti "meta" -code che i test lo fanno e li impongono in punti diversi. Nessuna di queste tecniche è una pallottola d'argento e il rigore ti costerà alla fine in termini di funzionalità che puoi fornire in termini di time to market. Ma non è di questo che si tratta. Si tratta di essere in grado di mantenere ciò che offri. E questo è molto importante per la maggior parte dei progetti.