Come spiegare il valore del test unitario

29

Voglio introdurre il concetto di unit test (e test in generale) ai miei collaboratori; al momento non ci sono test e le cose vengono testate eseguendo effettivamente le attività tramite l'interfaccia utente per vedere il risultato desiderato. Come puoi immaginare, il codice è strettamente correlato all'implementazione esatta, anche con conseguente codice che dovrebbe essere in una classe e riutilizzato attraverso il sistema che viene copiato e incollato tra i metodi.

A causa dei mutati requisiti, mi è stato chiesto di modificare un modulo che ho scritto in precedenza e che è abbastanza liberamente accoppiato (non tanto quanto vorrei, ma come meglio posso ottenere senza dover introdurre molti altri concetti) . Ho deciso di includere una suite di test unitari con il mio codice revisionato per "dimostrare" che funziona come previsto e dimostrare come funziona il test; Non sto seguendo il vero TDD poiché alcuni dei codici sono già stati scritti, ma spero di seguire alcuni concetti TDD per il nuovo codice che dovrò creare.

Ora, inevitabilmente sono sicuro che mi verrà chiesto perché mi ci vorrà più di un giorno o due per scrivere il codice, dal momento che alcune parti di ciò con cui interagirò sono già presenti nel sistema (anche se senza alcun test e strettamente accoppiato), e quando controllo il codice mi verrà chiesto cosa sia questo progetto "Test". Posso spiegare le basi del test, ma non posso spiegare i benefici effettivi in un modo che gli altri avrebbero capito (perché pensano che il test richieda di eseguire l'app da solo, poiché spesso l'effettiva UI è importante per determinare se la funzionalità "funziona" " o no). Non capiscono l'idea di un accoppiamento lento (chiaramente evidente dal fatto che nulla è accoppiato liberamente, non ci sono nemmeno interfacce al di fuori del codice che ho scritto), quindi provare a usarlo come beneficio mi farebbe guadagnare molto un "Huh?" tipo di look, e di nuovo non posso essere libero come mi piacerebbe senza dover rielaborare diversi moduli esistenti e probabilmente introdurre una sorta di contenitore IoC, che sarebbe visto come una perdita di tempo e non di "programmazione".

Qualcuno ha qualche suggerimento su come posso puntare a questo codice e dire "Dovremmo iniziare a creare test unitari" senza uscire come condiscendenti (es. "Scrivere prove ti costringe a scrivere un buon codice." che probabilmente sarebbe preso significare il codice tranne il mio è cattivo ) o senza far sembrare una perdita di tempo che non aggiunge alcun valore reale?

    
posta Wayne Molina 23.05.2011 - 14:30
fonte

6 risposte

18

I want to introduce the concept of unit tests (and testing in general) to my co-workers

Penso che potrebbe essere meglio partire dal lato pratico, non dal lato concettuale. Ovviamente, se durante la discussione casuale trovi che i tuoi colleghi e / o dirigenti sono interessati a conoscere i test unitari, tanto meglio, allora puoi recuperare su Google esperienze concrete / prove dal web, mettere insieme una breve formazione, ecc. Tuttavia, da quello che descrivi, sembra che i tuoi compagni di squadra non siano molto aperti a questa strana nuova idea.

In una situazione del genere, inizierei a scrivere i miei piccoli test unitari senza tentare di spiegare troppo a nessuno prima. Aggiungere un paio di loro ogni volta che cambio codice, senza cercare di coprire completamente tutto il codice (che richiederebbe una quantità eccessiva di tempo). Idealmente, se riesco a raggiungere un buon equilibrio, quando si accorgono che sto scrivendo dei test unitari, potrei avere già una sostanziale suite di test e alcuni risultati concreti da mostrare (come "con questo test case sono riuscito a catturare un bug introdotto dal cambiamento della scorsa settimana, che altrimenti sarebbe scivolato alla QA / produzione "). Ciò dimostrerà la validità dei test per qualsiasi sviluppatore serio.

Dopodiché, sono in una buona posizione per iniziare a spiegare i vantaggi a lungo termine dei test unitari, come

  • dimostra che il codice funziona - sempre, ovunque, istantaneamente e automaticamente, che a sua volta
  • dà fiducia al refactoring, con conseguente miglioramento del design e migliore manutenibilità,
  • e se qualcosa si rompe, i test unitari ti danno (quasi) un feedback istantaneo, a differenza della latenza di diversi giorni o settimane se il bug viene catturato da un dipartimento QA separato. Che di solito ti consente di correggere l'errore in secondi, invece di eseguire il debug per ore / giorni, in codice che è passato da tempo dalla tua memoria a breve termine.

Vedi anche questa discussione correlata: Test unitari automatizzati, integrazione test o test di accettazione .

E uno precedente di SO: Che cos'è il test delle unità?

    
risposta data 23.05.2011 - 14:49
fonte
12

Riduci fattore senza paura

Con un'angolazione leggermente diversa, TDD ti consente di "ri-fattore senza paura", e questo è un vantaggio chiave che puoi vendere alla tua squadra. Impedisce agli sviluppatori di dire a se stessi:

  • "Non voglio toccare questo codice perché ho paura di romperlo"
  • "Non voglio scrivere nuove funzionalità su questo codice perché non so come funziona"
  • "Segretamente, ho paura di quel codice"

Potrei aggiungere di più, ma questo è un campo ben definito come Uncle Bob su TDD e Martin Fowler su TDD .

Dipendenze

Oh, aggiungerò un'altra cosa. Mostrerà loro come TDD fortifica un buon design che ti consenta di gestire in modo pulito le dipendenze.

Bob: "Oh c% ^ p! I capi ci hanno obbligato tutti a utilizzare MS SQL Server 2008" Jane: "Va bene, il danno è minimizzato perché abbiamo la nostra origine dati e le nostre classi DAO, sono così felice che TDD ci abbia incoraggiato su questa strada."

    
risposta data 23.05.2011 - 14:43
fonte
4

Mentre lavoriamo sul codice sorgente che non ha test automatizzati, dobbiamo lavorare con molta cura e abbiamo bisogno di più recensioni per rimanere sicuri che quel tipo di modifiche che stiamo apportando non infrange nessuna delle funzionalità esistenti.

Quando abbiamo dei buoni casi di test automatizzati, le conseguenze saranno lo sviluppo più veloce, sicuro e senza paura (può essere la risoluzione dei bug, il miglioramento o il ri-factoring).

    
risposta data 23.05.2011 - 14:51
fonte
4

Fai i calcoli

  • t mt = il tempo necessario per testare manualmente tutto ciò che è possibile che possa influenzare
  • t wt = il tempo richiesto per scrivere i test
  • k = il numero di volte che probabilmente dovrai testare tutto prima di rilasciare il nuovo codice

    if (t wt < t mt )     o (t wt < (k * t mt ))) quindi è un gioco da ragazzi: scrivere i test accelererà lo sviluppo.

altrimenti guarda il rapporto (t wt / (k * t mt )). Se è un numero molto grande, aspetta un'altra opportunità; altrimenti giustificare con i benefici del test di regressione.

Nota: suggerisco a questo punto di solo testare le funzionalità, non le unità - molto più facile da giustificare e capire, e discutibilmente meno lavoro con un valore più alto di semplici test di unità durante il refactoring.

Nota 2: il tempo necessario per eseguire i test non ha importanza , perché sono automatizzati. Puoi fare qualcosa di produttivo mentre i test sono eseguiti, a meno che i test impieghino così tanto tempo da farti perdere la scadenza. Che è raro.

    
risposta data 23.05.2011 - 22:32
fonte
1

Un suggerimento se sei un negozio Microsoft: trova della documentazione su MSDN che consiglia di testare le unità o di fare lo spartito come best practice (sono sicuro che ci sono più istanze di questo ) e indicare se ci sono conflitti.

Può sembrare un modo grossolano di fare le cose, ma ho scoperto che usare il termine "best practice" ti porterà molto lontano, specialmente con la gestione.

    
risposta data 23.05.2011 - 14:49
fonte
1

Come sempre consiglio, se conosci una buona pratica, il modo migliore per introdurlo gentilmente nel tuo ambiente sarebbe ovviamente iniziare a farlo da solo e poi, lungo la strada, alcuni dei tuoi colleghi vedranno i vantaggi e prendilo.

La parola chiave qui è evoluzione, non rivoluzione.

    
risposta data 23.05.2011 - 15:15
fonte

Leggi altre domande sui tag