Reduzindo n + 1 consultas usando as gemas Bullet e RSpec

O que é uma maneira eficaz de usar a Gem Bullet com RSpec? Agora eu sinto que se eu usá-lo com a minha atual estrutura de teste de unidade recebo muitas notifications ou falhas de testes por causa de n + 1 consultas dentro dos próprios testes que não estão relacionados ao que acontece no meu aplicativo de produção, como verificar um valor ou associação. Dessa forma, corrigir as falhas n + 1 não exige configuração de nada em meus controladores ou modelos, mas requer configuração na configuração do meu teste para não lançar esse erro em particular e não vejo melhora real no desempenho do meu aplicativo.

A maneira mais eficaz não é de todo. Pode haver algumas vantagens legítimas para reduzir n + 1 consultas em testes, obviamente para acelerar o tempo de execução geral. É bem possível, no entanto, que você esteja testando demais ou ganhe menos do que é possível . Eu também geralmente acho desagradável escrever código adicional para ajudar a sustentar os testes, em vez de contribuir para o valor geral do aplicativo.

Por favor, permita-me propor um uso alternativo do seu tempo. Apenas teste unitário ao mínimo absoluto do seu nível de conforto. Eu pessoalmente gosto de me concentrar em methods complexos envolvendo questões relacionadas a validação e dinheiro ou outra matemática, você pode ter prioridades diferentes. Desenhar a linha liberará um monte de tempo escrevendo a parte mais inútil e frágil de sua suíte de testes que ocupará a maior parte do seu orçamento de manutenção.

Agora, o que fazer todo o seu tempo extra? Não se preocupe, nós vamos encontrar algo para você fazer … Você pode começar escrevendo alguns testes de aceitação, particularmente para as áreas que usam os objects para os quais você acabou de lançar um monte de testes de unidade. Agora seus avisos n + 1 estão realmente vindo do mesmo ponto em que eles aparecerão quando o usuário acessar a página. Agora você pode continuar removendo todas as consultas n + 1.

Mas espere! Não faça isso também. Em vez disso, gaste muito menos tempo configurando seus relacionamentos para usar a opção de toque . Então, quando um object filho for atualizado, o pai também será atualizado. O que diabos isso tem a ver com n + 1 consultas, você deve estar se perguntando. Parece que estamos apenas adicionando consultas …

É aí que entra em cache o boneco russo . Adicionando isso, e testando-o adequadamente, consumiremos o teste de unidade liberado e o tempo de eliminação de n + 1 (e então alguns, se você não for cuidadoso). O bom é que é muito mais “mundo real”, muito mais resistente a alterações de implementação insignificantes ou irrelevantes em seus modelos e outros, e um grande aumento de desempenho em sua aplicação além do que elimina todas as consultas n + 1 carregando ansiosamente tudo na frente poderia ter fornecido. Você desejará mover-se o máximo possível para o armazenamento em cache nested e carregar tudo de forma tão preguiçosa quanto humanamente possível, para aproveitar ao máximo esse método.

Viva a vida n + 1!