Question Pourquoi le concombre est-il considéré comme un outil de test d'intégration au lieu d'un outil de test unitaire?


Cela m'a toujours dérangé. Pourquoi les gens disent-ils à un test unitaire dans rspec mais à un test d’intégration dans le concombre? Je ne demande pas pourquoi ces tests sont nécessaires - je connais la différence entre l'intégration et les tests unitaires. Je ne vois pas pourquoi, étant donné la syntaxe complètement personnalisable de concombre, il n'est pas utilisé pour les tests unitaires?

Il me semble que la même quantité de code est écrite pour concombre et rspec, la seule différence est que, pour le concombre, vous séparez la logique de test de l'écriture de test.


12
2017-11-17 05:40


origine


Réponses:


L'utilisation du concombre pour les tests unitaires entraîne beaucoup de frais généraux. Non seulement vous devez écrire les fonctionnalités, puis les mapper à l'implémentation en utilisant un bit de code distinct.

Les tests unitaires doivent être très rapides à écrire et très rapides à exécuter. Naturellement, le concombre se concentre sur l'expérience de l'utilisateur final, principalement en raison du langage utilisé pour écrire une fonctionnalité.

Juste pour rafraîchir, une fonctionnalité contiendrait les éléments suivants:

En tant que partie prenante d'un système
  Je voudrais effectuer une activité
  Pour que je puisse en tirer profit

Given a precondition
When I perform an action
Then something should happen

Le paragraphe d'ouverture, souvent ignoré, est très important car il définit le contexte de l'opération et explique Pourquoi quelque chose arrive. En raison de l'utilisation du langage naturel, ces éléments sont faciles à montrer aux non-programmeurs afin d'obtenir des commentaires.

Maintenant, l'utilisation de ces derniers pour les tests unitaires semblerait difficile au mieux. Tout d’abord, l’attention de l’utilisateur final suggère une approche plus intégrée, car la fonctionnalité ne dit rien sur les simulations et la séparation UI / logique. C'est à dire. une fonctionnalité comme celle-ci semble étrange:

Given a that a database mock is configured with the following data
| ID  | Username |
| 0   | igor     |
When call FindAll on User Repository
Then I get the following user back
| ID  | Username |
| 0   | igor     |

De plus, comme votre SUT devient plus petit (c’est-à-dire une classe), le contexte de fonctionnement n’est pas aussi important. Un référentiel d'utilisateurs ne se soucie pas du contexte, par exemple il ne se soucie pas si le consommateur est un utilisateur normal ou un utilisateur VIP. Un composant simple (qui devrait être, après SRP), est complètement déterministe en fonction de ses entrées.

Donc, le test unitaire est là pour valider que ce que vous avez écrit est correct, et le test cucmber est là pour valider que ce que vous avez écrit satisfait un objectif plus élevé en plaçant un comportement du système dans un contexte.


7
2017-12-02 10:32



Le concombre résout un ensemble de problèmes particuliers - impliquer les parties prenantes de l'entreprise qui ne peuvent pas facilement lire le code et ne peut certainement pas l'écrire, et réutiliser les étapes dans des scénarios automatisés. Les scénarios couvrent également généralement plus d'un aspect du comportement, documentant la fonctionnalité de l'ensemble du système et couvrant souvent des parcours entiers d'utilisateurs sur plusieurs composants. L'architecture par étapes que Cucumber encourage est idéale pour gérer ces scénarios.

Il introduit également toute une série d’autres problèmes. Tout d'abord, vous devez associer les scénarios de concombre à un ensemble d'appareils, ce qui rend leur écriture plus lente. Deuxièmement, l'anglais est plus difficile à restructurer que le code, même avec des langages dynamiques comme Ruby (la différence est encore plus marquée dans les variantes C # et Java comme JBehave, SpecFlow, Cuke4Nuke et Cuke4Duke). Il est plus difficile de dire si des étapes sont encore utilisées et plus difficile de maintenir les scénarios. Il est également plus difficile de gérer l'état entre les différentes étapes.

Avec les tests unitaires, le public est technique. Les classes ont idéalement des responsabilités uniques avec peu ou pas de duplication, de sorte que la réutilisation des étapes n’est pas importante. Lorsque nous souhaitons modifier un élément de code, nous avons tendance à rechercher des tests dont les conventions de dénomination correspondent aux fichiers ou aux classes. Par conséquent, une correspondance directe avec ces derniers est idéale.

En raison des coûts indirects de Cucumber, et du fait que nous ne tirons aucun avantage des avantages que Cucumber offre en contrepartie de ses frais généraux, RSpec convient mieux à un comportement au niveau de l’unité. (Ceci est également vrai pour JUnit, NUnit, etc.)

Si vous manquez le "Given, When, Then" de Concombre, essayez de les ajouter en tant que commentaires. Cela fonctionne bien pour moi.


4
2017-11-17 23:49



L'idée générale est que les tests de concombre sont écrits à un niveau plus élevé que les tests unitaires traditionnels. Par exemple, lorsque vous testez un module particulier, vous vous concentrez uniquement sur le test de la fonctionnalité des modules en dehors du reste du système. L'interface dans d'autres parties du système doit généralement être représentée avec des objets simulés.

Le concombre, quant à lui, se concentre sur les tests du système depuis l'interface utilisateur jusqu'à la couche de persistance des données.

Tests unitaires = Ingénieur en mécanique testant son nouveau moteur dans un environnement de laboratoire monté sur un harnais.

Test du concombre = Test pilote le mettant sur une piste pour un tour.


1
2017-11-17 14:16



Les tests unitaires doivent tester un particulier unité de code en vase clos. La granularité habituelle étant une méthode (ou peu de méthodes d'interaction) dans une classe.

Les tests d'intégration sont axés sur le test de nombreuses couches de la pile d'applications. Par exemple, vous pouvez exécuter un test d'intégration qui vérifie l'interaction de votre code avec une base de données. La plupart des tests d'intégration portent sur deux ou trois couches d'objets.

Les tests de concombre en particulier ont tendance à se concentrer sur la pile d'applications complète, car ils exercent l'application en simulant un utilisateur réel dans l'interface et toutes les couches de l'application, de l'interface utilisateur aux services principaux (bases de données, système de fichiers, réseaux, etc. ) sont en place et utilisés.

Bottom line:

un test unitaire vérifie qu'un morceau de code particulier respecte son contrat avec le reste du monde ...

Considérant qu'un test de concombre vérifie le interaction de plusieurs morceaux de code (une tranche verticale que certaines personnes pourraient dire), avec la beauté supplémentaire que le test lui-même lit comme un anglais simple.


0
2017-10-11 11:40



Selon Aslak Hellesøy, Cucumber n'est pas un outil de test, mais plutôt un outil de collaboration (pour BDD). Il a récemment publié sur cette apparente idée fausse:

https://cucumber.pro/blog/2014/03/03/the-worlds-most-misunderstood-collaboration-tool.html

Cela dit, il y a beaucoup de tests écrits en dessous du niveau d'acceptation qui tomberaient autour de la couche de test d'intégration. C'est à dire,

Given a user at 123 Evergreen Terrace
When I lookup their name
Then I get Homer Simpson

au lieu de

Given an address
When I lookup a name
Then the home owner name is displayed

Cela n'aide pas que le cukes.info montre comme un exemple impératif (plutôt que déclaratif).

Les tests de concombre sont lents comparés aux tests unitaires Rspec ou Test :: Unit ou MiniTest. Ils ont beaucoup de surcharge (cela peut prendre quelques minutes pour charger l'environnement, y compris toutes les classes d'objet de page, analyser les fichiers de fonctionnalités et exécuter des tests). Exécuter uniquement des tests unitaires Cucumber serait plus rapide que des tests équivalents d'intégration, mais pas aussi rapide que des tests plus légers tels que ceux mentionnés ci-dessus.

(Je réponds à cette ancienne question car c'était l'un des premiers succès que j'ai eu en cherchant des alternatives au concombre pour les tests d'intégration)


0
2018-03-07 13:12