Question

Je cherche actuellement à une suite de tests Rails lourdes. Il n'y a rien que je peux entrer dans les détails au sujet, mais le temps d'exécution pour la suite complète (unité / fonctionnelle / une certaine intégration) peut fonctionner vers le haut de 5 minutes.

Nous sommes complètement dépendants des appareils et nous sommes nous ne sommes pas moqueur et stubbing autant que nous devrions être.

Nos prochains sprints vont être complètement concentré sur la suite de tests, à la fois la couverture amélioration, l'écriture de meilleurs tests et l'écriture le plus important des tests plus efficaces.

A part plus moqueur et stubbing au sein de nos tests, nous envisageons de remplacer nos luminaires avec très probablement Factory Girl. Je vois beaucoup de gens heureux de faire des situations similaires mais n'ont pas été en mesure de trouver une bonne ressource sur les points négatifs de passer à une usine. J'ai vu quelques points de repère plus lents lors de l'utilisation des repères de diverses ressources mais ne peut pas trouver ce pourquoi les usines définitives sont bons et c'est la raison pour laquelle vous voudrez peut-être de ne pas les utiliser.

Quelqu'un peut-il me renseigner sur pourquoi ou pourquoi je ne devrais pas utiliser les usines?

Merci!

Était-ce utile?

La solution

Il pourrait y avoir quelques problèmes avec la mise en place de toutes les dépendances entre les entités de la suite bon test. Quoi qu'il en soit, il est encore beaucoup plus facile que maintaing beaucoup d'accessoires.

Luminaires:

  • difficile à entretenir des relations (en particulier beaucoup à beaucoup);
  • l'exécution de la suite de tests est généralement plus lent en raison de plus DB frappe;
  • les tests sont très sensibles aux changements de schéma.

Usines:

  • vous cognez tout ce que vous ne testez pas test unitaire en cours;
  • vous préparer des entités que vous testez avec des usines. C'est là usines montrent leur avantage réel - il est facile de mettre en place de nouveaux cas de test, que 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 changement de scénario, vous ne passez pas votre état d'esprit. Tant que les talons sont raisonnables et les usines sont faciles à personnaliser, vous devriez être bien.

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

  • temps passé la migration à partir des appareils;
  • en gardant un ensemble raisonnable de scénarios peut nécessiter un certain effort.

Autres conseils

La réponse de Oleg est grande, mais laissez-moi vous offre la perspective de quelqu'un qui utilise à la fois.

Les luminaires à tubes ont été le genre de garçon flagellation de la communauté Rails pendant un certain temps. Tout le monde comprend les inconvénients des appareils, mais personne ne défend vraiment leurs points forts. Dans mon expérience, les usines par eux-mêmes peuvent facilement devenir tout aussi difficile à maintenir que les appareils (cela dépend vraiment du schéma, mais je digresse). La force réelle des usines est en remplacement sélectif de la douleur à base de montage. Parlons un couple précis.

La première question est la performance. Si vous pouvez tester la plupart de votre application sans frapper la base de données, vous verrez une place importante de la vitesse, mais pour la plupart des applications je ne pense pas qu'il est sage de tester sans frapper entièrement la base de données. À un certain moment, vous voulez tester l'ensemble de la pile. Chaque fois que vous vous moquez ou cognez vous faites une hypothèse sur une interface qui peut contenir des bugs subtils. Donc, en supposant que vous avez besoin de frapper la base de données sur un pourcentage important de tests, appareils transactionnels (vous sont à l'aide des appareils transactionnels droit?) Pourrait bien être beaucoup plus rapide que instancier tout un environnement pour chaque test.

Je dirais que, avec la taille de votre suite de tests que vous avez vraiment besoin de regarder vers Autotest et pour aider au niveau individuel. Mais en fin de compte CI va vous permettre de maintenir la discipline de test sans sacrifier l'agilité des développeurs.

L'endroit où les appareils brillent vraiment est en test fonctionnel / intégration. La façon dont je regarde est que les appareils devraient mettre en place un état de base saine pour l'application à tester. La plupart des tests unitaires ne vraiment pas besoin de cela. Vous pouvez obtenir une très bonne couverture de l'unité à l'aide des usines. Cependant, quand il s'agit de tests fonctionnels, une page donnée peut être frapper des dizaines de modèles. Je ne veux pas mettre en place ce genre de choses dans chaque test. Comme je l'ai construire des scénarios de plus en plus complexes, je me rapproche et plus proche de recréer un état de données mondiale qui est exactement quels appareils ont été conçus pour faire en premier lieu.

Une croyance controversée je tiens est que tout le reste étant égal, 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 qui est envoyé à l'utilisateur est correcte. Les tests unitaires sont parfaits pour obtenir à des nuances de fonctionnalité, mais à la fin de la journée, vous pourriez encore avoir un bug le long d'une interface qui casse l'ensemble de votre site. Les tests fonctionnels sont ce qui me donne la confiance frappant déployer sans réellement le chargement de la page dans mon navigateur. Je sais que je pourrais bouchonner tout et tester les interfaces et obtenir la même couverture, mais si je peux tester l'ensemble de la pile dans un test simple au détriment d'une petite unité centrale de traitement, je ferais bien plutôt.

Alors, quelles sont mes meilleures pratiques pour les appareils?

  • 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 appareils pour représenter les principaux états
  • Evitez de modifier des vieux appareils, 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

De plus, permettez-moi de vous recommander Jay blog de champs pour vraiment bons conseils pragmatiques de test. Ce qui me plaît le plus dans le blog de Jay est qu'il a toujours ACKnowledges que le test est très spécifique au projet, et ce qui fonctionne pour un projet ne fonctionne pas nécessairement pour une autre. Il est court sur le dogme et à long sur le pragmatisme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top