2017-10-02 10 views
1

J'ai un ensemble de tests unitaires Jasmine que je lance sur mon serveur de build. J'ai réussi à faire en sorte que Karma fonctionne bien, de sorte que mes tests s'exécutent automatiquement sur Chrome, Edge et Firefox chaque fois que je pousse dans ma branche de développement. Cependant, je suis préoccupé par le fait que mes tests ne sont pas indépendants car une grande partie de l'état du navigateur (tel que le JS global, le DOM et le stockage local) persiste entre les tests. Dans certains cas, je trouve que cela permet aux tests de passer en raison des actions des tests précédents, ce qui me semble être une mauvaise pratique. Ce que je voudrais faire, c'est forcer le navigateur à être redémarré entre chaque test, créant ainsi un nouvel environnement de test indépendant. Est-ce possible?Comment puis-je forcer Karma à redémarrer le navigateur entre chaque test?

Répondre

1

Je ne pense pas que Karma supporte le redémarrage du navigateur entre les tests. Il y aurait plusieurs obstacles à surmonter:

  1. Pour faire ce que vous voulez, Karma devrait enregistrer l'état du coureur de test après un test est effectué, redémarrez le navigateur, puis appeler le coureur de test dans le nouveau navigateur d'une manière qui lui permet de savoir quel test est le suivant. AFAIK, Karma n'a pas la machinerie pour cela. Je ne suis pas très familier avec Jasmine, mais je ne pense pas que cela supporte ça non plus.

  2. Il nuirait à la sémantique du code de configuration et de démontage. Si vous utilisez un hook beforeAll, que doit faire le testeur lorsqu'il exécute un test dans la seconde instance du navigateur?

    A. Il ne fonctionne pas à nouveau le beforeAll. S'il est responsable de l'initialisation du DOM en ajoutant des éléments, par exemple, cette initialisation ne se fait pas. Ce n'est pas viable.

    B. Il exécute à nouveau le beforeAll, qui le transforme efficacement en beforeEach. Que cela cause ou non des problèmes dépend de votre projet. Un peu de code est mis dans un beforeAll au lieu de beforeEach parce qu'il est plutôt coûteux à courir, tournant beforeAll en beforeEach peut être très coûteux.

Et il reste la question que le redémarrage du navigateur est en soi, une opération coûteuse et ralentirait considérablement la suite.

J'ai rencontré des cas où j'aurais aimé un nouveau navigateur. Je travaille autour de la question par:

  1. Chargement du code en cours de test dans un iframe. Cela crée un nouvel objet Window afin que vous puissiez isoler les données spécifiques Window. Je l'ai utilisé, par exemple, pour tester le code qui mess avec onerror ou onbeforeunload.

  2. J'ai utilisé l'API fournie par le DOM pour nettoyer entre mes tests. Par exemple, je me suis assuré que les tests qui testent le code en utilisant localStorage ne sont pas affectés par d'autres tests en effaçant localStorage entre les tests.

Je n'ai pas encore à courir dans un cas où il n'y a pas de solution autre que démarrer une nouvelle instance du navigateur.

+0

Ceci est une réponse très perspicace, merci! – jazzbassrob