DEV Community

Cover image for Conheça o recycle(♻️) do Laravel
Tarcisio Araújo
Tarcisio Araújo

Posted on

2

Conheça o recycle(♻️) do Laravel

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

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.

Referência:

- Documentação oficial do Laravel.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more