2009-09-02 14 views
40

Ho letto un sacco di post che mi hanno convinto che avrei dovuto iniziare a scrivere unit test, ho anche iniziato a usare dependency injection (Unity) per il più semplice beffeggiamento, ma non sono ancora abbastanza sicuro su quale fase dovrei iniziare a scrivere l'unità verifica e fa il motto, e come o dove iniziare.Come avviare il test dell'unità o TDD?

Il modo preferito è scrivere i test di unità prima dei metodi come descritto nella metodologia TDD?

Esiste una metodologia o una modalità diversa per il test dell'unità?

+2

Prova a leggere questo articolo: http://blog.codeville.net/2009/08/24/writing-great-unit-tests-best-and-worst-practises/ – Kane

+1

Se sei in C#, spendi i soldi e ottieni una copia di Resharper. Cambia l'intera esperienza. –

risposta

31

prova prima/test dopo:

Si deve rilevare che 'test prima' come parte del TDD è altrettanto (se non di più) a che fare con il design in quanto è a che fare con unit testing . È una tecnica di sviluppo del software a sé stante: la scrittura dei risultati dei test è un costante perfezionamento del design.

In una nota a parte: se c'è un vantaggio significativo per TDD da una pura prospettiva di testing unitario, è che è molto più difficile (anche se non impossibile) scrivere un test che è sbagliato quando si fa TDD. Se si scrive il test in anticipo, è necessario che sia sempre in errore perché la logica richiesta per eseguire il test di prova non esiste ancora.Se in seguito si scrive il test, la logica dovrebbe essere, ma se il test è sottoposto a un bug o sta testando la cosa sbagliata, potrebbe passare a prescindere.

I.e. se scrivi prima un test negativo, potresti ricevere una luce verde quando ti aspetti un rosso (quindi sai che il test è sbagliato). Se in seguito scrivi un test negativo, riceverai una luce verde quando ti aspetteresti un green (inconsapevole del test negativo).

Libri

Il libro unit testing pragmatica è la pena dare un'occhiata, come è Roy Osherove di "The Art of Unit Testing". Il libro pragmatico si focalizza più strettamente sui diversi tipi di input di test che è possibile provare a trovare bug, mentre TAOUT copre una più ampia gamma di argomenti come test double, strategie, manutenibilità, ecc. O prenotare è buono; dipende da ciò che vuoi da esso.

Inoltre, ecco uno link to a talk Roy Osherove did on unit testing. Vale la pena fare un orologio (così come alcuni dei video di revisione dei test che ha registrato, in quanto sottolinea vari problemi e cose da fare e cose da fare insieme ai motivi per cui).

come avviare

Non c'è niente di meglio che la scrittura di codice. Trova una classe abbastanza semplice che non faccia riferimento a molto altro. Quindi, inizia a scrivere alcuni test.

Chiediti sempre "cosa voglio provare e provare con questo test?" prima di scriverlo, quindi dargli un nome decente (di solito coinvolgendo il metodo chiamato, lo scenario e il risultato atteso, ad esempio in una pila: "Pop WhenStackIsEmpty ThrowsException").

Pensa a tutti gli input che puoi lanciare, combinazioni diverse di metodi che possono dare risultati interessanti e così via.

+3

Stavo cercando di leggere " l'arte del collaudo delle unità ", ma a un certo punto mi sono reso conto che sto leggendo su come scrivere un codice per i test unitari. Ma non su come capire, quali dovrebbero essere i test, come capire cosa testare e come testare (dal punto di vista del "design", non del codice). L'impressione generale della lettura è stata quando ho iniziato a leggere un libro dalla metà, come: "saltiamo dentro, ecco i mocciosi". Non una sola parola, come faccio a scegliere cosa testare. Ne ero così sopraffatto da mettere da parte il libro per la frustrazione. Ora sento di aver bisogno di imparare TDD, ma so che non aprirò più "TAOUT" –

5

Steve Sanderson ha una buona conoscenza delle best practice TDD.

http://feeds.codeville.net/~r/SteveCodeville/~3/DWmOM3O0M2s/

Inoltre, c'è una grande serie di tutorial per fare un progetto MVC ASP.net che discute un sacco principi TDD (se non vi occupate di apprendimento ASP.net MVC lungo la strada) http://www.asp.net/learn/mvc-videos/ sguardo per la serie "Storefront" in fondo alla pagina.

MOQ sembra essere il quadro di scherno caldo ultimamente, si consiglia di guardare in quello pure

In sintesi, provare a scrivere un test per convalidare qualcosa you'r cercando di archivio, quindi implementare il codice per fallo funzionare.

Il modello è noto come Rosso - Verde - Refactor. Fai del tuo meglio per minimizzare le dipendenze in modo che i test possano concentrarsi su un componente.

Personalmente, io uso i test dell'unità di Visual Studio. Io non sono uno sviluppatore TDD hardcore, ma quello che mi piace fare è questo:

  1. Creare un nuovo progetto e definire alcune delle classi fondamentali in base alla progettazione del sistema (in questo modo posso almeno avere un po ' intellisense)
  2. creare un progetto di unit test e iniziare a scrivere unit test per soddisfare la funzionalità che sto cercando di implementare.
  3. farli fallire
  4. farli passare (implementare)
  5. Refactor
  6. Ripetere, cercare di rendere il test più rigorosi o creare più test fino a quando sento la sua solida.

Mi sento anche molto utile aggiungere funzionalità su un code code esistente. Se vuoi aggiungere qualche nuova funzionalità, prima crea il test unitario per ciò che desideri aggiungere, passa attraverso il codice per vedere cosa devi cambiare, quindi passa attraverso il processo TDD.

+0

Grazie a @TJB, sono abbastanza familiare con ASP.NET MVC, ho scaricato il progetto Oxite che sembra essere un po 'complicato e utilizza la dipendenza da iniezione e il test delle unità. È un buon esempio per l'apprendimento? –

+0

Non ho controllato il sorgente Oxite, ma è solo che MVC si presta a TDD e che la serie di video "storefront" coinvolge uno sviluppatore che cammina attraverso un progetto completo con una prospettiva TDD. Rob Conery afferma che sta imparando praticamente come applicare veramente TDD, quindi si appoggia alle migliori pratiche, a ciò che è pratico e quando è possibile scendere a compromessi. Per me, io uso solo i progetti di test di Visual Studio come piattaforma. Raccomando l'articolo sanderson, succinto e ottimi punti. – TJB

+0

Divertente dovresti menzionare Rob. Oxite era/è considerato un completo fallimento per quanto riguarda le app di esempio. Rob è stato portato sul progetto per cercare di migliorare le cose. Non credo che abbia portato a termine il suo compito, ma ha letto i suoi pensieri per conto tuo. http://blog.wekeroad.com/blog/some-thoughts-on-oxite/ –

14

Se sei curioso di testare l'unità, il modo migliore per impararlo è provarlo. Probabilmente inizierai a scrivere test di integrazione all'inizio, ma va bene. Quando sembrano troppo difficili da mantenere o troppo lavoro da scrivere, leggi di più su che tipo di test ci sono (unità, funzionalità, integrazione) e cerca di imparare la differenza.

Se sei interessato a iniziare con TDD, lo zio Bob è una buona fonte. Partlyulary this.

Altro su Unità di prova

assicurarsi di ottenere i risultati dei test coerenti.Eseguire ripetutamente lo stesso test dovrebbe restituire gli stessi risultati in modo coerente.

I test non dovrebbero richiedere la configurazione.

L'ordine di test non dovrebbe avere importanza. Ciò significa che esecuzioni di test parziali possono funzionare correttamente. Inoltre, se si tiene a mente questa filosofia di progettazione, sarà probabilmente utile nella creazione del test.

Ricordare che qualsiasi test è migliore di nessun test. La difficoltà si può trovare nella stesura di buoni test unitari puliti che promuovono la facilità di creazione e manutenzione. Più difficile sarà il quadro di test, maggiore sarà l'opposizione ad impiegarlo. Il test è tuo amico.

1

Leggi Pragmatic Unit Testing in C# with NUnit. Ha informazioni complete su come iniziare a scrivere test e strutturare il codice per renderlo più facile da testare.

+1

Ho comprato quel libro e l'ho letto un certo numero di volte, e tutto sembra in teoria, ma quando si tratta di Effettivamente: tutti gli esempi e i suggerimenti sono troppo banali quando si tenta di applicarli a una base di codice reale. È un ottimo libro per capire cos'è l'Unit Testing e tutte le genitalità, ma non è affatto completo. –

+0

Gli esempi sono forse "banali" rispetto al codice "reale", ma aiutano il libro a mantenere l'attenzione. È stata la prima cosa che ho letto quando ero nuovo ai test di unità, ma mi ha dato abbastanza munizioni per trovare un carico di errori nel mio codice. –

+2

Non ho letto il libro, quindi non so/quanto/banale possa essere l'esempio in esso, ma la chiave del buon design di solito è trasformare il codice 'reale' in codice banale. Ciò potrebbe richiedere la divisione delle lezioni in unità molto più piccole di quelle a cui sei abituato. Un buon codice testabile spesso ti fa pensare "può davvero farlo?" Un bambino potrebbe capire questo codice! " perché ogni unità in sé copre solo uno scopo molto limitato ed è implementata con i mezzi più semplici possibili. – Cygon

7

Sì, il preferito modo di fare TDD è quello di scrivere il primo test (come implica il nome Test-Driven Development). Quando inizi con TDD può essere difficile sapere da dove iniziare a scrivere i test, quindi suggerirei di essere pragmatico al riguardo. Dopotutto, la parte più importante del nostro lavoro consiste nel fornire codice funzionante, non tanto sul modo in cui il codice è stato realizzato.

Quindi è possibile iniziare scrivendo i test per il codice esistente. Una volta capito come sono strutturati i test unitari, quali sembrano fare un buon lavoro e quelli che non sembrano così divini, allora sarà più facile immergersi maggiormente nell'approccio test-first. Ho scoperto che scrivo prima i test in misura maggiore con il passare del tempo. Diventa semplicemente più naturale con maggiore esperienza.

+13

In realtà mi raccomando di non iniziare a scrivere test per codice esistente prima se si vuole imparare TDD. Scrivere test per il codice esistente (che non hanno test) è spesso molto più difficile (dato che non è stato scritto con testabilità in mente) che scrivere test per codice completamente nuovo. Una volta che hai padroneggiato TDD per il nuovo codice, sei pronto per affrontare il vecchio codice senza test. – Cellfish

+2

@Cellfish: Sono d'accordo sul fatto che può essere più difficile scrivere buoni test per il codice esistente, ma potrebbe darti un chiaro punto di partenza, e acquisirai molte informazioni su come strutturare il tuo codice futuro e le unit test. È come quando le persone (prima dell'era digitale) hanno suggerito quale fotocamera ottenere per un fotografo principiante: alcuni consiglierebbero di "ottenere uno completamente meccanico e imparare tutto sui valori di tempo di posa e apertura, quindi si avrà il pieno controllo", mentre altri hanno detto "ottenere uno completamente automatico e concentrarsi sulle immagini". Entrambi i consigli hanno funzionato, ma per persone diverse. –

+0

Sto imparando TDD e per questo lo sto provando con uno in esecuzione. Refactoring del codice per supportare Unit testing e scriverli mentre procedo. Per le nuove funzionalità dei progetti sto creando test prima di scrivere la logica. – Tanmoy

1

Se non hai ancora scritto test di unità, scegli solo alcune classi e inizia a scrivere i test di unità, e continua a lavorare sullo sviluppo di più test di unità.

Man mano che si acquisisce esperienza, è possibile iniziare a prendere in giro il database, ad esempio, utilizzando il framework Unity, ma, vorrei suggerire di iniziare semplicemente e acquisire esperienza prima di fare questo salto.

Una volta che hai dimestichezza con come scrivere i test delle unità, puoi provare a fare TDD.

9

In C# e Visual Studio Trovo seguente procedura molto utile:

  1. Pensate! Fai un piccolo progetto in anticipo. È necessario avere un'immagine chiara di quali classi sono necessarie e di come gli oggetti devono essere in relazione tra loro. Concentrati solo su una classe/oggetto (la classe/oggetto che vuoi implementare) e una relazione. Altrimenti si finisce con un design troppo pesante. Spesso finisco con schizzi multipli (solo poche scatole e frecce) su un foglio di carta di ricambio.

  2. Creare la classe nel codice di produzione e denominarla in modo appropriato.

  3. Scegliere un comportamento della classe che si desidera implementare e creare un metodo di stub per esso. Con lo studio visivo creare matrici di metodi vuoti è un gioco da ragazzi.

  4. Scrivere un test per questo. Pertanto è necessario inizializzare quell'oggetto, chiamare il metodo e formulare un'asserzione per verificare il risultato. Nel caso più semplice l'asserzione richiede un altro metodo stub o una proprietà nel codice di produzione.

  5. Compilare e lasciare che il test runner mostri la barra rossa!

  6. Codificare il comportamento richiesto nel codice di produzione per visualizzare la barra verde.

  7. Passare al comportamento successivo.

Per questa procedura due cose sono molto importanti:

  • Hai bisogno di un quadro chiaro cosa si vuole e come la classe/oggetto dovrebbe essere simile. Almeno passa un po 'di tempo.
  • Pensa ai comportamenti della classe/oggetto. Ciò renderà i test e il codice di produzione incentrati sul comportamento, che è un approccio molto naturale per pensare a classi/oggetti.

Test prima o non testare prima?

Trovo solitamente più difficile il retrofitting dei test sul codice di produzione esistente. Nella maggior parte dei casi ciò è dovuto a dipendenze intrecciate ad altri oggetti, quando l'oggetto sottoposto a test deve essere inizializzato. TDD di solito lo evita, perché vuoi inizializzare l'oggetto nei casi di test con meno sforzo possibile. Ciò si tradurrà in un accoppiamento molto lento.

Quando si eseguono i test di retrofit, il lavoro necessario deve essere inizializzato con l'oggetto in prova. Anche le asserzioni possono essere un sacco di lavoro a causa di dipendenze intricate. Per questo è necessario modificare il codice di produzione e interrompere le dipendenze. Utilizzando correttamente l'iniezione di dipendenza questo non dovrebbe essere un problema.

+0

Superbo ... molto utile ... Grazie. – Snesh

+0

Questa risposta può essere resa universale per tutte le lingue con il minimo sforzo - basta fare piccoli commenti su Visual Studio/C# nei luoghi dove applicabile – kiedysktos

0

Preferisco l'approccio di KentBeck che è ben spiegato nel libro, Test Driven Development by Example - Kent Beck.

dalla tua domanda posso dedurre che non sei sicuro del funzionamento del telaio di prova - la scelta del corretto funzionamento del telaio di prova è molto importante per TDD o per i test di unità di scrittura (in generale).

Unico problema pratico con TDD è "Refactoring" (anche noi abbiamo bisogno di rifattorizzare il codice di test) richiede molto tempo.

5

Scegliere una piccola applicazione non critica e implementarla utilizzando TDD. All'inizio il nuovo modo di pensare si sentirà strano, ma forse dopo una settimana o due di pratica si riempirà di naturalezza.

Here is a tutorial application (nel ramo "tutorial") che mostra quali tipi di test scrivere. In questo tutorial si scrive codice per passare i casi di test predefiniti, in modo da entrare nel ritmo, e successivamente si scrivono i propri test. Il file README contiene istruzioni. È scritto in Java, ma puoi facilmente adattarlo a C#.

+0

Grazie per il progetto tdd-tetris-tutorial, molto ben fatto :) –

3

Ho lavorato per aziende che fanno test su unità/integrazione troppo avanti e quelli che fanno troppo poco, quindi mi piace pensare di avere un buon equilibrio tra i due.

Consiglierei TDD - Test Driven Development. Questo ti assicura una buona copertura ma continua anche a focalizzare la tua attenzione sul posto giusto e sui problemi.

Quindi la prima cosa che fai per ogni nuovo sviluppo è scrivere un test unitario, anche se non hai una singola classe da testare.

Pensa a cosa stai testando. Ora esegui il test. Perché non dovrebbe compilare? Perché hai bisogno di classA. Crea la classe ed esegui il test. Perché non lo compila? Perché non ha metodoA. Scrivi il metodo uno ed esegui di nuovo il test dell'unità. Perché il test fallisce? Perché methodA non è implementato. Implementare il metodoA ed eseguire il test. Perché fallisce? Perché methodA non restituisce il valore atteso corretto ... ecc.

Continui come questa unità di test durante lo sviluppo e alla fine il test passerà e il pezzo di funzionalità sarà completo.

4

Vorrei assumere TDD, sviluppo test-first, prima delle mock e iniezione dipendenza. Per essere sicuro, i mock possono aiutarti a isolare meglio le tue unità - e quindi a fare meglio i test unità - ma a mio avviso, il mocking e il DI sono concetti più avanzati che possono interferire con la chiarezza della semplice scrittura dei test.

Mock e DI hanno il loro posto; sono buoni strumenti da avere nella tua cassetta degli attrezzi.Ma prendono un po 'di sofisticazione, una comprensione più avanzata, rispetto al tipico neofita testante. Scrivere i test prima, tuttavia, è esattamente così semplice come sembra. Quindi è più facile da assumere, ed è potente da solo (senza mock e DI). Otterrai vincite precedenti e più facili scrivendo prima test privi di mock, piuttosto che cercando di iniziare con i mock, e TDD, e DI tutti in una volta.

Inizia con test-first; quando sei molto a suo agio con esso, e quando il tuo codice ti sta dicendo che hai bisogno di mock, poi prendere in giro.

0

Penso che il libro di Dave Astels sia ancora una delle migliori introduzioni. È per Java, ma dovresti essere in grado di tradurre.

2

Estendere la risposta di Steve Freeman: il libro di Dave Astel si chiama "Test-driven Development - A practical guide". Se il tipo di applicazione che stai scrivendo è un'applicazione GUI, questo dovrebbe essere utile. Ho letto il libro di Kent Becks ma non sono riuscito a capire come avviare un progetto con TDD. Il test del libro di Astel-guida un'applicazione GUI completa e non banale dall'inizio alla fine usando storie. Mi ha aiutato molto ad iniziare in modo acuto con TDD, mi ha mostrato dove e come iniziare.

2

Test Driven Development può essere fonte di confusione per i principianti, un sacco di libri che ho letto quando stavo imparando TDD avrebbe insegnato come scrivere unit test per una classe Calcolatrice, ma sembra che ci sia molto meno aiuto per la creazione di applicazioni del mondo reale , che sono più incentrati sui dati se oserei dire. Per me l'innovazione è stata quando ho capito cos'è lo sviluppo comportamentale o BDD e come iniziare a fare test da fuori. Ora posso semplicemente consigliarti di concentrarti sul comportamento dell'applicazione e scrivere test unitari per verificarlo. C'è un sacco di dibattito tra TDD e BDD, ma penso che test automatici ben scritti a tutti i livelli aggiungano valore e per scriverli dobbiamo concentrarci sul comportamento.

Hadi Hariri ha un eccellente post qui http://hadihariri.com/2012/04/11/what-bdd-has-taught-me/

Ho anche scritto alcuni articoli sul tema che mi sento aiuterà a comprendere tutti i concetti legati alla TDD qui

http://codecooked.com/introduction-to-unit-testing-and-test-driven-development/

http://codecooked.com/different-types-of-tests-and-which-ones-to-use/