Quando o assunto é criar estruturas de dados complexas para testes, o Laravel oferece uma ferramenta extremamente poderosa que pode ajudar a economizar recursos e possibilitar a criação de ambientes específicos, garantindo maior assertividade nos testes.
Esta ferramenta é o método recycle()
, ele oferece o poder de reutilizar instâncias de models em chamadas a Factories. Isso pode ser extremamente útil quando você precisa criar cenários com Models contendo relações em comum. Por exemplo:
// Cria um Time
$team = Team::factory()->create();
// Cria 3 Vendedores associando-os ao mesmo Time através do recycle
$sellers = Seller::factory(3)->recycle($team)->create();
No exemplo acima, criamos um cenário específico com 3 instâncias de Vendedores associadas ao mesmo Time. Dessa forma, é possível realizar testes com essa estrutura de dados definida, sem a necessidade de configurar manualmente as relações através dos atributos do create()
.
Utilizando Collections 🗂️
Além de funcionar com instâncias únicas de Models, o método recycle()
também aceita Collections. No entanto, quando utilizado com uma Collection, seu comportamento difere do uso básico, oferecendo uma camada extra de flexibilidade na criação de cenários de teste.
$teams = Team::factory(3)->create();
$sellers = Seller::factory(30)->recycle($teams)->create();
Nesse trecho de código passamos uma Collection com três Times distintos no recycle. Desta forma, a cada Vendedor criado, será escolhido aleatoriamente um dos três Times para ser atribuído, construindo um ambiente controlado em que todos os Vendedores estão associados a um desses Times.
Como isso aumenta a performance do meu teste? 📈
Ao criar conjuntos de dados com uma grande quantidade de registros, reciclar instâncias irá poupar recursos e diminuir o número de inserções no banco de dados.
$sellers = Seller::factory(3)->create();
$sales = Sale::factory(500)->create();
Sem o uso do recycle, atingimos um total de 1003 queries! Sendo 3 para criar os primeiros Vendedores, 500 para criar cada Venda e mais 500 para inserir, individualmente, os Vendedores associados a cada Venda.
$sellers = Seller::factory(3)->create();
$sales = Sale::factory(500)->recycle($sellers)->create();
Agora, utilizando o recycle, conseguimos uma redução de 500 chamadas ao banco de dados! Eliminando as instâncias individuais de Vendedores realizadas pelas Factory de Venda.
Conclusão
Reutilizando instâncias de models, ele simplifica a criação de cenários complexos e reduz significativamente o número de queries realizadas. Resultando em testes mais rápidos, eficientes e fáceis de manter. O recycle()
acaba mostrando-se uma ferramenta essencial no repertório de qualquer desenvolvedor Laravel, especialmente para quem trabalha com desenvolvimento orientado a testes.
Top comments (0)