Ho introdotto test unitari su basi di codice che non lo avevano in precedenza. L'ultimo grande progetto in cui sono stato coinvolto è stato quello in cui il prodotto era già in produzione con zero unit test quando sono arrivato al team. Quando me ne sono andato - 2 anni dopo - abbiamo fatto oltre 4500 test che hanno prodotto circa il 33% di copertura del codice in una base di codice con 230.000 + LOC di produzione (applicazione Win-Form finanziaria in tempo reale). Ciò può sembrare basso, ma il risultato è stato un significativo miglioramento della qualità del codice e del tasso di difetto, oltre a un miglioramento del morale e della redditività.
Può essere fatto quando si ha una comprensione e un impegno accurati delle parti coinvolte.
Prima di tutto, è importante capire che il test unitario è un'abilità in sé. Puoi essere un programmatore molto produttivo secondo gli standard "convenzionali" e avere ancora difficoltà a scrivere unit test in un modo che si ridimensiona in un progetto più ampio.
Inoltre, e specificamente per la tua situazione, l'aggiunta di unit test a una base di codice esistente che non ha test è anche un'abilità specializzata in sé. A meno che tu o qualcuno del tuo team non abbia un'esperienza di successo nell'introduzione di unit test in una base di codice esistente, direi che leggere il libro di Feather è un requisito (non facoltativo o fortemente raccomandato).
Effettuare il passaggio al test unitario del codice è un investimento in persone e competenze tanto quanto nella qualità della base di codice. Capire questo è molto importante in termini di mentalità e gestione delle aspettative.
Ora, per i tuoi commenti e domande:
Tuttavia, sono preoccupato che finirò per perdere il quadro generale e finirò per perdere i test fondamentali che sarebbero stati inclusi se avessi usato TDD sin dall'inizio.
Risposta breve: Sì, ti mancheranno i test e sì, inizialmente potrebbero non assomigliare a quello che avrebbero in una situazione di campo verde.
La risposta più approfondita è questa: non importa. Inizi senza test. Inizia ad aggiungere test e refactor mentre procedi. Man mano che i livelli di abilità migliorano, inizia ad alzare l'asticella per tutto il codice appena scritto aggiunto al tuo progetto. Continua a migliorare ecc ...
Ora, leggendo tra le righe qui ho l'impressione che questo provenga dalla mentalità della "perfezione come scusa per non agire". Una mentalità migliore è concentrarsi sulla fiducia in se stessi. Quindi, poiché potresti non sapere ancora come farlo, capirai come andare e riempire gli spazi vuoti. Pertanto, non c'è motivo di preoccuparsi.
Ancora una volta, è un'abilità. Non è possibile passare da zero test alla perfezione TDD in un "processo" o in un approccio "passo dopo passo" in modo lineare. Sarà un processo. Le vostre aspettative devono essere di fare progressi e miglioramenti graduali e incrementali. Non esiste una pillola magica.
La buona notizia è che con il passare dei mesi (e persino degli anni), il tuo codice inizierà gradualmente a diventare un codice "corretto" ben ponderato e ben testato.
Come nota a margine. Scoprirai che l'ostacolo principale all'introduzione di unit test in una vecchia base di codice è la mancanza di coesione e dipendenze eccessive. Probabilmente scoprirai quindi che l'abilità più importante diventerà come rompere le dipendenze esistenti e disaccoppiare il codice, piuttosto che scrivere i test unitari effettivi stessi.
Esistono processi / passaggi che devono essere seguiti per garantire che una soluzione esistente sia adeguatamente testata dall'unità e non solo integrata?
A meno che non lo possieda già, imposta un server di build e una build di integrazione continua che viene eseguita su ogni check-in, inclusi tutti i test unitari con copertura del codice.
Allena la tua gente.
Inizia da qualche parte e inizia ad aggiungere test mentre fai progressi dal punto di vista del cliente (vedi sotto).
Utilizzare la copertura del codice come riferimento guida della quantità di codice di produzione in fase di test.
Il tempo di costruzione dovrebbe essere sempre VELOCE. Se il tuo tempo di costruzione è lento, le tue abilità di testing dell'unità sono in ritardo. Trova i test lenti e migliorali (disaccoppia il codice di produzione e prova in isolamento). Ben scritto, dovresti essere facilmente in grado di avere diverse migliaia di test unitari e comunque completare un build in meno di 10 minuti (~ 1-ms-test / è una linea guida buona ma molto approssimativa, alcune eccezioni possono essere applicate come il codice usando la riflessione ecc. ).
Ispeziona e adatta.
Come posso garantire che i test siano di buona qualità e che non siano solo un caso di test è meglio di nessun test.
Il tuo giudizio deve essere la tua fonte primaria di realtà. Non esiste una metrica in grado di sostituire l'abilità.
Se non si dispone di tale esperienza o giudizio, prendere in considerazione la possibilità di contrarre qualcuno che lo fa.
Due indicatori secondari approssimativi sono la copertura totale del codice e la velocità di costruzione.
Vale la pena lo sforzo per una soluzione esistente in produzione?
Sì. La maggior parte del denaro speso per un sistema o una soluzione personalizzati viene speso dopo essere stato messo in produzione. E investire in qualità, persone e competenze non dovrebbe mai essere fuori moda.
Meglio ignorare i test per questo progetto e aggiungerlo in una possibile riscrittura futura?
Dovresti prendere in considerazione non solo l'investimento in persone e competenze, ma soprattutto il costo totale di proprietà e la durata prevista del sistema.
La mia risposta personale sarebbe "sì, certo" nella maggior parte dei casi perché so che è molto meglio, ma riconosco che potrebbero esserci delle eccezioni.
Cosa sarà più vantaggioso; trascorrere qualche settimana aggiungendo test o qualche settimana aggiungendo funzionalità?
Né. Il tuo approccio dovrebbe essere quello di aggiungere test alla tua base di codice MENTRE stai facendo progressi in termini di funzionalità.
Ancora una volta, si tratta di un investimento in persone, competenze E qualità della base di codice e come tale richiederà tempo. I membri del team devono imparare come rompere le dipendenze, scrivere test unitari, imparare nuovi habbit, migliorare la disciplina e la consapevolezza della qualità, come progettare meglio il software, ecc. È importante capire che quando inizi ad aggiungere test i tuoi membri del team probabilmente non lo fanno possedere queste capacità al livello necessario per l'approccio per avere successo, quindi fermare i progressi per passare tutto il tempo ad aggiungere molti test semplicemente non funzionerà.
Inoltre, aggiungere test unitari a una base di codice esistente di qualsiasi dimensione di progetto considerevole è un'impresa GRANDE che richiede impegno e persistenza. Non puoi cambiare qualcosa di fondamentale, aspettarti molto apprendimento lungo la strada e chiedere al tuo sponsor di non aspettarsi alcun ROI arrestando il flusso di valore aziendale. Quello non volerà, e francamente non dovrebbe.
In terzo luogo, si desidera instillare validi valori di concentrazione aziendale nel proprio team. La qualità non viene mai a spese del cliente e non puoi andare veloce senza qualità. Inoltre, il cliente vive in un mondo che cambia e il tuo compito è semplificare l'adattamento. L'allineamento del cliente richiede sia la qualità che il flusso del valore aziendale.
Quello che stai facendo è pagare il debito tecnico. E lo stai facendo, pur servendo i tuoi clienti in continua evoluzione delle esigenze. Man mano che il debito viene ripagato, la situazione migliora ed è più facile servire meglio il cliente e offrire più valore. Ecc. Questo slancio positivo è ciò a cui dovresti puntare perché sottolinea i principi di un ritmo sostenibile e manterrà e migliorerà il morale - sia per il tuo team di sviluppo, il tuo cliente e le tue parti interessate.
spero che aiuti