10 secondes, c'est un temps très long pour un seul test à exécuter. Mon instinct est que votre cible de spécifications exécute simultanément des tests unitaires et d'intégration. C'est une chose typique dans laquelle les projets tombent et à un certain stade, vous devrez surmonter cette dette technique si vous voulez produire plus, plus rapidement. Il existe un certain nombre de stratégies qui peuvent vous aider à le faire ... et je vais en recommander quelques-unes que j'ai utilisées dans le passé.
1. Séparer l'unité des tests d'intégration
La première chose que je ferais est de séparer l'unité des tests d'intégration. Vous pouvez le faire soit en:
- Les déplacer (dans des dossiers séparés sous le répertoire spec) - et modifier les cibles de rake
- Les baliser (rspec vous permet de baliser vos tests)
La philosophie est que vous voulez que vos builds réguliers soient rapides - sinon les gens ne seront pas trop heureux de les exécuter souvent. Revenez donc sur ce territoire. Exécutez rapidement vos tests réguliers et utilisez un serveur d'intégration continue pour exécuter la version la plus complète.
Un test d'intégration est un test qui implique des dépendances externes (par exemple, base de données, WebService, file d'attente et certains diraient FileSystem). Un test unitaire teste simplement l'élément de code spécifique que vous souhaitez vérifier. Il devrait fonctionner rapidement (9000 en 45 secondes est possible), c'est-à-dire que la plupart devrait fonctionner en mémoire.
2. Convertir les tests d'intégration en tests unitaires
Si la majeure partie de vos tests unitaires est inférieure à votre suite de tests d'intégration, vous avez un problème. Cela signifie que les incohérences commenceront à apparaître plus facilement. À partir de là, commencez à créer plus de tests unitaires pour remplacer les tests d'intégration. Les choses que vous pouvez faire pour aider dans ce processus sont:
- Utilisez un cadre moqueur au lieu de la vraie ressource. Rspec a un cadre de simulation intégré.
- Exécutez rcov sur votre suite de tests unitaires. Utilisez-le pour évaluer la profondeur de votre suite de tests unitaires.
Une fois que vous avez un ou plusieurs tests unitaires appropriés pour remplacer un test d'intégration, supprimez le test d'intégration. Les tests en double ne font qu'empirer la maintenance.
3. N'utilisez pas d'appareils
Les luminaires sont mauvais. Utilisez plutôt une usine (machiniste ou factorybot). Ces systèmes peuvent créer des graphiques de données plus adaptables et, plus important encore, ils peuvent créer des objets en mémoire que vous pouvez utiliser, plutôt que de charger des éléments à partir d'une source de données externe.
4. Ajouter des vérifications pour empêcher les tests unitaires de devenir des tests d'intégration
Maintenant que vous avez mis en place des tests plus rapides, il est temps de vérifier pour empêcher que cela ne se reproduise.
Il existe des bibliothèques dont l'enregistrement actif de monkey patch génère une erreur lors de la tentative d'accès à la base de données (UnitRecord).
Vous pouvez également essayer le couplage et le TDD, ce qui peut aider votre équipe à écrire des tests plus rapides car:
- Quelqu'un vérifie - donc personne ne devient paresseux
- Un TDD approprié nécessite une rétroaction rapide. Des tests lents rendent tout cela douloureux.
5. Utilisez d'autres bibliothèques pour résoudre le problème
Quelqu'un a mentionné spork (accélère les temps de chargement de la suite de tests sous rails3), hydra / parallel_tests - pour exécuter des tests unitaires en parallèle (sur plusieurs cœurs).
Cela devrait probablement être utilisé en dernier. Votre véritable problème se situe tout au long des étapes 1, 2 et 3. Résolvez-le et vous serez mieux placé pour attribuer une infrastructure supplémentaire.