Eu sou um DBA do SQL Server. Para automatizar algumas das minhas tarefas diárias, preciso escrever procedimentos armazenados. Criar funcionalidade sem testar não faz sentido para mim. Para criar e executar meus testes, usei o tSQLt Framework.
Eu tive que criar um banco de dados durante o teste. "CREATE DATABASE" não é permitido dentro de uma transação multi-instrução, mas todos os testes são executados automaticamente dentro de uma transação dentro do tSQLt Framework.
Naturalmente, posso configurar um banco de dados de teste manualmente antes de executar o teste, mas o teste não pode depender do ambiente em que será executado.
Como isso deve ser abordado?
A versão mais recente do tSQLt permite a execução de testes fora de uma transação . A documentação está um pouco carente (como em: ainda não foi escrita), mas basicamente você só precisa adicionar uma
@tSQLt:NoTransaction
anotação ao teste.Aqui está um exemplo dos testes para o próprio tSQLt:
--@tSQLt:NoTransaction('MyInnerTests.TestCleanUp')
O parâmetro único é um procedimento que será executado após o teste, mesmo que o próprio teste tenha errado ou tenha falhado. Você deve usá-lo para limpar depois de si mesmo. Tenha em mente que não há transação protegendo você, então você precisa desfazer cuidadosamente tudo o que você alterar no banco de dados / no servidor. tSQLt irá limpar o caso de teste se duplica, todo o resto é com você.
Lembre-se também de que seus testes devem ser idempotentes, o que significa que eles precisam ser executados, não importa se o banco de dados que está tentando criar já existe ou não, portanto, se essa lógica não fizer parte do procedimento testado, você precisará adicione lógica ao teste para descartar o banco de dados, se ele existir. Isso leva à próxima coisa a se pensar: você precisa escrever seu teste de uma maneira que minimize a probabilidade de danos se executado por um colega de trabalho inexperiente. Isso significa que, nesse contexto, não use um nome de banco de dados usado na produção para esses testes.