BDD avec concombre et rspec-quand est-ce que c'est redondant?

une version de Rails / outil spécifique de: Quelle est la profondeur de vos tests unitaires?

en ce moment, j'écris:

  • Cucumber features (integration tests) - CE test par rapport au HTML/JS qui est retourné par notre application, mais teste parfois aussi d'autres choses, comme les appels à des services tiers.
  • RSpec contrôleur de tests (tests fonctionnels), à l'origine uniquement si les contrôleurs ont tout logique significative, mais maintenant de plus en plus.
  • RSpec modèle de tests (tests unitaires)

parfois, cela est tout à fait nécessaire; il est nécessaire de tester un comportement dans le modèle qui n'est pas entièrement évident ou visible pour l'utilisateur final. Lorsque les modèles sont complexes, il faut absolument les tester. Mais d'autres fois, il me semble que les tests sont redondantes. Par exemple, testez-vous la méthode foo si elle est seulement appelée par bar , et bar est testé? Si bar est une simple méthode d'aide sur un modèle qui est utilisé par et facilement vérifiables dans un Concombre? Testez-vous la méthode en rspec aussi bien qu'en concombre? Je me retrouve à me débattre avec cela, car écrire plus de tests prend du temps et de maintenir de multiples "versions" de ce qui est effectivement les mêmes comportements, ce qui rend l'entretien de la suite de tests plus intensif en temps, ce qui à son tour rend les changements plus coûteux.

en bref, croyez-vous il y a un moment où écrire seulement des traits de concombre est suffisant? Ou devriez-vous toujours faire des tests à tous les niveaux? Si vous pensez qu'il y a une zone grise, Quel Est votre seuil pour "cela nécessite un test fonctionnel/unitaire."Concrètement, que faites-vous actuellement, et pourquoi (ou pourquoi pas) pensez-vous que c'est suffisant?


modifier : voici un exemple de ce qui pourrait être " test overkill." certes, j'ai pu écrire ceci assez rapidement, mais c'était complètement hypothétique.

38
demandé sur Community 2010-09-17 19:41:28

6 réponses

bonne question, une que j'ai affronté récemment en travaillant sur une application Rails, également en utilisant Cucumber/RSpec. J'essaie de tester le plus possible à tous les niveaux, mais j'ai aussi découvert qu'au fur et à mesure que la base de données croît, j'ai parfois l'impression de me répéter inutilement.

en utilisant le test" Outside-in", mon processus se déroule habituellement comme suit: scénario de concombre -> contrôleur Spec -> modèle Spec. De plus en plus je me retrouve à sauter sur les spécifications du contrôleur comme le concombre les scénarios couvrent une grande partie de leur fonctionnalité. D'habitude, j'y retourne et j'Ajoute les spécifications du contrôleur, mais ça peut sembler un peu fastidieux.

une étape que je fais régulièrement est de lancer rcov sur mes caractéristiques de concombre avec rake cucumber:rcov et de chercher des lacunes notables dans la couverture. Ce sont des domaines du code sur lesquels je m'assure de me concentrer afin qu'ils aient une couverture décente, que ce soit des tests d'unité ou d'intégration.

je crois que les modèles/libs devrait être de l'unité testée à grande échelle, à l' bat, car c'est la logique de base de l'activité. Il doit travailler de façon isolée, en dehors du processus normal de demande/réponse sur le web. Par exemple, si j'interagis avec mon application via la console Rails, je travaille directement avec la logique métier et je veux l'assurance que les méthodes que j'utilise sur mes modèles/classes sont bien testées.

à la fin de la journée, chaque application est différente et je pense que c'est au(X) développeur (s) de déterminer combien de couverture de test devrait être consacrée à différentes parties de la base de code et trouver le bon équilibre afin que votre suite de test ne vous emboîte pas vers le bas que votre application se développe.

voici un article intéressant que j'ai déterré de mes marque-pages qui mérite d'être lu: http://webmozarts.com/2010/03/15/why-not-to-want-100-code-coverage /

27
répondu Sidane 2010-09-22 13:34:59

Rails a un codebase bien testé, donc j'éviterais de re-tester les choses qui est couvert dans ces étapes.

par exemple, à moins qu'il ne s'agisse d'un code personnalisé, il est inutile de tester les résultats des validations au niveau de l'unité et au niveau fonctionnel. Je les testerais au niveau de l'intégration. Les caractéristiques du concombre agissent comme des spécifications pour votre projet, il est donc bon de spécifier que vous avez besoin d'une validation pour x et y, même si l'implémentation est une déclaration en une seule ligne dans le modèle.

2
répondu edgerunner 2010-09-18 11:26:04

vous ne voulez généralement pas avoir à la fois des histoires de concombre et RSpec contrôleur specs/tests d'intégration. Choisissez-en un (Généralement le concombre est le meilleur choix, sauf dans certains cas spéciaux). Puis utilisez RSpec pour vos modèles, et c'est tout ce dont vous avez besoin.

1
répondu Marnen Laibow-Koser 2011-04-18 18:03:48

je teste des méthodes complexes de modèle/lib avec rspec puis la logique d'affaires principale dans le Web avec cucumber, donc je suis sûr que les principales caractéristiques du web fonctionnera à 100%, puis si j'ai plus de temps et de ressources, je teste tout le reste.

0
répondu Gacha 2010-09-18 08:03:26

C'est plus facile d'écrire des spécifications simples pour des méthodes simples. Son beaucoup plus facile que d'écrire cukes.

si vous gardez vos méthodes simples - et gardez vos spécifications simples - en testant seulement la logique à l'intérieur de cette méthode - vous trouverez la joie dans l'essai à l'unité.

si quelque chose est redondant ses tests de concombre. Si vous avez des modèles bien testés et lib votre logiciel devrait fonctionner.

0
répondu Vojto 2010-09-22 03:31:18

le but du concombre n'est pas d'effectuer des tests d'intégration. Concombre, en général BDD, fonctionne comme une plate-forme de communication, un moyen d'améliorer le "parler" à l'intérieur d'une grande équipe de développeurs non-développeurs qui développent de gros et de logiciels complexes. BDD est très utile pour communiquer un modèle et son domaine au même niveau à tous les membres de l'équipe, même s'ils ne connaissent rien aux ordinateurs.

si ce n'est pas votre scénario, n'utilisez pas de concombre, parce que vous n'en avez pas besoin. Utilisez rspec et capybara pour tester votre code JS et vos tests d'intégration.

-1
répondu aarkerio 2018-05-22 19:41:05