thetalkingwalnut chiede:
Quali sono alcuni buoni modi per convincere gli sviluppatori scettici nel team del valore di Unit Testing?
Tutti qui accumuleranno all'improvviso molte ragioni per cui i test unitari sono buoni. Tuttavia, trovo che spesso il modo migliore per convincere qualcuno di qualcosa sia ascoltare la sua argomentazione e affrontarla punto per punto. Se li ascolti e li aiuti a verbalizzare le loro preoccupazioni, puoi indirizzarli tutti e forse convertirli nel tuo punto di vista (o almeno, lasciarli senza una gamba su cui stare in piedi). Chissà? Forse ti convinceranno perché i test unitari non sono adatti alla tua situazione. Non probabile, ma possibile. Forse se pubblichi i loro argomenti contro unit test, possiamo aiutare a identificare i controargomenti.
È importante ascoltare e comprendere entrambe le parti dell'argomento. Se provi ad adottare i test unitari troppo zelantemente senza riguardo alle preoccupazioni della gente, finirai con una guerra religiosa (e probabilmente test unitari davvero senza valore). Se lo adotti lentamente e inizi applicandolo dove vedrai il massimo beneficio al minor costo, potresti essere in grado di dimostrare il valore dei test unitari e avere maggiori possibilità di convincere le persone. Mi rendo conto che non è così facile come sembra - di solito richiede un po 'di tempo e metriche accurate per elaborare un argomento convincente.
I test unitari sono uno strumento, come qualsiasi altro, e dovrebbero essere applicati in modo tale che i benefici (la cattura di bug) siano superiori ai costi (lo sforzo di scriverli). Non usarli se / dove non hanno senso e ricorda che fanno solo parte del tuo arsenale di strumenti (ad es. Ispezioni, asserzioni, analizzatori di codice, metodi formali, ecc.). Quello che dico ai miei sviluppatori è questo:
Possono saltare la scrittura di un test per un metodo se hanno una buona argomentazione sul perché non è necessario (ad es. Troppo semplice per valerne la pena o troppo difficile per valerne la pena) e su come verrà altrimenti verificato il metodo (ad es. Ispezione, asserzioni , metodi formali, test interattivi / di integrazione). Devono considerare che alcune verifiche come ispezioni e prove formali vengono eseguite in un determinato momento e quindi devono essere ripetute ogni volta che cambia il codice di produzione, mentre i test unitari e le asserzioni possono essere usati come test di regressione (scritti una volta ed eseguiti ripetutamente in seguito ). A volte sono d'accordo con loro, ma più spesso discuterò se un metodo sia davvero troppo semplice o troppo difficile da testare.
Se uno sviluppatore sostiene che un metodo sembra troppo semplice per fallire, non vale la pena impiegare i 60 secondi necessari per scrivere un semplice test unitario a 5 righe? Queste 5 righe di codice verranno eseguite ogni notte (esegui build notturne, giusto?) Per il prossimo anno o più e ne varrà la pena se anche solo una volta capita di riscontrare un problema che potrebbe richiedere 15 minuti o più per identificare e debug. Inoltre, scrivere i semplici test unitari aumenta il conteggio dei test unitari, il che rende lo sviluppatore attraente.
D'altra parte, se uno sviluppatore sostiene che un metodo sembra troppo difficile da testare l'unità (non vale la pena di uno sforzo significativo richiesto), forse è una buona indicazione che il metodo deve essere suddiviso o refactored per testare le parti facili. Di solito, si tratta di metodi che si basano su risorse insolite come i singleton, l'ora corrente o risorse esterne come un set di risultati del database. Questi metodi di solito devono essere rifattorizzati in un metodo che ottiene la risorsa (ad es. Chiama getTime ()) e un metodo che accetta la risorsa come argomento (ad es. Prende il timestamp come parametro). Li ho lasciati saltare il test del metodo che recupera la risorsa e invece scrivono un test unitario per il metodo che ora accetta la risorsa come argomento. Di solito, questo rende molto più semplice scrivere il test unitario e quindi vale la pena scriverlo.
Lo sviluppatore deve tracciare una "linea nella sabbia" su quanto dovrebbero essere completi i test unitari. Più avanti nello sviluppo, ogni volta che troviamo un bug, dovrebbero determinare se test unitari più completi avrebbero colto il problema. In tal caso e se tali bug emergono ripetutamente, devono spostare la "linea" verso la scrittura di unit test più completi in futuro (a partire dall'aggiunta o dall'espansione del test unitario per il bug corrente). Devono trovare il giusto equilibrio.
La sua importante per realizzare i test di unità non sono una pallottola d'argento e non v'è una cosa una come troppo unit testing. Nel mio posto di lavoro, ogni volta che impariamo le lezioni, sento inevitabilmente "dobbiamo scrivere più unit test". La direzione annuisce concorde perché è stata sbattuta nella testa che "unit test" == "buono".
Tuttavia, dobbiamo comprendere l'impatto di "più unit test". Uno sviluppatore può scrivere solo ~ N righe di codice a settimana e devi capire quale percentuale di quel codice dovrebbe essere il codice unit test rispetto al codice di produzione. Un ambiente di lavoro lassista potrebbe avere il 10% del codice come test unitari e il 90% del codice come codice di produzione, risultando in un prodotto con molte funzionalità (sebbene molto buggy) (pensate a MS Word). D'altra parte, un negozio rigoroso con il 90% di unit test e il 10% di codice di produzione avrà un prodotto solido con pochissime funzionalità (pensate "vi"). Potresti non sentire mai rapporti sull'arresto anomalo di quest'ultimo prodotto, ma ciò ha probabilmente a che fare con il prodotto che non vende molto bene quanto con la qualità del codice.
Peggio ancora, forse l'unica certezza nello sviluppo del software è che "il cambiamento è inevitabile". Supponiamo che il negozio rigoroso (90% unit test / 10% codice di produzione) crei un prodotto con esattamente 2 funzioni (presupponendo che il 5% del codice di produzione == 1 funzione). Se il cliente arriva e cambia 1 delle funzionalità, tale modifica elimina il 50% del codice (45% dei test unitari e 5% del codice di produzione). Il negozio lassista (10% unit test / 90% codice di produzione) ha un prodotto con 18 caratteristiche, nessuna delle quali funziona molto bene. I loro clienti rinnovano completamente i requisiti per 4 delle loro funzionalità. Anche se la modifica è 4 volte più grande, solo la metà della base di codice viene eliminata (~ 25% = ~ 4,4% unit test + 20% del codice di produzione).
Il mio punto è che devi comunicare che hai compreso quell'equilibrio tra test di unità troppo piccoli e troppi, essenzialmente che hai riflettuto su entrambi i lati del problema. Se riesci a convincere i tuoi colleghi e / o la tua gestione di ciò, ottieni credibilità e forse hai maggiori possibilità di conquistarli.