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 ?
Réponses
Trop de publicités?Je vous conseille vivement d'aller voir du côté de Spork.
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
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
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
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.