9
votes

Comment puis-je accélérer la création de 5 000 enregistrements pour mes tests RSPEC?

J'utilise Ruby sur Rails 3.2.2, FactoryGirl 3.1.0, FactoryGirlails 3.1.0, RSPEC 2.9.0 et RSPecroails 2.9.0. Afin de tester ma candidature, je dois créer beaucoup d'enregistrements (environ 5000) dans la base de données, mais cette opération est très lente (il faut plus de 10 minutes pour créer des enregistrements). Je procède comme ceci: xxx

Comment puis-je améliorer mon code de spécification afin d'aller plus vite?

note : peut-être que la lenteur est donnée par (5) les rappels d'articles qui fonctionnent avant et après chaque processus de création d'articles, mais je peux sauter celles (car les seules choses que je dois tester sont des articles et non des modèles associés) si ces restes création d'enregistrements ... est-il possible de faire que et c'est la bonne façon de procéder?


0 commentaires

3 Réponses :


0
votes

Je ne suis pas expert en test, mais je pense que FactoryGirl n'est pas censé avoir cette utilisation. Il devrait être de créer quelques enregistrements.

Pensez si vous avez vraiment besoin de tant d'enregistrements pour tester, si vous le faites, il faut-il être "réinitialisé" avant chaque test? (Oui, vous les créez avant chaque test. Vous créez donc 5000 * Number_Of_Tests Enregistrés). Un script SQL brut n'est-il pas un choix? Donc, lorsque votre test DB est créé, tous ces enregistrements sont également créés.


0 commentaires

2
votes

Lorsque vous commencez à traiter un grand nombre d'enregistrements comme celui-là, il vaut mieux le faire dans SQL directement pour éviter la surcharge d'activerecord que vous n'avez pas besoin.
Je chercherais à écrire un script ou à créer une procédure stockée pour le faire dépendre de votre implémentation SQL. Cela finira probablement dans quelques secondes.


1 commentaires

+1. Ou vient de vider la base de données sur un fichier texte et de le recharger si nécessaire.



0
votes

Comme d'autres personnes ont mentionné, les usines ne sont pas censées être élevées. Pourquoi un test d'unité raisonnable aurait-il besoin de 5 000 enregistrements?

Cela dit, une partie de la raison de la ralentissement est que #create enregistre chaque enregistrement à la base de données après sa construction. Vous voulez probablement utiliser usinegirl.build à la place; Voir Utiliser des usines .

Bien sûr, vous allez négocier un processus d'I / O-liés pour un processus lié à la mémoire. Si ce n'est pas ce que vous voulez vraiment, envisagez d'utiliser #build pour instancier juste suffisamment d'enregistrements pour effectuer chaque test individuel ou utiliser un Fichier de fixation optimisé pour les charges en vrac.


0 commentaires