Est-ce que Protractor et Karma peuvent être utilisés ensemble?

si Rapporteur remplace coureur de scénario angulaire pour le test E2E, est-ce que cela signifie que je pourrai encore l'utiliser avec Karma comme mon cadre de test E2E ?

98
demandé sur Dmitri Zaitsev 2013-06-12 20:21:35

2 réponses

Non recommandé par le responsable actuel de Protractor:

https://github.com/angular/protractor/issues/9#issuecomment-19927049

Protractor et Karma ne doivent pas être utilisés ensemble; ils fournissent plutôt des systèmes séparés pour exécuter les essais. Protractor et Karma couvrent différents aspects des tests - Karma est destiné principalement pour les tests unitaires, tandis que Protractor devrait être utilisée pour la fin à la fin de l'essai.

Protractor est construit au-dessus de WebDriverJS, qui utilise un serveur Selenium/WebDriver pour fournir les navigateurs et l'exécution de test. Des exemples de WebDriverJS purs peuvent être trouvés ici: http://code.google.com/p/selenium/wiki/WebDriverJs

et

https://github.com/angular/protractor/issues/9#issuecomment-19931154

Georgios - je pense qu'il est logique de garder Protractor et Karma séparés - pour les tests de bout en bout, vous voulez le pilotage d'événement natif et la flexibilité de webdriver, tandis que pour les tests unitaires vous voulez l'exécution rapide et l'autowatching de fichiers.

95
répondu jack 2014-04-02 06:38:14

UPDATE. Voici un paquet simple que j'ai créé pour ajouter une configuration Karma minimale à n'importe quel projet avec une seule commande npm install min-karma .


j'aimerais clarifier certaines idées fausses possibles au sujet de Karma et Protractor . Karma FAQ fait référence à Adaptateur pour le coureur de scénario D'Angular , qui, cependant, semble être abandonné, avec Rapporteur étant recommandé à la place.


Karma

Karma est un coureur de test qui exécutera le JavaScript fichiers spécifié dans votre fichier de configuration explicitement ou en utilisant noeud-globs . (Pour non-JavaScript externe modèles , Angular's Unit Testing Guide recommande d'utiliser préprocesseur Karma html pour les compiler en JavaScript en premier.)

ceux-ci peuvent être tous vos fichiers source, certains d'entre eux, certains d'entre eux plus certains supplémentaires fichiers ou fichiers non pertinent à votre projet, ne fournissant qu'une configuration supplémentaire - vous nom! Vous pouvez avoir plusieurs fichiers de configuration karma pour différents buts, que vous pouvez exécuter en parallèle ou un par un. Chaque processus karma lance son propre jeu de navigateurs (ceux-ci sont actuellement disponibles) .

Ce fonctionnalité de Karma exécuter uniquement une ensemble de fichiers est ce qui le rend parfait pour les tests rapides cours d'exécution en arrière-plan sur chaque fichier source de modifier et d'obtenir une rétroaction immédiate, qui est génial! Le seul négatif est le rapport d'erreur" bruyant " qui, espérons-le, s'améliorera!


Karma n'est pas seulement pour les tests unitaires

test Unitaire est pour une seule unité de votre code source. Dans le cas D'Angular, une unité typique est la composante angulaire ( Service, Factory, Provider, Controller, Filter, Directive etc). N'oubliez pas de garder votre Controllers mince, donc trop de tests unitaires pour les latteurs est un drapeau rouge .

dans un test unitaire , toutes les autres unités de code dont dépend cette unité (les dépendances dites de l'unité) ne devraient pas être testées en même temps. Ils devraient plutôt être "moqués", par exemple remplacés par quelque chose de simple comme des instances factices. Angulaire de l'offre grande maquette de l'environnement de soutien . Idéalement, vous voulez voir tous ces simulacres directement à l'intérieur de vos tests, vous n'avez jamais besoin de se demander où tous ceux dépendances viennent.

Karma est tout aussi utile pour tests D'intégration , où un groupe d'unités de code source est testé ensemble, avec seulement certaines de leurs dépendances étant moqué. Il est important de se rappeler que toute dépendance est par défaut fournie à partir de vos modules de code source (aussi longtemps que ces modules injectés directement dans vos tests , ou ils sont des dépendances d'autres modules injectés (dans ce cas, vous n'avez pas besoin de les injecter, mais il n'y a aucun mal à le faire). Les dépendances moquées supplanteront les dépendances fournies.

en cours d'Exécution Rapide et Fréquent est la caractéristique principale de Karma . Cela signifie que vous voulez éviter toutes les requêtes de serveur, toutes les requêtes de base de données, tout ce qui peut prendre plus de fractions de secondes. ( sinon il ne sera pas vite! ) ces longs processus sont ceux que vous voulez mock . Cela explique également pourquoi il est une mauvaise pratique de mettre des services de bas niveau comme $http directement à l'intérieur de vos contrôleurs ou des unités logiques d'affaires compliquées. En enveloppant ces bas niveau outside communication services dans des services dédiés plus petits, vous le rendez beaucoup plus facile à "mock them away".

Ce Karma ne fait pas gère votre site tel qu'il est, ce qui est ce que End-to-End (E2E) testing est. En principe, vous pouvez utiliser les méthodes internes D'Angular pour recréer le site ou ses pièces. Qui, pour de petits morceaux, peut être utile, et un moyen rapide, par exemple pour tester des directives.

Il est, toutefois, pas recommandé à lancer de code compliqué à l'intérieur de vos tests. Plus vous le faites, plus la chance est que vous faites des erreurs dans ce code au lieu de ce que vous êtes réellement tester.

C'est pourquoi je n'aime pas personnellement la manière souvent mentionnée compliquée de tester des méthodes utilisant des méthodes de faible niveau comme $http . Il fonctionne plus propre pour isoler toute référence aux méthodes de bas niveau dans méthodes dédiées de votre propre, dont responsabilité unique est de faire des requêtes http. Ces méthodes spécifiques devraient pouvoir fonctionner avec réel " backend , pas un faux! Que vous pouvez facilement tester - manuellement ou même parfaitement bien avec Karma exécution avec une autre configuration spéciale , tant que vous ne mélangez pas cette configuration avec celle habituellement utilisée pour exécuter Karma régulier et rapide. Maintenant, en ayant vos petits services dédiés testés, vous pouvez en toute sécurité et facilement les simuler pour tester votre autre logique et mettre ces tests dans votre régulière Karma le programme d'installation.


pour résumer. utilisez Karma pour exécuter n'importe quel ensemble de fichiers JavaScript. Il est (devrait être) rapide. Vous ne voyez pas votre application complète, donc ne peut pas tester le résultat final de manière efficace et fiable. Est-ce que je vais lancer le avec le Rapporteur ? Pourquoi serais-je? Lancer Rapporteur ralentirait mes essais, défaire le but de Karma . Il est facile d'exécuter Rapporteur séparément.


Rapporteur

Rapporteur est:

d'un bout à l'framework de test pour les applications AngularJS. Protractor exécute des tests contre votre application en cours d'exécution dans un vrai navigateur, interagissant avec lui comme un utilisateur le ferait.

Donc Rapporteur fait exactement ce que Karma n'est pas votre véritable application finale. Cela révèle à la fois son pouvoir et ses limites:

Running complete application est le seul test final fiable que votre application fonctionne comme prévu. Vous pouvez écrire des scénarios complets d'histoire d'utilisateur et les mettre dans vos tests!

mais c'est plus difficile de suivre les erreurs sans isoler les unités individuelles de votre code source. C'est pourquoi vous avez toujours besoin de Karma pour tester votre code JavaScript en premier.


maintenant est-ce que je voudrais lancer Rapporteur avec Karma ? Je peux sûrement les exécuter dans des fenêtres de terminal séparées, en parallèle. Je pourrais, en principe, leur faire partager des fichiers de test si j'en ai besoin, mais normalement je plutôt pas. Pourquoi? Parce que je veux garder mes tests petits avec un seul but dédié.

la seule exception serait un fichier définissant les macros de test utile pour les deux coureurs. Il ne s'agirait toutefois pas d'un fichier test , mais d'un fichier de macro définition .

sinon, j'aime une séparation claire entre mes tests. Ceux à courir fréquemment et vite, et ceux pour le complète des applications. Cela fait une séparation claire entre lors de l'utilisation Karma et quand Rapporteur .

73
répondu Dmitri Zaitsev 2016-05-15 02:45:18