Outils de test unitaire JavaScript pour TDD


716

J'ai examiné et examiné de nombreux tests unitaires JavaScript et outils de test, mais je n'ai pas pu trouver une option appropriée pour rester entièrement conforme à TDD. Existe-t-il donc un outil de test unitaire JavaScript entièrement compatible TDD?

Réponses:


1506

Karma ou rapporteur

Karma est un exécuteur de test JavaScript construit avec Node.js et destiné aux tests unitaires.

Le rapporteur est destiné aux tests de bout en bout et utilise Selenium Web Driver pour effectuer des tests.

Les deux ont été réalisés par l'équipe Angular. Vous pouvez utiliser n'importe quelle bibliothèque d'assertions de votre choix avec l'un ou l'autre.

Screencast: Karma Mise en route

liés :

avantages :

  • Utilise node.js, donc compatible avec Win / OS X / Linux
  • Exécutez des tests à partir d'un navigateur ou sans tête avec PhantomJS
  • Exécuter sur plusieurs clients à la fois
  • Option pour lancer, capturer et arrêter automatiquement les navigateurs
  • Option pour exécuter le serveur / clients sur un ordinateur de développement ou séparément
  • Exécuter des tests à partir d'une ligne de commande (peut être intégré à ant / maven)
  • Écrire des tests de style xUnit ou BDD
  • Prend en charge plusieurs cadres de test JavaScript
  • Tests d'exécution automatique lors de l'enregistrement
  • Les proxys demandent un cross-domaine
  • Possible de personnaliser:
    • Étendez-le pour envelopper d'autres cadres de test (Jasmine, Mocha, QUnit intégré)
    • Vos propres affirmations / réfutes
    • Reporters
    • Lanceurs de navigateur
  • Plugin pour WebStorm
  • Pris en charge par Netbeans IDE

Inconvénients :

mocha.js

Je ne suis absolument pas qualifié pour commenter les caractéristiques, les forces et les faiblesses de mocha.js, mais il m'a été simplement recommandé par quelqu'un en qui j'ai confiance dans la communauté JS.

Liste des fonctionnalités, telles que rapportées par son site Web:

  • prise en charge du navigateur
  • support asynchrone simple, y compris les promesses
  • rapports sur la couverture des tests
  • prise en charge des différences de chaîne
  • API javascript # pour exécuter des tests
  • état de sortie approprié pour le support CI, etc.
  • détecte et désactive automatiquement la coloration pour les non-ttys
  • mappe les exceptions non capturées au cas de test correct
  • prise en charge du délai d'expiration du test asynchrone
  • délais d'expiration spécifiques aux tests
  • support de notification de grognement
  • signale les durées des tests
  • met en évidence les tests lents
  • prise en charge de l'observateur de fichiers
  • détection de fuite variable globale
  • exécuter éventuellement des tests qui correspondent à une expression rationnelle
  • sortie automatique pour empêcher le "blocage" avec une boucle active
  • suites et scénarios de test facilement méta-générés
  • Prise en charge du fichier mocha.opts
  • titres de suite cliquables pour filtrer l'exécution des tests
  • prise en charge du débogueur de noeud
  • détecte plusieurs appels à done ()
  • utilisez la bibliothèque d'assertions que vous souhaitez
  • rapports extensibles, groupés avec plus de 9 journalistes
  • DSL de test extensibles ou "interfaces"
  • avant, après, avant chaque, après chaque crochet
  • prise en charge arbitraire des transpilateurs (café-script, etc.)
  • Pack TextMate

yolpo

yolpo

Cela n'existe plus, redirige vers sequential.js à la place

Yolpo est un outil pour visualiser l'exécution de javascript. Les développeurs d'API Javascript sont encouragés à écrire leurs cas d'utilisation pour afficher et expliquer leur API. Ces cas d'utilisation constituent la base des tests de régression.

AVA

Logo AVA

Testeur futuriste avec support intégré pour ES2015. Même si JavaScript est monothread, les E / S dans Node.js peuvent se produire en parallèle en raison de sa nature asynchrone. AVA en profite et exécute vos tests simultanément, ce qui est particulièrement bénéfique pour les tests IO lourds. De plus, les fichiers de test sont exécutés en parallèle en tant que processus séparés, vous offrant des performances encore meilleures et un environnement isolé pour chaque fichier de test.

  • Minimal et rapide
  • Syntaxe de test simple
  • Exécute les tests simultanément
  • Impose l'écriture de tests atomiques
  • Aucun global implicite
  • Environnement isolé pour chaque fichier de test
  • Écrivez vos tests dans ES2015
  • Promesse de soutien
  • Prise en charge de la fonction de générateur
  • Prise en charge de la fonction asynchrone
  • Support observable
  • Affirmations améliorées
  • Sortie TAP en option
  • Nettoyer les traces de pile

Buster.js

Un exécuteur de test JavaScript construit avec Node.js. Très modulaire et flexible. Il est livré avec sa propre bibliothèque d'assertions, mais vous pouvez ajouter la vôtre si vous le souhaitez. La bibliothèque d'assertions est découplée, vous pouvez donc également l'utiliser avec d'autres exécuteurs de test. Au lieu d'utiliser assert(!...)ou expect(...).not..., il utilise refute(...)ce qui est une belle humeur de torsion.

Une boîte à outils de test JavaScript pour navigateur. Il fait des tests de navigateur avec l'automatisation du navigateur (pensez JsTestDriver), des tests de page HTML statique de style QUnit, des tests dans des navigateurs sans tête (PhantomJS, jsdom, ...), et plus encore. Jetez un œil à l'aperçu !

Une boîte à outils de test Node.js. Vous obtenez la même bibliothèque de cas de test, la bibliothèque d'assertions, etc. Ceci est également idéal pour le navigateur hybride et le code Node.js. Écrivez votre cas de test avec Buster.JS et exécutez-le à la fois dans Node.js et dans un vrai navigateur.

Screencast: Buster.js Mise en route (2:45)

avantages :

  • Utilise node.js, donc compatible avec Win / OS X / Linux
  • Exécutez des tests à partir d'un navigateur ou sans tête avec PhantomJS (bientôt)
  • Exécuter sur plusieurs clients à la fois
  • Prend en charge les tests NodeJS
  • Pas besoin d'exécuter le serveur / clients sur l'ordinateur de développement (pas besoin d'IE)
  • Exécuter des tests à partir d'une ligne de commande (peut être intégré à ant / maven)
  • Écrire des tests de style xUnit ou BDD
  • Prend en charge plusieurs cadres de test JavaScript
  • Différer les tests au lieu de les commenter
  • SinonJS intégré
  • Tests d'exécution automatique lors de l'enregistrement
  • Les proxys demandent un cross-domaine
  • Possible de personnaliser:
    • Étendez-le pour envelopper d'autres cadres de test (JsTestDriver intégré)
    • Vos propres affirmations / réfutes
    • Reporters (xUnit XML, points traditionnels, spécification, tap, TeamCity et plus intégré)
    • Personnaliser / remplacer le code HTML utilisé pour exécuter les tests de navigateur
  • Intégration TextMate et Emacs

Inconvénients :

  • Stil en version bêta peut donc être bogué
  • Pas encore de plugin pour Eclipse / IntelliJ
  • Ne regroupe pas les résultats par os / navigateur / version comme TestSwarm *. Il imprime cependant le nom et la version du navigateur dans les résultats du test.
  • Aucun historique des résultats de test précédents comme TestSwarm *
  • Ne fonctionne pas entièrement sur les fenêtres en mai 2014

* TestSwarm est également un serveur d'intégration continue, tandis que vous avez besoin d'un serveur CI distinct pour Buster.js. Cependant, il génère des rapports XML xUnit, il devrait donc être facile à intégrer avec Hudson , Bamboo ou d'autres serveurs CI.

TestSwarm

https://github.com/jquery/testswarm

TestSwarm n'est officiellement plus en développement actif, comme indiqué sur leur page Web GitHub. Ils recommandent Karma, Browserstack-runner ou Intern.

Jasmin

Jasmin

Il s'agit d'un framework basé sur le comportement (comme indiqué dans la citation ci-dessous) qui pourrait intéresser les développeurs familiers avec Ruby ou Ruby on Rails. La syntaxe est basée sur RSpec qui est utilisé pour les tests dans les projets Rails.

Les spécifications Jasmine peuvent être exécutées à partir d'une page html (en mode qUnit) ou à partir d'un lanceur de test (comme Karma).

Jasmine est un cadre de développement axé sur le comportement pour tester votre code JavaScript. Cela ne dépend d'aucun autre framework JavaScript. Il ne nécessite pas de DOM.

Si vous avez de l'expérience avec ce cadre de test, veuillez contribuer avec plus d'informations :)

Accueil du projet: http://jasmine.github.io/

QUnit

QUnit se concentre sur le test de JavaScript dans le navigateur tout en offrant le plus de confort possible au développeur. Texte de présentation du site:

QUnit est une suite de tests unitaires JavaScript puissante et facile à utiliser. Il est utilisé par les projets jQuery, jQuery UI et jQuery Mobile et est capable de tester n'importe quel code JavaScript générique

QUnit partage un peu d'histoire avec TestSwarm (ci-dessus):

QUnit a été initialement développé par John Resig dans le cadre de jQuery. En 2008, il a obtenu sa propre documentation, son nom et son API, permettant à d'autres de l'utiliser également pour leurs tests unitaires. À l'époque, cela dépendait encore de jQuery. Une réécriture en 2009 a corrigé cela, maintenant QUnit fonctionne complètement de manière autonome. Les méthodes d'assertion de QUnit suivent la spécification CommonJS Unit Testing, qui était dans une certaine mesure influencée par QUnit.

Accueil du projet: http://qunitjs.com/

Sinon

Sinon.js est un autre excellent outil de Christian Johansen, l'auteur de Test-Driven JavaScript Development . Mieux décrit par lui-même:

Test d'espions, de talons et de simulateurs autonomes pour JavaScript. Aucune dépendance ne fonctionne avec n'importe quel framework de test unitaire.

Interne

Le site Web du stagiaire fournit une comparaison directe des fonctionnalités avec les autres cadres de test de cette liste. Il offre plus de fonctionnalités prêtes à l'emploi que tout autre système de test basé sur JavaScript.

PLAISANTER

Un cadre de test nouveau mais pourtant très puissant. Il permet également des tests basés sur des instantanés, ce qui augmente la vitesse des tests et crée une nouvelle dynamique en termes de tests.

Découvrez l'une de leurs conférences: https://www.youtube.com/watch?v=cAKYQpTC7MA

Mieux encore: pour commencer


2
Jasmine peut fonctionner sans tête à l'aide de V8, mais vous pouvez également l'utiliser de manière interactive. Bien que le DOM ne soit pas nécessaire par rapport à Jasmine, votre base de code peut accéder au DOM. Avec la discipline, il est possible d'éliminer, de protéger les conditions ou de fournir des simulations pour les parties du code qui accèdent au DOM et exécutent des tests complètement en dehors des appareils HTML. Vous pouvez également obtenir un support et des appareils en ligne de commande à l'aide de modules complémentaires.
jerseyboy

2
@ rehevkor5: Selenium est destiné aux tests d'intégration, tandis que les outils ici sont destinés aux tests unitaires. typemock.com/unit-tests-integration-tests
gregers

26
Presque tous les lanceurs de tests s'appuient sur un navigateur. Wtf, est-ce que personne ne fait jamais de tests unitaires uniquement côté serveur ????

2
Ne serait-il pas préférable de diviser / diviser chaque alternative en différentes réponses? Cela pourrait invalider les votes actuels sur celui-ci, mais je pense que cela aurait le plus de sens.
cregox

2
@Raisen Vous pouvez brancher ES 2015 dans la plupart d'entre eux avec Babel , mais AVA par Sindre Sorhus l'a intégré.
gregers

64

Jetez un coup d'œil au cadre de test unitaire Dojo Object Harness (DOH) qui est à peu près indépendant du cadre pour les tests unitaires JavaScript et n'a aucune dépendance Dojo. Il existe une très bonne description de celui-ci dans Unit testing Web 2.0 applications using the Dojo Objective Harness .

Si vous souhaitez automatiser les tests d'interface utilisateur (un point sensible de nombreux développeurs) - consultez doh.robot (mise à jour temporaire. Mise à jour: autre lien http://dojotoolkit.org/reference-guide/util/dohrobot.html ) et dijit .robotx ( arrêt temporaire) . Ce dernier est conçu pour un test d'acceptation. Mise à jour:

Les articles référencés expliquent comment les utiliser, comment émuler un utilisateur interagissant avec votre interface utilisateur à l'aide de la souris et / ou du clavier et comment enregistrer une session de test, afin que vous puissiez la "jouer" plus tard automatiquement.


Merci pour la suggestion du Dojo Object Harness, je ne l'aurais jamais trouvé. J'apprécie les autres suggestions - mais une étape à la fois.
Mark Levison

Je l'ai utilisé dans un projet précédent et je l'ai trouvé inestimable. Mais là encore, je ne peux pas comparer - je n'ai utilisé aucun autre framework TDD.
Rakesh Pai,

Merci d'avoir signalé des liens morts. J'ai mis à jour l'un d'entre eux et je remplacerai les liens vers les documents des robots dès qu'ils seront sur un nouveau site Web.
Eugene Lazutkin

Une chose que je n'aime pas avec DOH est que les numéros de ligne ne sont pas signalés lorsque les assertions échouent. Les commenter manuellement et relancer le test fonctionne.
Aram Kocharyan

Dojo remplace DOH par le framework de test TheIntern. TheIntern est très puissant et a des améliorations substantielles. sitepen.com/blog/2014/02/18/…
user64141

34

Chutzpah - Un lanceur de test JavaScript

J'ai créé un projet open source appelé Chutzpah qui est un lanceur de test pour les tests unitaires JavaScript. Chutzpah vous permet d'exécuter des tests unitaires JavaScript à partir de la ligne de commande et de l'intérieur de Visual Studio. Il prend également en charge l'exécution sur le serveur d'intégration continue TeamCity.


7
Je viens de commencer à utiliser Chutzpah pour exécuter des tests Jasmine dans Visual Studio - il est bien intégré: faites un clic droit dans le fichier de test et choisissez `` exécuter les tests Js '' ou `` exécuter les tests JS dans le navigateur ''. J'exécute les mêmes tests de jasmin en utilisant JSTestDriver. Je préfère Chutzpah car je spécifie les fichiers dont je dépend en étant chargés en haut du fichier de test. Pour JSTestDriver, j'ai besoin d'un fichier de configuration distinct.
GarethOwen


14

BusterJS

Il y a aussi BusterJS de Christian Johansen, l'auteur de Test Driven Javascript Development et du framework Sinon. Depuis le site:

Buster.JS est un nouveau framework de test JavaScript. Il effectue des tests de navigateur en automatisant les exécutions de test dans les navigateurs réels (pensez JsTestDriver), ainsi que les tests Node.js.


10

google-js-test:

Cadre de test JavaScript publié par Google: https://github.com/google/gjstest

  • Temps de démarrage et d'exécution des tests extrêmement rapide, sans avoir à exécuter un navigateur.
  • Sortie propre et lisible en cas de réussite ou d'échec des tests.
  • Un lanceur de test basé sur un navigateur qui peut simplement être actualisé chaque fois que JS est modifié.
  • Style et sémantique qui ressemblent à Google Test pour C ++.
  • Un framework de simulation intégré qui nécessite un code passe-partout minimal (par exemple, non $tearDownou $verifyAll) avec un style et une sémantique basés sur le framework de simulation Google C ++ .

Il n'y a actuellement aucun binaire pour Windows


1
Il semble avoir un intérêt presque nul sur Github, il nécessite également un système d'exploitation basé sur Unix, et je suis un grand fan de Windows, je ne quitte pas ma maison sans embrasser ma machine Windows au revoir.
vsync

8

Nous utilisons maintenant Qunit avec Pavlov et JSTestDriver tous ensemble. Cette approche fonctionne bien pour nous.

QUnit

Pavlov , source

jsTestDriver , source


Souhaitez-vous expliquer quel est le rôle de chacun d'eux dans l'ensemble du processus de test et comment ils se connectent les uns aux autres?
vsync

Désolé, il y a longtemps et il y a eu de nombreux emplois sous contrat pour rappeler les détails à ce sujet.
Tom Stickel

6

Vous avez "tourne sur un navigateur réel" en tant que pro, mais d'après mon expérience, c'est un inconvénient car il est lent. Mais ce qui le rend précieux, c'est le manque d'émulation JS suffisante des alternatives sans navigateur. Il se peut que si votre JS est suffisamment complexe, seul un test dans le navigateur suffira, mais il y a quelques autres options à considérer:

HtmlUnit : "Il a une assez bonne prise en charge JavaScript (qui s'améliore constamment) et est capable de fonctionner même avec des bibliothèques AJAX assez complexes, simulant Firefox ou Internet Explorer selon la configuration que vous souhaitez utiliser." Si son émulation est suffisamment bonne pour votre utilisation, elle sera beaucoup plus rapide que de piloter un navigateur.

Mais peut-être que HtmlUnit a un support JS assez bon mais vous n'aimez pas Java? Alors peut-être:

Celerity : API Watir fonctionnant sur JRuby soutenu par HtmlUnit.

ou similaire

Schnell : un autre wrapper JRuby de HtmlUnit.

Bien sûr, si HtmlUnit n'est pas assez bon et que vous devez conduire un navigateur, vous pouvez envisager Watir pour piloter votre JS .



3

Vous pourriez également être intéressé par le framework de tests unitaires qui fait partie de qooxdoo , un framework RIA open source similaire à Dojo, ExtJS, etc. mais avec une chaîne d'outils assez complète.

Essayez la version en ligne du testrunner . Astuce: appuyez sur la flèche grise en haut à gauche (devrait être rendue plus évidente). C'est un bouton "play" qui exécute les tests sélectionnés.

Pour en savoir plus sur les classes JS qui vous permettent de définir vos tests unitaires, consultez la visionneuse d'API en ligne .

Pour les tests d'interface utilisateur automatisés (basés sur Selenium RC), consultez le projet Simulator .



3

Nous avons ajouté l'intégration JUnit à notre générateur de code Java vers Javascript ST-JS ( http://st-js.org ). Le framework génère du Javascript correspondant pour le code testé et les tests unitaires et envoie le code à différents navigateurs.

Il n'est pas nécessaire d'avoir un serveur séparé car le lanceur de tests unitaires ouvre le port http requis (et le ferme une fois les tests terminés). Le framework manipule la trace de pile Java afin que les assertions ayant échoué soient correctement affichées par le plugin JUnit Eclipse. Voici un exemple simple avec jQuery et Mockjax:

@RunWith(STJSTestDriverRunner.class)
@HTMLFixture("<div id='fortune'></div>")

@Scripts({ "classpath://jquery.js",
       "classpath://jquery.mockjax.js", "classpath://json2.js" })
public class MockjaxExampleTest {
  @Test
  public void myTest() {
    $.ajaxSetup($map("async", false));
    $.mockjax(new MockjaxOptions() {
      {
        url = "/restful/fortune";
        responseText = new Fortune() {
          {
            status = "success";
            fortune = "Are you a turtle?";
          }
        };
      }
    });

    $.getJSON("/restful/fortune", null, new Callback3<Fortune, String, JQueryXHR>() {
      @Override
      public void $invoke(Fortune response, String p2, JQueryXHR p3) {
        if (response.status.equals("success")) {
          $("#fortune").html("Your fortune is: " + response.fortune);
        } else {
          $("#fortune").html("Things do not look good, no fortune was told");
        }

      }
    });
    assertEquals("Your fortune is: Are you a turtle?", $("#fortune").html());
  }

  private static class Fortune {
    public String status;
    public String fortune;
  }
}

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.