La réponse d'Oleg est excellente, mais permettez-moi d'offrir la perspective de quelqu'un qui utilise les deux.
Les montages ont en quelque sorte été le fouet de la communauté Rails pendant un moment. Tout le monde comprend les inconvénients des appareils, mais personne ne défend vraiment leurs forces. Dans mon expérience, les usines en elles-mêmes peuvent facilement devenir aussi difficiles à entretenir que les appareils (cela dépend vraiment du schéma, mais je m'égare).La vraie force des usines est dans le remplacement sélectif de la douleur à base de fixture. Parlons de quelques détails.
Le premier problème est la performance. Si vous pouvez tester la plupart de votre application sans toucher à la base de données, vous verrez une accélération significative, mais pour la plupart des applications, je ne pense pas qu'il soit sage de tester sans toucher complètement la base de données. À un moment donné, vous voulez tester la pile entière. Chaque fois que vous vous moquez ou que vous réduisez, vous faites une supposition à propos d'une interface qui peut contenir des bugs subtils. Donc, en supposant que vous devez frapper la base de données sur un pourcentage significatif de tests, les fixations transactionnelles (sont en utilisant des fixations transactionnelles?) Pourraient bien être beaucoup plus rapides qu'instancier un environnement entier pour chaque test. Je dirais qu'avec la taille de votre suite de tests que vous avez vraiment besoin de regarder vers Continuous Integration pour faire évoluer votre développement au niveau suivant. Peu importe à quel point vous les accélérez, les développeurs attendent encore longtemps. Peut-être regarder autotest ainsi pour aider au niveau individuel. Mais en fin de compte, CI va vous permettre de maintenir la discipline de test sans sacrifier l'agilité du développeur.
L'endroit où les luminaires brillent vraiment est dans les tests fonctionnels/d'intégration. La façon dont je le vois est que les appareils doivent mettre en place un état de base sain pour l'application à tester. La plupart des tests unitaires n'en ont pas vraiment besoin. Vous pouvez obtenir une très bonne couverture d'unité en utilisant des usines. Toutefois, en ce qui concerne les tests fonctionnels, une page donnée peut toucher des dizaines de modèles. Je ne veux pas mettre tout ça dans chaque test. Comme je construis des scénarios de plus en plus complexes, je me rapproche de plus en plus de recréer un état de données global qui est exactement ce que les appareils ont été conçus pour faire en premier lieu. Une croyance controversée que je tiens est que toutes choses étant égales par ailleurs, je préfère un test fonctionnel à 20 tests unitaires (en utilisant le langage Rails). Pourquoi? Parce que le test fonctionnel prouve que le résultat final envoyé à l'utilisateur est correct. Les tests unitaires sont parfaits pour obtenir des nuances de fonctionnalités, mais à la fin de la journée, vous pourriez toujours avoir un bug le long d'une interface qui casse tout votre site. Les tests fonctionnels sont ce qui me donne la confiance nécessaire pour déployer sans charger la page dans mon navigateur. Je sais que je pourrais tout casser et tester les deux interfaces et obtenir la même couverture, mais si je peux tester la pile entière dans un test simple au détriment d'un peu de CPU, je préfère faire cela.
Alors, quelles sont mes meilleures pratiques pour les luminaires?
- Mettre en place une poignée pour chaque modèle pour couvrir les plus larges catégories de données
- Lors de l'ajout d'une nouvelle fonctionnalité majeure qui coupe à travers de nombreux modèles et contrôleurs, ajouter quelques nouveaux luminaires pour représenter les principaux états
- Éviter l'édition de luminaires anciens, sauf pour l'ajout/suppression de champs
- Utilisez des usines pour des variations plus petites/plus localisées
- Utilisez des usines pour des tests ou pagination autre création de masse qui est nécessaire uniquement pour quelques tests
Aussi, laissez-moi vous recommander Jay Fields' blog pour de très bons conseils de test pragmatique. Ce que j'aime le plus sur le blog de Jay, c'est qu'il reconnaît toujours que les tests sont très spécifiques à un projet, et que ce qui fonctionne pour un projet ne fonctionne pas nécessairement pour un autre. Il court sur le dogme et sur le pragmatisme.