Pergunta

Quando você está fazendo testes de integração apenas com a camada de acesso a dados ou com a maior parte da pilha de aplicativos.Qual é a melhor maneira de evitar que vários testes entrem em conflito entre si se forem executados no mesmo banco de dados?

Foi útil?

Solução

Transações.

O que a estrutura de teste de unidade Ruby on Rails faz é isto:

Load all fixture data.

For each test:

  BEGIN TRANSACTION

    # Yield control to user code

  ROLLBACK TRANSACTION

End for each

Isso significa que

  1. Quaisquer alterações que seu teste fizer no banco de dados não afetarão outros threads enquanto estiver em andamento
  2. Os dados do próximo teste não são poluídos por testes anteriores
  3. Isso é cerca de um zilhão de vezes mais rápido do que recarregar manualmente os dados para cada teste.

Eu, pelo menos, acho isso muito legal

Outras dicas

Para aplicativos de banco de dados simples, acho que estou usando SQLite inestimável.Ele permite que você tenha um banco de dados exclusivo e independente para cada teste.

No entanto, isso só funciona se você estiver usando uma funcionalidade SQL genérica simples ou puder facilmente ocultar as pequenas diferenças entre o SQLite e seu sistema de banco de dados de produção atrás de uma classe, mas sempre achei isso bastante fácil nos aplicativos SQL que tenho desenvolvido.

Só para complementar a resposta do Free Wildebeest, também usei HSQLDB para fazer um teste de tipo semelhante, onde cada teste obtém uma instância limpa do banco de dados.

Eu queria aceitar as respostas do Free Wildebeest e do Orion Edwards, mas isso não me permitiu.A razão pela qual quis fazer isso é que cheguei à conclusão de que essas eram as duas principais maneiras de fazer isso, mas qual delas escolher depende do caso individual (principalmente do tamanho do banco de dados).

Execute também os testes em momentos diferentes, para que não afetem o desempenho ou a validade um do outro.

Embora não seja tão inteligente quanto a estrutura de teste de unidade Rails em uma das outras respostas aqui, criar dados distintos por teste ou grupo de testes é outra maneira de fazer isso.O nível de tédio com esta solução depende do número de casos de teste que você tem e do quão dependentes eles são uns dos outros.O tédio será verdadeiro se você tiver um banco de dados por teste ou grupo de testes dependentes.

Ao executar o conjunto de testes, você carrega os dados no início, executa o conjunto de testes, descarrega/compara os resultados, certificando-se de que o resultado real atende ao resultado esperado.Caso contrário, faça o ciclo novamente.Carregar, executar suíte, descarregar/comparar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top