Que faut-il tester en Javascript?


12

Au travail, nous venons de commencer sur une application fortement basée sur Javascript (utilisant en fait Coffeescript, mais toujours), dont j'ai implémenté un système de test automatisé utilisant JsTestDriver et fabric.

Nous n'avons jamais écrit quelque chose avec autant de Javascript, donc jusqu'à présent nous n'avons jamais fait de test Javascript. Je ne sais pas exactement ce que nous devrions tester dans nos tests unitaires. Nous avons écrit des plugins JQuery pour diverses choses, il est donc évident qu'ils doivent être vérifiés autant que possible avec JsTestDriver, mais tout le monde dans mon équipe semble penser que nous devrions également tester le Javascript au niveau de la page.

Je ne pense pas que nous devrions tester Javascript au niveau de la page en tant que tests unitaires, mais plutôt utiliser un système comme Selenium pour vérifier que tout fonctionne comme prévu. Mon raisonnement principal est que pour le moment, les tests Javascript au niveau de la page sont garantis comme échouant via JsTestDriver, car ils essaient d'accéder à des éléments sur le DOM qui ne peuvent pas exister.

Alors, qu'est-ce qui devrait être testé en Javascript?


3
Vous isolez tout code javascript que vous avez écrit dans les modules. Ensuite, vous testez simplement les entrées et sorties de ces modules. Tous les modules qui traitent du DOM signifient que vous devez tester le DOM. Utilisez un meilleur outil que jsTestDriver.
Raynos

Vous devez tester la logique métier de l'unité. Si votre logique métier et les éléments du DOM sont entrelacés, vous avez un défaut de conception. Extrayez autant de logique métier que possible des éléments de la page afin qu'elle puisse être testée correctement. Pour la vérification de l'interaction des éléments DOM, vous devez utiliser Selenium.
maple_shaft

1
@NathanHoad Vous écrivez des tests unitaires qui s'exécutent dans le navigateur lui-même, nodeunit, qunit et jasmine sont des outils sensés. Lorsque vous exécutez dans le navigateur, vous avez le DOM. Vous pouvez utiliser un outil comme testling pour automatiser les tests du navigateur.
Raynos

1
Merci. Je regardais vers jsTestDriver car il prétendait pouvoir s'exécuter dans le navigateur, ce qui, bien que techniquement vrai, ai découvert que ce n'est pas la même chose que courir avec QUnit. Je travaille actuellement sur mon propre outil qui utilise QUnit, avec un panneau de barre d'outils de débogage Django personnalisé. En utilisant Selenium, je serai en mesure de détecter les tests ayant échoué. De plus, je doute que mon patron paie pour des testlings, même si ça a l'air plutôt bien!
Nathan Hoad,

Réponses:


4

Testez tout ce que vous pouvez.

La logique pure peut être testée facilement.

Si votre code interagit avec le DOM ou le réseau, c'est beaucoup plus difficile.

Si vous pouvez extraire un morceau de code pour travailler sur un élément DOM arbitraire au lieu d'un élément spécifique, alors vous pouvez le tester plus facilement. (Faire fonctionner l'élément sur un paramètre).

Le code qui utilise Ajax peut être testé en appelant simplement la fonction de rappel avec des données fixes. J'ai eu quelques tests où j'ai écrasé $.ajaxavec ma propre fonction. Assurez-vous simplement de remettre le vrai lorsque vous avez terminé!

Ce que vous constaterez, c'est que «javascript au niveau de la page» signifie vraiment «code étroitement couplé» et si vous découplez les parties du code, vous pouvez les tester indépendamment.

(Le sélénium n'est pas un outil de test unitaire. Il est idéal pour les scénarios de haut niveau, mais vous ne pouvez pas le tester avec lui, et il ne fonctionne pas dans un environnement isolé.)


jasmine peut se moquer des appels de fonction et des données de réponse, vous pouvez vous en occuper au lieu de remplacer les fonctions.
Steve

Je dois préciser - nous avons des fonctions et autres sur chaque page. Je parlais plus de tester le code qui s'exécute à l'intérieur $(document).ready(...).
Nathan Hoad

1
Tout ...dépend de sa taille . :-) Je pense que vous devriez pouvoir obtenir cela à une seule fonction nommée qui est également testée. Ensuite, votre code non testé est une seule ligne. (Maintenant, c'est un objectif, pas une donnée. Dans la pratique, j'ai toujours eu plus d'une ligne de code non testé.)
Sean McMillan

@SeanMcMillan - Je trouve qu'il est très difficile de tester des parties d'une application qui n'affecte que le DOM, par exemple, une fonction qui ne lie que plusieurs événements à certains éléments DOM. Comment vérifieriez-vous que ces événements ont été écrits correctement? pas quelque chose que les tests unitaires peuvent faire, mais de vrais clics et vérifications sur le navigateur (en utilisant du sélénium ou autre)
vsync

@vsync: Vous pouvez tester que, disons, un gestionnaire de clics a été attaché à un élément DOM donné assez facilement. Je ne pense pas qu'il soit possible de tester que 'click' est le bon gestionnaire, et que vous l'avez attaché au bon élément.
Sean McMillan

5

Algorithmes de test. Les parties étroitement liées à l'interface graphique dépendent plus d'un navigateur spécifique, elles doivent donc être testées à l'aide d'utilitaires de type sélénium.

Votre code, bien sûr, doit contenir des algorithmes en tant que morceaux de code isolés, sinon, les tests unitaires sont presque impossibles.

Les plugins jquery, btw, ne sont pas faciles à tester.


Tous les bons points! Je suis d'accord pour dire qu'ils ne sont pas facilement testables à l'unité également, selon la façon dont ils sont écrits.
Nathan Hoad,

-1

J'avais l'habitude de travailler avec Java et d'après ce que je vois, les tests unitaires Java sont plus faciles que les tests unitaires JavaScript car Java est plus rigide.

Je suis convaincu que le développement piloté par les tests est la meilleure chose, donc j'explore également comment tester unitaire JavaScript. En Java, j'ai simulé le code qui établissait la connexion à la base de données, les objets d'accès aux données, et je le compare au code en JavaScript qui modifie le DOM et au code qui fait des appels AJAX au serveur.

Ce que je veux dire, c'est qu'il me semble que ce qui devrait être testé est la logique de manière explicite. Par exemple, vous ne voulez pas passer un appel AJAX lorsque vous exécutez des tests unitaires parce que (a) vous avez besoin du serveur pour fonctionner et (b) il est lent et l'une des directives des tests unitaires est qu'il doit être super rapide pour que les développeurs n'évitent pas de les exécuter comme chaque minute.

Une autre directive consiste pour le processus d'intégration continue à envoyer un e-mail disant qu'il a trouvé un test unitaire qui a échoué.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.