44 votes

Pourquoi RSpec est-il si lent sous Rails ?

Chaque fois que j'exécute des tests rspec pour mon application Rails, cela prend une éternité et une journée de surcharge avant que les tests ne commencent réellement à être exécutés. Pourquoi rspec est-il si lent ? Existe-t-il un moyen d'accélérer le chargement initial de Rails ou d'isoler la partie de mon application Rails dont j'ai besoin (par exemple, uniquement le matériel ActiveRecord) afin qu'il ne charge pas absolument tout pour exécuter quelques tests ?

32voto

John Hinnegan Points 2784

Je vous conseille vivement d'aller voir du côté de Spork.

http://spork.rubyforge.org/

Le railstutorial aborde spécifiquement cette question et propose une solution de contournement pour que spork fonctionne correctement dans rails 3.0 (à l'heure actuelle, spork n'est pas prêt pour rails 3). Bien sûr, si vous n'êtes pas sur rails 3.0, vous devriez être en mesure de le faire.

La partie du tutoriel montrant comment faire fonctionner spork dans rails 3.0

http://railstutorial.org/chapters/static-pages#sec:spork

Vérifier si spork est prêt pour les rails 3.0

http://www.railsplugins.org/plugins/440-spork

22voto

Scott Matthewman Points 262

Vous devriez être en mesure d'accélérer votre script/spec en exécutant script/spec_server dans une fenêtre de terminal séparée, puis en ajoutant l'option supplémentaire -X à vos appels à la spécification.

4voto

Jean Points 9655

Pourquoi rspec est-il si lent ? parce qu'il charge tout l'environnement, les appareils et tout le reste.

Y a-t-il un moyen d'accélérer le chargement initial de Rails ? vous pourriez essayer d'utiliser des mocks au lieu de vous appuyer sur la base de données, c'est en fait correct pour les tests unitaires et cela accélérera définitivement vos tests unitaires. De plus, en utilisant le serveur spec comme mentionné par @ Scott Matthewman peut aider, de même avec l'autotest de zentest mentionné par @ Marc-André Lafortune

Existe-t-il un moyen d'isoler la partie de mon application Rails dont j'ai besoin (par exemple, uniquement le matériel ActiveRecord) afin qu'elle ne charge pas absolument tout pour exécuter quelques tests ? qu'en est-il de ceci

rake test:recent 

Je ne suis pas sûr de la façon dont la tâche rspec s'intègre à cela, mais vous pourriez certainement utiliser la tâche test:recent comme modèle pour faire la même chose avec les tests rspec si le

rake test:rspec:recent

n'existe pas encore

4voto

Orion Edwards Points 54939

parce qu'il charge tout l'environnement, les appareils et tout le reste.

Le vrai coupable est si vous l'exécutez en utilisant rake spec , il exécute le db:test:prepare tâche .

Cette tâche supprime toute votre base de données de test et la recrée à partir de zéro. Cela me semble ridicule, mais c'est ce qu'elle fait (la même chose se produit lorsque vous exécutez la tâche rake:test:units etc).

Vous pouvez facilement contourner ce problème en utilisant l'option spec que rspec installe dans le cadre de la gemme rspec.

Comme ça :

cd railsapp
spec spec # run all specs without rebuilding the whole damn database
spec spec/models # run model specs only

cd spec
spec controllers/user* # run specs for controllers that start with user

4voto

Nappy Points 49

Je pense que l'expérience "zen" que tu recherches est de courir spec_server y autospec en arrière-plan, avec pour résultat des tests quasi instantanés lorsque vous enregistrez un fichier.

Cependant, j'ai du mal à faire communiquer ces deux programmes.

J'ai trouvé une explication aquí :

J'ai remarqué qu'autotest n'envoie pas de commandes au spec_server. Au lieu de cela, il recharge tout l'environnement Rails et les plugins de votre application de votre application à chaque fois qu'il s'exécute. Cela provoque l'exécution d'autotest significativement plus lent que le serveur script, parce que lorsque vous exécutez l'application script/spec, les spécifications sont envoyées au spec_server qui a déjà votre environnement Rails activé. a déjà votre environnement Rails activé et prêt à fonctionner. Si vous Si vous installez un nouveau plugin ou quelque chose du genre, vous devrez vous devrez redémarrer le spec_server.

Mais, comment résoudre ce problème ? Je suppose que cela impliquerait de télécharger ZenTest et de modifier le code de l'interface utilisateur de ZenTest. autotest mais je n'ai pas le temps de l'essayer pour le moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X