Definitivamente una buona lista. Ecco alcune riflessioni:
Scrivere prima il test, quindi il codice.
Sono d'accordo, ad alto livello.Ma, sarei più specifico: "Scrivi prima un test, quindi scrivi quel tanto che basta codice per superare il test e ripetere". Altrimenti temerei che i miei test unitari sembrassero più simili a test di integrazione o di accettazione.
Classi di progettazione che utilizzano l'iniezione dipendente.
Concordato. Quando un oggetto crea le sue dipendenze, non hai alcun controllo su di esse. Inversione di controllo/Iniezione delle dipendenze ti dà quel controllo, permettendoti di isolare l'oggetto da testare con mock/stub/etc. È così che si testano gli oggetti in isolamento.
Separare il codice dell'interfaccia utente dal suo comportamento utilizzando Model-View-Controller o Model-View-Presenter.
Concordato. Si noti che anche il presentatore/controller può essere testato usando DI/IoC, passandogli una vista e un modello stubbed/mocked. Dai un'occhiata a Presenter First TDD per ulteriori informazioni.
Non scrivere metodi o classi statici.
Non sono sicuro di essere d'accordo con questo. E 'possibile testare unitamente un metodo/una classe statica senza usare i mock. Quindi, forse questa è una di quelle regole specifiche di Rhino Mock che hai menzionato.
Interfaccia di programma, non classi.
Sono d'accordo, ma per un motivo leggermente diverso. Le interfacce offrono una grande flessibilità allo sviluppatore del software, oltre al semplice supporto per vari framework di oggetti mock. Ad esempio, non è possibile supportare correttamente DI senza interfacce.
Isolare dipendenze esterne.
Concordato. Nascondere le dipendenze esterne dietro la propria facciata o adattatore (a seconda dei casi) con un'interfaccia. Ciò ti consentirà di isolare il tuo software dalla dipendenza esterna, che si tratti di un servizio Web, una coda, un database o altro. Questo è specialmente importante quando il tuo team non controlla la dipendenza (a.k.a. external).
Contrassegnare come virtuale i metodi che si intende deridere.
Questa è una limitazione di Rhino Mock. In un ambiente che preferisce gli stub codificati a mano su una struttura di oggetti fittizi, ciò non sarebbe necessario.
E, un paio di nuovi punti da considerare:
Utilizzare i design pattern creazionale. Questo aiuterà con DI, ma consente anche di isolare quel codice e testarlo indipendentemente dalle altre logiche.
Scrivere i test utilizzando Bill Wake's Arrange/Act/Assert technique. Questa tecnica rende molto chiaro quale configurazione è necessaria, cosa viene effettivamente testato e cosa è previsto.
Non aver paura di rotolare i tuoi finti mogli. Spesso, si scopre che l'utilizzo di framework di oggetti mock rende i test incredibilmente difficili da leggere. Ruotando il tuo, avrai il controllo completo sui tuoi mock/stub e sarai in grado di mantenere i tuoi test leggibili. (Fare riferimento al punto precedente)
Evitare la tentazione di rifattorizzare la duplicazione dei propri test di unità in classi di base astratte o metodi di setup/teardown. In questo modo si nasconde il codice di configurazione/pulizia dallo sviluppatore che tenta di annullare il test dell'unità. In questo caso, la chiarezza di ogni singolo test è più importante della refactoring della duplicazione.
Implementazione integrazione continua. Verifica il codice su ogni "barra verde". Crea il tuo software ed esegui la tua suite completa di test unitari ad ogni check-in. (Certo, questa non è una pratica di codifica, di per sé, ma è uno strumento incredibile per mantenere il software pulito e completamente integrato.)
Questa è una lista utile. Attualmente stiamo usando NUnit e Rhino.Mocks, ed è bene precisare questi criteri per i membri del team che hanno meno familiarità con questo lato del test delle unità. –