Conforme nossa aplicação vai crescendo, o número de migrations também cresce. Em alguns casos, nos testes de integração optamos por ter toda a estrutura do banco sendo testada, para isso criamos e apagamos o banco em cada teste. Porém com o tempo essa tarefa se torna onerosa e passa a impactar na longa demora do processo do CI da aplicação, gerando um desconforto, principalmente quando temos um Hotfix que precisa subir o mais rápido possível.
Geralmente é utilizado nos testes a trait RefreshDatabase
, vamos ver o que essa trait faz.
Vejam que na trait é utilizado o comando migrate:fresh
, esse comando desfaz todo o banco e cria ele novamente, isso é feito a cada stack de teste.
Desenvolvi um projeto simples para analisarmos o tempo gasto usando a trait RefreshDatabase
Com 11 testes rodados demoramos 1.86s, parece tranquilo, mas nossas migrations não mudam certo? principalmente com um projeto já em produção, então porque precisamos sempre recriar o banco em cada teste?
Vamos tentar uma outra abordagem, no Laravel temos uma outra trait chamada DatabaseTransactions
, vamos da uma olhada nela.
Reparem que nessa trait temos algo diferente, é criada uma transação do banco no inicio do teste e após a conclusão é dado um rollback, vamos substituir ela e ver no que dar.
Oops temos um erro, para resolver esse problema teremos que executar nossas migrations antes dos nossos testes, podemos utilizar a configuração de bootstrap do phpunit para isso, por padrão essa configuração aponta para o arquivo Autoload da nossa vendor.
Para mais informações sobre o bootstrap do phpunit clique aqui
Vamos criar um arquivo bootstrap customizado.
No arquivo inicializamos o bootstrap da aplicação e no final temos o comando migrate:fresh
, esse comando vai ser rodado somente uma vez na inicialização dos testes, Agora vamos ajustar o caminho do bootstrap na configuração do phpunit.xml, apontando para o novo arquivo e rodar novamente os testes.
Conclusão
O que vemos é uma diferença absurda de performance nos nossos testes. Para um projeto muito grande com várias migrations utilizar a trait DatabaseTransactions
deixam os testes bem mais performáticos, segue aqui alguns exemplos do projeto desenvolvido nessa demonstração no meu Github, com a branch utilizando RefreshDatabase e com DatabaseTransaction, Espero que esse post seja útil.
Top comments (1)
Animal demais o artigo e realmente essa trait é top de se usar.