Riducendo n + 1 query usando le gemme Bullet e RSpec

Qual è un modo efficace per utilizzare Bullet Gem con RSpec? In questo momento sento che se lo uso con il mio attuale framework di test di unità ottengo un sacco di notifiche o errori di test a causa di n + 1 query all’interno dei test stessi che non sono correlate a ciò che accade nella mia applicazione di produzione, come il controllo di un valore o associazione. Pertanto, la correzione dei guasti n + 1 non richiede l’impostazione di alcunché sui miei controller o modelli, piuttosto richiede l’impostazione di qualcosa nella mia configurazione di test per non generare quel particolare errore e non vedo alcun reale miglioramento delle prestazioni sulla mia applicazione.

Il modo più efficace non è affatto. Potrebbero esserci alcuni vantaggi legittimi nella riduzione delle query n + 1 nei test, ovviamente per accelerare i tempi complessivi di esecuzione. È tuttavia ansible che tu stia testando troppo o guadagni meno significativi di quanto sia ansible . Inoltre, di solito non trovo attraente scrivere codice aggiuntivo per aiutare a sostenere i test, piuttosto che contribuire al valore complessivo dell’applicazione.

Per favore permettimi di proporre un uso alternativo del tuo tempo. Solo test delle unità al minimo assoluto del tuo livello di comfort. Personalmente mi piace concentrarmi su metodi complessi che riguardano problemi relativi alla validazione e denaro o altra matematica, potresti avere priorità diverse. Disegnare la linea libererà un sacco di tempo scrivendo la parte più inutile e fragile della suite di test che occuperà la maggior parte del budget di manutenzione.

Ora, cosa fare saranno tutti i tuoi supplementari? Non preoccuparti, troveremo qualcosa da fare per te … Puoi iniziare scrivendo alcuni test di accettazione, in particolare per le aree che usano gli oggetti per cui hai appena perso un intero gruppo di test unitari. Ora gli avvisi n + 1 provengono effettivamente dallo stesso punto in cui si trovano quando l’utente raggiunge la pagina. Ora puoi continuare a rimuovere tutte le query n + 1.

Ma aspetta! Non farlo neanche io. Invece, spendi molto meno tempo impostando le tue relazioni per usare l’opzione touch . Quindi, quando un object figlio viene aggiornato, anche il genitore verrà aggiornato. Che diavolo ha a che fare con le query n + 1, ti starai chiedendo. Sembra che stiamo solo aggiungendo query …

È qui che entra in gioco il caching delle bambole russe . Aggiungendo questo, e testandolo correttamente, consumerai il test dell’unità liberato e il tempo di eliminazione n + 1 (e poi alcuni, se non stai attento). La cosa bella è che è molto più “reale”, molto più resistente ai cambiamenti di implementazione insignificanti o irrilevanti nei tuoi modelli e quant’altro, e un enorme incremento di prestazioni alla tua applicazione ben oltre ciò che elimina ogni query n + 1 caricando con entusiasmo tutto in alto potrebbe aver fornito. Dovrai muoverti il ​​più ansible nella cache annidata e caricare tutto quanto pigramente umanamente ansible, per trarre il massimo vantaggio da questo metodo.

Lunga vita n + 1!