2011-02-06 15 views
11

Sto imparando lo sviluppo basato sul comportamento con ASP.NET MVC e, sulla base di a post di Steve Sanderson, capisco che BDD può significare, almeno, i seguenti tipi di test: singole unità di codice & Interazioni dell'interfaccia utente. Qualcosa di simile è menzionato in this post. Ho bisogno di due diversi quadri di test se voglio test di unità e di integrazione?Come si eseguono test di unità e integrazione in uno stile BDD in ASP.NET MVC?

  • repository unit test, controllori, & servizi utilizzando un quadro contesto/specifica, come MSpec. I risultati dei test con questo saranno utili per il team di sviluppo.

  • Test di comportamenti completi (integrazione) utilizzando un framework data/when/then, come SpecFlow con Watin. I risultati di questo test saranno utili per il mio cliente.

I video che ho visto finora sull'utilizzo di BDD sono stati solo limitato a testare il comportamento di entità senza prove il comportamento dei repository, controller, ecc ... C'è un progetto di esempio dove posso vedere sia test automatizzati di unità e integrazione utilizzando un approccio BDD?

risposta

9

Personalmente utilizzo SpecFlow per la creazione di test specifici delle funzionalità (ad esempio "Utente crea un nuovo record della società") dove a volte (ma non sempre) utilizzo Watin. Per testare i miei espositori, o classi di servizio, userò test di unità/integrazione con NUnit. I test di integrazione sono per quando ho bisogno di parlare al database durante il test, l'unità è per quando eseguo semplicemente il codice nell'oggetto target sotto test senza interazioni esterne.

Direi che non è necessario utilizzare un framework BDD per i test non dell'interfaccia utente. Puoi farlo se vuoi, ma non c'è una regola ferrea su questo. Se hai intenzione di farlo, ti consiglio vivamente di creare più di un progetto per i tuoi test. Mantenerli divisi è una buona idea, piuttosto che mescolare tutto il test in un unico progetto. Si potrebbe assegnare loro un nome:

MyProject.Tests.Features < - Per BDD test SpecFlow.

MyProject.Tests.Integration < - Per test che accedono una risorsa esterna cioè database.

MyProject.Tests.Unit

Se non hai intenzione di usare due quadri BDD, è comunque possibile utilizzare MSTest/NUnit in modo BDD. Ad esempio, l'articolo del blog this descrive una convenzione di denominazione piacevole che è vicina a BDD, ma mirata ai test di unità MSTest/NUnit. Potresti usare questo per i tuoi test non SpecFlow quando testare cose come repository.

In sintesi, non è necessario utilizzare SpecFlow e MSpec nei test, ma se lo si fa, si consigliano progetti di test separati.

+0

Sono d'accordo. Sono i test outside-in/UI che vengono specificati come scenari e, pertanto, richiedono SpecFlow o qualcosa di simile. Non vedo perché i test unitari dovrebbero essere fatti in modo diverso dal solito. – Jonathan

2

io in genere sono d'accordo con quello che Jason ha scritto.

Si potrebbe desiderare di dividere le caratteristiche del tuo in due categorie, sistema/integrazione e test a livello di unità. Puoi descrivere entrambe le categorie con qualsiasi framework, ma tieni presente che gli approcci di solo codice (NUnit, MSpec, ecc.) Richiedono che un analista aziendale sia in grado di scrivere C#. SpecFlow/Gherkin può essere un approccio migliore se si desidera coinvolgere analisti e utenti nelle specifiche di scrittura.Poiché la sintassi e le regole (Given, When, Then) sono facili da comprendere e la scrittura delle specifiche dal punto di vista dell'utente è facile da annotare dopo un po 'di allenamento. Si tratta di colmare il divario di comunicazione e avere utenti che aiutano la tua squadra a formare il linguaggio onnipresente del tuo dominio.

Si consiglia di avere il supporto delle specifiche sia "fuori dentro" che "fuori dentro". È possibile iniziare con una specifica SpecFlow "esterna" scritta dall'utente/analista/proprietario del prodotto e passare da "non implementato" a "verde" scrivendo il codice effettivo. Il codice che supporta la funzionalità è sviluppato utilizzando TDD con un framework più tecnicamente orientato come MSpec (la parte "inside out").

Ecco un repository che utilizza MSpec per entrambi i test di unità e integrazione: https://github.com/agross/duplicatefinder.