96 votes

Accélérer les tests RSpec dans une grosse application Rails

J'ai une application Rails avec plus de 2 000 exemples dans mes tests RSpec. Inutile de dire, c'est une grande application et il ya beaucoup à être testé. L'exécution de ces tests à ce point est très inefficace et parce que cela prend si longtemps, nous sommes presque au point d'en être dissuadés de les écrire avant de pousser un nouveau build. J'ai ajouté --profil de mon spec.opte pour trouver la plus longue course d'exemples et il y en a au moins 10 d'entre eux qui prennent une moyenne de 10 secondes à s'exécuter. Est-ce normal d'entre vous RSpec experts? Est de 10 secondes, beaucoup trop long pour un exemple? Je me rends compte que 2 000 exemples, il faudra un montant non négligeable de temps pour tout tester en profondeur - mais à ce stade de 4 heures est un peu ridicule.

Quel genre de fois voyez-vous pour votre plus longue durée, des exemples? Que puis-je faire pour résoudre mon spécifications existantes afin de déterminer les goulots d'étranglement et aider à accélérer les choses. Chaque minute qui serait vraiment utile à ce stade.

123voto

BlueFish Points 2667

10 secondes c'est un temps très long pour un seul test à exécuter. Mon sentiment profond est que votre spec cible est en cours d'exécution à la fois de l'unité et de l'intégration tests en même temps. C'est une chose typique que les projets de l'automne et à un certain stade, vous aurez besoin pour surmonter cette dette technique si vous voulez produire plus, plus vite. Il y a un certain nombre de stratégies qui peuvent vous aider à le faire... et je vais vous recommander quelques-uns que j'ai utilisé dans le passé.

1. Unité Séparée De Tests D'Intégration

La première chose que je voudrais faire est de séparer l'unité à partir de tests d'intégration. Vous pouvez le faire soit par:

  1. Déplacer (dans des dossiers distincts en vertu de la spécification d'annuaire) - et la modification de l'angle d'attaque des cibles
  2. Leur marquage (rspec vous permet de marquer vos tests)

La philosophie va, que vous voulez que votre régulière construit pour être rapide, sinon les gens ne seront pas trop heureux de courir souvent. Donc revenir sur ce territoire. Obtenez votre régulièrement des tests à exécuter, rapide, et l'utilisation d'un serveur d'intégration continue pour exécuter le plus complet de compilation.

Un test d'intégration est un test qui consiste dépendances externes (par exemple, Base de données, Webservices, File d'attente, et certains diront système de fichiers). Un test unitaire juste des tests de l'élément spécifique de code que vous souhaitez vérifier. Il doit courir vite (9000 en 45 secondes est possible), c'est à dire plus de, il devrait fonctionner dans la mémoire.

2. Convertir Des Tests D'Intégration Pour Les Tests Unitaires

Si la majeure partie de vos tests unitaires est plus petite que votre intégration de la suite de tests, vous avez un problème. Ce que cela signifie, c'est que les incohérences commencent à apparaître de plus en plus facilement. A partir de là, commencer à créer plus de tests unitaires pour remplacer les tests d'intégration. Les choses que vous pouvez faire pour aider à ce processus sont:

  1. Utiliser un moqueur cadre au lieu de la véritable ressource. Rspec a une fonction intégrée de se moquant de cadre.
  2. Exécuter rcov sur vos tests unitaires. L'utiliser pour évaluer la façon dont approfondie de votre appareil suite de tests.

Une fois que vous avez une bonne unité de test(s) pour remplacer un test d'intégration - supprimer le test d'intégration. Double test rend la maintenance pire.

3. Ne pas Utiliser Luminaires

Les sanitaires sont mauvaises. Utiliser une usine à la place (machiniste ou factory_girl). Ces systèmes peuvent construire plus adaptable graphes de données, et plus important encore, ils peuvent construire des objets en mémoire que vous pouvez utiliser, plutôt que de charger les choses à partir d'une source de données externe.

4. Ajouter Des Contrôles Pour Arrêter Les Tests Unitaires Devenir Des Tests D'Intégration

Maintenant que vous avez un test plus rapide en place, le temps de mettre des contrôles pour éviter que cela ne se reproduise.

Il y a des bibliothèques qui singe patch active record de jeter une erreur en essayant d'accéder à la base de données (UnitRecord).

Vous pouvez également essayer de couplage et de l'ATS qui peut aider la force de votre équipe pour écrire des tests plus rapides, parce que:

  1. Quelqu'un vérifier - pour que personne ne se paresseux
  2. Bon TDD nécessite rapide des commentaires. Lent tests de juste faire une chose douloureuse.

5. Utiliser D'Autres Bibliothèques Pour Surmonter Le Problème

Quelqu'un a parlé de spork (accélère les temps de chargement pour la suite de test sous rails3), hydra/parallel_tests - exécuter des tests unitaires en parallèle (sur plusieurs cœurs).

Cela devrait probablement être utilisé en DERNIER. Votre vrai problème, c'est tout le chemin à l'étape 1, 2, 3. Résoudre cela et vous serez dans une meilleure position pour rôle supplémentaire de l'infrastructure.

18voto

marshally Points 2260

Pour un grand livre de cuisine sur l'amélioration de la performance de votre suite de tests, découvrez la Graisse de Votre Suite de la présentation.

Il documents 45x speedup dans la suite de test temps d'exécution en utilisant des techniques telles que:

5voto

Rishav Rastogi Points 12025

Vous pouvez utiliser Spork. Il a un support pour 2.3.x,

https://github.com/sporkrb/Spork

ou ./script/spec_server qui peut fonctionner pour 2.x

Aussi, vous pouvez modifier la configuration de base de données (ce qui accélère essentiellement les requêtes de base de données etc.), qui augmentera également la performance pour les tests.

4voto

zetetic Points 29261

10 secondes par exemple semble être une très longue période de temps. Je n'ai jamais vu une spécification qui a pris plus d'une seconde, et la plupart ont beaucoup moins. Êtes-vous tester les connexions réseau? Écritures de base de données? Système de fichiers écrit?

Mocker et les talons, autant que possible, - ils sont beaucoup plus rapide que d'écrire du code qui accède à la base de données. Malheureusement, les objets fantaisie aussi prendre plus de temps pour écrire (et sont plus difficile à faire correctement). Vous devez équilibrer le temps passé à écrire des tests contre le temps passé à l'exécution des tests.

Je seconde Andrew Grimm'commentaire à propos de la recherche dans un système CI qui peut vous permettre de paralléliser votre suite de tests. Pour quelque chose de cette taille, il peut être la seule solution viable.

1voto

user456733 Points 301

Commander cette présentation : http://grease-your-suite.heroku.com/#1

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