Definitivamente, uma boa lista. Aqui estão algumas idéias sobre isso:
Escreva o teste primeiro, depois o código.
Eu concordo, em alto nível. Mas, eu seria mais específico: "Escreva um teste primeiro, depois escreva apenas o código suficiente para passar no teste e repita." Do contrário, temeria que meus testes de unidade se parecessem mais com testes de integração ou aceitação.
Classes de design usando injeção de dependência.
Acordado. Quando um objeto cria suas próprias dependências, você não tem controle sobre elas. Inversão de controle / injeção de dependência dá a você esse controle, permitindo que você isole o objeto em teste com mocks / stubs / etc. É assim que você testa objetos isoladamente.
Separe o código da IU de seu comportamento usando Model-View-Controller ou Model-View-Presenter.
Acordado. Observe que até mesmo o apresentador / controlador pode ser testado usando DI / IoC, entregando-lhe uma visualização e um modelo fragmentado / simulado. Confira Presenter First TDD para mais informações.
Não escreva métodos ou classes estáticos.
Não tenho certeza se concordo com este. É possível testar a unidade de um método / classe estática sem usar simulações. Então, talvez esta seja uma daquelas regras específicas do Rhino Mock que você mencionou.
Programe interfaces, não classes.
Eu concordo, mas por um motivo um pouco diferente. As interfaces fornecem uma grande flexibilidade para o desenvolvedor de software - além de apenas suporte para vários frameworks de objetos fictícios. Por exemplo, não é possível oferecer suporte a DI corretamente sem interfaces.
Isole dependências externas.
Acordado. Oculte dependências externas por trás de sua própria fachada ou adaptador (conforme apropriado) com uma interface. Isso permitirá que você isole seu software da dependência externa, seja um serviço da web, uma fila, um banco de dados ou qualquer outra coisa. Isso é especialmente importante quando sua equipe não controla a dependência (também conhecida como externa).
Marque como virtuais os métodos que você pretende simular.
Essa é uma limitação do Rhino Mocks. Em um ambiente que prefere stubs codificados à mão em vez de uma estrutura de objeto simulado, isso não seria necessário.
E, alguns novos pontos a serem considerados:
Use padrões de design criativos. Isso ajudará na DI, mas também permite que você isole esse código e teste-o independentemente de outra lógica.
Escreva testes usando a técnica Arrange / Act / Assert de Bill Wake . Essa técnica deixa bem claro qual configuração é necessária, o que está realmente sendo testado e o que é esperado.
Não tenha medo de fazer suas próprias simulações / tocos. Freqüentemente, você descobrirá que o uso de estruturas de objetos simulados torna seus testes incrivelmente difíceis de ler. Ao lançar o seu próprio, você terá controle total sobre seus mocks / stubs e poderá manter seus testes legíveis. (Consulte o ponto anterior.)
Evite a tentação de refatorar a duplicação de seus testes de unidade em classes de base abstratas ou métodos de configuração / desmontagem. Isso oculta o código de configuração / limpeza do desenvolvedor que está tentando interpretar o teste de unidade. Nesse caso, a clareza de cada teste individual é mais importante do que refatorar a duplicação.
Implementar integração contínua. Faça check-in do seu código em cada "barra verde". Construa seu software e execute seu conjunto completo de testes de unidade em cada check-in. (Claro, esta não é uma prática de codificação, por si só; mas é uma ferramenta incrível para manter seu software limpo e totalmente integrado.)