Recentemente, tive muitas ocasiões em que precisei manter procedimentos e funções armazenados complexos. Eles já estavam quebrados, geralmente de maneiras bastante sutis - havia muito poucas ocasiões em que você chamava o SP com parâmetros válidos e simplesmente não funcionava.
Minha solução foi desenvolver uma estrutura que execute os procedimentos armazenados dentro de uma transação, depois de inicializar o banco de dados para as condições iniciais necessárias, testando o resultado esperado, também dentro da mesma transação. A transação foi revertida no final do teste.
Isso funcionou muito bem. Mas alguns chamariam isso de "teste de integração", pois envolve a integração com o banco de dados. Eu chamo isso de teste de unidade, desde que testei componentes individuais e casos de teste individuais para esses componentes e desde que controlei completamente o estado inicial do banco de dados.
Mas onde deve ser traçada a linha? Isso é teste de integração ou teste de unidade? Existe uma razão prática para esse tipo de teste ser uma má idéia? Se este for "apenas" teste de integração, alguém tem sugestões sobre como fazer "testes de unidade" reais nesses procedimentos armazenados?
Atualização, três anos e meio depois. No meu projeto atual, comecei a usar testes de unidade SSDT, com sucesso, embora pudessem ser melhores. Consulte Verificando o código do banco de dados usando testes de unidade do SQL Server . Normalmente, eles implantam o projeto de banco de dados em sua instância do SQL Server LocalDB, portanto, isso remove qualquer dúvida sobre o ambiente de banco de dados que afeta o teste. Eu preencho o banco de dados com os dados necessários durante o pré-teste, o que remove perguntas sobre o conteúdo do banco de dados. Na verdade, eu uso as instruções MERGE para fazer isso, garantindo que todos os dados que não sejam necessários para o teste atual sejam removidos, inseridos ou atualizados no banco de dados antes do teste. Eles têm problemas:
- Eles não são rápidos
- Não é possível reutilizar as condições de teste
- Não é possível reutilizar pré-testes (a menos que você os torne comuns a todos os testes em um projeto)
- A interface do usuário pode ser melhorada
Uma das razões para os problemas acima é que eu ainda não reclamei deles. Eu recomendo que qualquer pessoa interessada tente esse recurso e depois reclame. É assim que as melhorias são feitas.