2009-04-20 8 views
2

Je suis actuellement à la recherche d'une suite de tests Rails lourdes. Je ne peux rien dire de plus sur les détails, mais le temps d'exécution pour toute la suite (unité/fonctionnelle/intégration) peut aller jusqu'à 5 minutes.Avantages et inconvénients de l'utilisation de Factories dans une suite de tests Rails?

Nous sommes entièrement dépendants des appareils et nous ne nous moquons pas et nous ne devons pas nous écraser autant que nous le devrions. Nos prochains sprints vont se concentrer entièrement sur la suite de tests, à la fois pour améliorer la couverture, écrire de meilleurs tests et surtout écrire des tests plus efficaces. Donc, en dehors de plus de moqueurs et de réduction dans nos tests, nous envisageons de remplacer nos appareils par Factory Girl. Je vois beaucoup de gens heureux qui font des situations similaires, mais n'ont pas été en mesure de trouver une bonne ressource sur les inconvénients de déménager dans une usine. J'ai vu des benchmarks plus lents lors de l'utilisation de benchmarks de diverses ressources, mais je ne peux pas trouver de façon définitive pourquoi les usines sont bonnes et c'est pourquoi vous ne voudrez peut-être pas les utiliser. Est-ce que quelqu'un peut me renseigner sur pourquoi ou pourquoi je ne devrais pas utiliser des usines?

Merci!

Répondre

6

Il peut y avoir des problèmes avec la configuration de toutes les dépendances entre entités pour une bonne suite de tests. Quoi qu'il en soit, c'est toujours beaucoup plus facile que de maintenir beaucoup d'appareils.

Équipement:

  • difficile à entretenir des relations (en particulier beaucoup à beaucoup);
  • La suite de tests runtime est généralement plus lente en raison de plus de hits DB;
  • Les tests sont très sensibles aux changements de schéma.

usines:

  • vous tout Stub vous ne testez pas au test unitaire en cours;
  • vous préparez des entités que vous testez avec des usines. C'est là que les usines montrent leur réel avantage - il est facile de mettre en place de nouveaux cas de test, car vous n'avez pas besoin de maintenir une tonne de fichiers YAML pour cela;
  • vous vous concentrez sur les tests. Si les tests nécessitent un changement de scénario, vous ne changez pas votre état d'esprit. Tant que les talons sont raisonnables et que les usines sont facilement personnalisables, tout devrait bien se passer.

Ainsi, les usines semblent être un bon moyen d'aller. Les seuls inconvénients possibles que je vois, sont:

  • fois que vous avez passé la migration à partir des appareils; Le maintien d'un ensemble de scénarios sains peut nécessiter quelques efforts.
10

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.

Questions connexes