Sicuramente una buona lista. Ecco alcuni pensieri su di esso:
Scrivi prima il test, poi il codice.
Sono d'accordo, ad alto livello. Ma sarei più specifico: "Scrivi prima un test, quindi scrivi il codice appena sufficiente per superare il test e ripeti." Altrimenti, avrei paura che i miei test unitari sarebbero più simili a test di integrazione o di accettazione.
Progettare classi utilizzando l'inserimento delle dipendenze.
Concordato. Quando un oggetto crea le proprie dipendenze, non hai il controllo su di esse. Inversion of Control / Dependency Injection ti dà quel controllo, permettendoti di isolare l'oggetto sotto test con mock / stub / ecc. Ecco come testare 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 utilizzando DI / IoC, assegnandogli una vista e un modello stubbed / mocked. Dai un'occhiata a Presenter First TDD per saperne di più.
Non scrivere metodi o classi statici.
Non sono sicuro di essere d'accordo con questo. È possibile eseguire un test unitario di un metodo / classe statico senza utilizzare mock. Quindi, forse questa è una di quelle regole specifiche di Rhino Mock che hai menzionato.
Programma le interfacce, non le classi.
Sono d'accordo, ma per un motivo leggermente diverso. Le interfacce forniscono una grande flessibilità allo sviluppatore di software, oltre al semplice supporto per vari framework di oggetti fittizi. Ad esempio, non è possibile supportare correttamente DI senza interfacce.
Isola le dipendenze esterne.
Concordato. Nascondi le dipendenze esterne dietro la tua 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 qualcos'altro. Ciò è particolarmente importante quando il tuo team non controlla la dipendenza (ovvero esterna).
Contrassegna come virtuali i metodi che intendi deridere.
Questa è una limitazione di Rhino Mocks. In un ambiente che preferisce gli stub codificati a mano su un framework di oggetti fittizi, ciò non sarebbe necessario.
E un paio di nuovi punti da considerare:
Usa modelli di design creativi. Questo aiuterà con DI, ma ti permette anche di isolare quel codice e testarlo indipendentemente da altra logica.
Scrivi test utilizzando la tecnica Arrange / Act / Assert di Bill Wake . Questa tecnica rende molto chiaro quale configurazione è necessaria, cosa viene effettivamente testato e cosa ci si aspetta.
Non aver paura di lanciare i tuoi mock / stub. Spesso scoprirai che l'uso di framework di oggetti fittizi rende i tuoi test incredibilmente difficili da leggere. Rotolando il tuo, avrai il controllo completo sui tuoi mock / stub e sarai in grado di mantenere leggibili i tuoi test. (Fare riferimento al punto precedente.)
Evita la tentazione di rifattorizzare la duplicazione dei tuoi unit test in classi di base astratte o metodi di installazione / smontaggio. In questo modo si nasconde il codice di configurazione / pulizia allo sviluppatore che tenta di eseguire lo unit test. In questo caso, la chiarezza di ogni singolo test è più importante del refactoring della duplicazione.
Implementare l'integrazione continua. Effettua il check-in del codice su ogni "barra verde". Crea il tuo software ed esegui la tua suite completa di unit test a ogni check-in. (Certo, questa non è una pratica di codifica, di per sé; ma è uno strumento incredibile per mantenere il tuo software pulito e completamente integrato.)