JavaScript-Unit-Test-Tools für TDD

716

Ich habe viele JavaScript-Komponententests und Testtools untersucht und in Betracht gezogen, konnte jedoch keine geeignete Option finden, um vollständig TDD-konform zu bleiben. Gibt es ein JavaScript-Unit-Test-Tool, das vollständig TDD-kompatibel ist?

Mark Levison
quelle

Antworten:

1506

Karma oder Winkelmesser

Karma ist ein JavaScript-Testläufer, der mit Node.js erstellt wurde und für Unit-Tests gedacht ist.

Der Winkelmesser ist für End-to-End-Tests vorgesehen und verwendet Selenium Web Driver, um Tests durchzuführen.

Beide wurden vom Angular-Team hergestellt. Sie können jede beliebige Assertionsbibliothek verwenden.

Screencast: Karma Erste Schritte

Verwandte :

Profis :

  • Verwendet node.js, also kompatibel mit Win / OS X / Linux
  • Führen Sie Tests über einen Browser oder ohne Kopf mit PhantomJS aus
  • Auf mehreren Clients gleichzeitig ausführen
  • Option zum Starten, Erfassen und automatischen Herunterfahren von Browsern
  • Option zum Ausführen von Servern / Clients auf einem Entwicklungscomputer oder separat
  • Führen Sie Tests über eine Befehlszeile aus (kann in ant / maven integriert werden)
  • Schreiben Sie Tests im xUnit- oder BDD-Stil
  • Unterstützt mehrere JavaScript-Testframeworks
  • Tests beim Speichern automatisch ausführen
  • Proxies fordern domänenübergreifende Anfragen an
  • Mögliche Anpassung:
    • Erweitern Sie es, um andere Test-Frameworks zu verpacken (Jasmine, Mocha, QUnit integriert)
    • Ihre eigenen Behauptungen / Widerlegungen
    • Reporter
    • Browser-Starter
  • Plugin für WebStorm
  • Unterstützt von Netbeans IDE

Nachteile :

mocha.js

Ich bin völlig unqualifiziert, die Funktionen, Stärken und Schwächen von mocha.js zu kommentieren, aber es wurde mir nur von jemandem empfohlen, dem ich in der JS-Community vertraue.

Liste der von der Website gemeldeten Funktionen:

  • Browser-Unterstützung
  • einfache asynchrone Unterstützung, einschließlich Versprechen
  • Testberichterstattung
  • String Diff Unterstützung
  • Javascript # API zum Ausführen von Tests
  • ordnungsgemäßer Exit-Status für CI-Unterstützung usw.
  • Erkennt und deaktiviert das Färben für Nicht-Ttys automatisch
  • ordnet nicht erfasste Ausnahmen dem richtigen Testfall zu
  • Unterstützung für asynchrone Test-Timeouts
  • testspezifische Zeitüberschreitungen
  • Unterstützung für Knurrbenachrichtigungen
  • meldet Testdauer
  • hebt langsame Tests hervor
  • Unterstützung für Datei-Watcher
  • globale variable Lecksuche
  • Führen Sie optional Tests aus, die einem regulären Ausdruck entsprechen
  • Auto-Exit, um ein "Hängen" mit einer aktiven Schleife zu verhindern
  • Einfache Meta-Generierung von Suiten und Testfällen
  • Unterstützung für mocha.opts-Dateien
  • anklickbare Suite-Titel zum Filtern der Testausführung
  • Unterstützung für Node-Debugger
  • erkennt mehrere Aufrufe von done ()
  • Verwenden Sie eine beliebige Assertionsbibliothek
  • Erweiterbare Berichterstattung, gebündelt mit mehr als 9 Reportern
  • erweiterbare Test-DSLs oder "Schnittstellen"
  • vor, nach, vor jedem, nach jedem Haken
  • Beliebige Transpiler-Unterstützung (Kaffee-Skript usw.)
  • TextMate-Bundle

yolpo

yolpo

Dies ist nicht mehr vorhanden und leitet stattdessen zu sequential.js weiter

Yolpo ist ein Tool zur Visualisierung der Ausführung von Javascript. Javascript-API-Entwickler werden aufgefordert, ihre Anwendungsfälle zu schreiben, um ihre API anzuzeigen und mitzuteilen. Solche Anwendungsfälle bilden die Grundlage für Regressionstests.

AVA

AVA-Logo

Futuristischer Testläufer mit integrierter Unterstützung für ES2015. Obwohl JavaScript Single-Threaded ist, kann IO in Node.js aufgrund seiner asynchronen Natur parallel erfolgen. AVA nutzt dies und führt Ihre Tests gleichzeitig aus, was besonders für schwere E / A-Tests von Vorteil ist. Darüber hinaus werden Testdateien parallel als separate Prozesse ausgeführt, wodurch Sie eine noch bessere Leistung und eine isolierte Umgebung für jede Testdatei erhalten.

  • Minimal und schnell
  • Einfache Testsyntax
  • Führt gleichzeitig Tests aus
  • Erzwingt das Schreiben von Atomtests
  • Keine impliziten Globalen
  • Isolierte Umgebung für jede Testdatei
  • Schreiben Sie Ihre Tests in ES2015
  • Versprechen Sie Unterstützung
  • Unterstützung der Generatorfunktion
  • Unterstützung für asynchrone Funktionen
  • Beobachtbare Unterstützung
  • Erweiterte Asserts
  • Optionale TAP-Ausgabe
  • Stapelspuren reinigen

Buster.js

Ein mit Node.js erstellter JavaScript-Testläufer. Sehr modular und flexibel. Es wird mit einer eigenen Assertionsbibliothek geliefert, aber Sie können Ihre eigene hinzufügen, wenn Sie möchten. Die Assertionsbibliothek ist entkoppelt, sodass Sie sie auch mit anderen Testläufern verwenden können. Anstatt assert(!...)oder zu verwenden expect(...).not..., verwendet es, refute(...)was eine schöne Wendung imho ist.

Ein Browser-JavaScript-Test-Toolkit. Es führt Browsertests mit Browser-Automatisierung (denken Sie an JsTestDriver), statische HTML-Seitentests im QUnit-Stil, Tests in kopflosen Browsern (PhantomJS, jsdom, ...) und mehr durch. Schauen Sie sich die Übersicht an !

Ein Node.js-Test-Toolkit. Sie erhalten dieselbe Testfallbibliothek, Assertionsbibliothek usw. Dies eignet sich auch hervorragend für Hybridbrowser und Node.js-Code. Schreiben Sie Ihren Testfall mit Buster.JS und führen Sie ihn sowohl in Node.js als auch in einem echten Browser aus.

Screencast: Buster.js Erste Schritte (2:45)

Profis :

  • Verwendet node.js, also kompatibel mit Win / OS X / Linux
  • Führen Sie Tests über einen Browser oder ohne Kopf mit PhantomJS durch (bald)
  • Auf mehreren Clients gleichzeitig ausführen
  • Unterstützt NodeJS-Tests
  • Server / Clients müssen nicht auf dem Entwicklungscomputer ausgeführt werden (IE ist nicht erforderlich)
  • Führen Sie Tests über eine Befehlszeile aus (kann in ant / maven integriert werden)
  • Schreiben Sie Tests im xUnit- oder BDD-Stil
  • Unterstützt mehrere JavaScript-Testframeworks
  • Verschieben Sie Tests, anstatt sie zu kommentieren
  • SinonJS eingebaut
  • Tests beim Speichern automatisch ausführen
  • Proxies fordern domänenübergreifende Anfragen an
  • Mögliche Anpassung:
    • Erweitern Sie es, um andere Test-Frameworks zu verpacken (JsTestDriver integriert)
    • Ihre eigenen Behauptungen / Widerlegungen
    • Reporter (xUnit XML, traditionelle Punkte, Spezifikation, Tap, TeamCity und mehr integrierte Funktionen)
    • Passen Sie den HTML-Code an, mit dem die Browsertests ausgeführt werden
  • Integration von TextMate und Emacs

Nachteile :

  • Stil in der Beta kann also fehlerhaft sein
  • Noch kein Plugin für Eclipse / IntelliJ)
  • Gruppiert Ergebnisse nicht nach Betriebssystem / Browser / Version wie TestSwarm *. Der Browsername und die Version werden jedoch in den Testergebnissen ausgedruckt.
  • Keine Historie früherer Testergebnisse wie TestSwarm *
  • Funktioniert unter Windows ab Mai 2014 nicht vollständig

* TestSwarm ist auch ein Continuous Integration-Server, während Sie für Buster.js einen separaten CI-Server benötigen. Es werden jedoch xUnit-XML-Berichte ausgegeben, sodass die Integration in Hudson- , Bamboo- oder andere CI-Server einfach sein sollte .

TestSwarm

https://github.com/jquery/testswarm

TestSwarm befindet sich offiziell nicht mehr in der aktiven Entwicklung, wie auf der GitHub-Webseite angegeben. Sie empfehlen Karma, Browserstack-Runner oder Intern.

Jasmin

Jasmin

Dies ist ein verhaltensgesteuertes Framework (wie im folgenden Zitat angegeben), das Entwickler interessieren könnte, die mit Ruby oder Ruby on Rails vertraut sind. Die Syntax basiert auf RSpec , die zum Testen in Rails-Projekten verwendet werden.

Jasmine-Spezifikationen können von einer HTML-Seite (in qUnit-Manier) oder von einem Testläufer (als Karma) ausgeführt werden.

Jasmine ist ein verhaltensgesteuertes Entwicklungsframework zum Testen Ihres JavaScript-Codes. Es hängt nicht von anderen JavaScript-Frameworks ab. Es ist kein DOM erforderlich.

Wenn Sie Erfahrung mit diesem Test-Framework haben, tragen Sie bitte mit weiteren Informationen bei :)

Projekthaus: http://jasmine.github.io/

QUnit

QUnit konzentriert sich darauf, JavaScript im Browser zu testen und dem Entwickler so viel Komfort wie möglich zu bieten. Klappentext von der Website:

QUnit ist eine leistungsstarke, benutzerfreundliche JavaScript-Unit-Test-Suite. Es wird von den Projekten jQuery, jQuery UI und jQuery Mobile verwendet und kann jeden generischen JavaScript-Code testen

QUnit teilt einige Geschichte mit TestSwarm (oben):

QUnit wurde ursprünglich von John Resig als Teil von jQuery entwickelt. Im Jahr 2008 erhielt es eine eigene Haus-, Namens- und API-Dokumentation, die es anderen ermöglichte, sie auch für Unit-Tests zu verwenden. Zu der Zeit hing es noch von jQuery ab. Eine Neufassung im Jahr 2009 hat behoben, dass QUnit jetzt vollständig eigenständig ausgeführt wird. Die Assertionsmethoden von QUnit folgen der CommonJS Unit Testing-Spezifikation, die zu einem gewissen Grad von QUnit beeinflusst wurde.

Projekthaus: http://qunitjs.com/

Sinon

Ein weiteres großartiges Tool ist sinon.js von Christian Johansen, dem Autor von Test-Driven JavaScript Development . Am besten von sich selbst beschrieben:

Standalone-Testspione, Stubs und Mocks für JavaScript. Keine Abhängigkeiten funktionieren mit einem Unit-Test-Framework.

Praktikant

Die Intern-Website bietet einen direkten Funktionsvergleich mit den anderen Testframeworks in dieser Liste. Es bietet mehr Funktionen als jedes andere JavaScript-basierte Testsystem.

SCHERZ

Ein neues, aber sehr leistungsfähiges Test-Framework. Es ermöglicht auch Snapshot-basierte Tests. Dies erhöht die Testgeschwindigkeit und erzeugt eine neue Dynamik beim Testen

Schauen Sie sich einen ihrer Vorträge an: https://www.youtube.com/watch?v=cAKYQpTC7MA

Besser noch: Erste Schritte

gregers
quelle
2
Jasmine kann mit V8 kopflos arbeiten, aber Sie können es auch interaktiv verwenden. Während das DOM in Bezug auf Jasmine nicht erforderlich ist, greift Ihre Codebasis möglicherweise auf das DOM zu. Mit Disziplin ist es möglich, Teile des Codes, die auf das DOM zugreifen und Tests vollständig unabhängig von HTML-Fixtures ausführen, zu eliminieren, mit Bedingungen zu schützen oder Verspottungen bereitzustellen. Sie können auch Befehlszeilenunterstützung und Fixtures mithilfe von Add-Ons erhalten.
Jerseyboy
2
@ rehevkor5: Selen dient zum Testen der Integration, während die Tools hier zum Testen von Einheiten dienen. typemock.com/unit-tests-integration-tests
gregers
26
Fast jeder einzelne Testläufer ist auf einen Browser angewiesen. Wtf, führt niemand jemals Unit-Tests nur auf der Serverseite durch ?
2
Wäre es nicht besser, jede Alternative in unterschiedliche Antworten aufzuteilen? Es könnte die aktuellen Abstimmungen in diesem Fall ungültig machen, aber ich denke, es wäre am sinnvollsten.
Cregox
2
@ Raisen Sie können ES 2015 mit Babel an die meisten von ihnen anschließen , aber AVA von Sindre Sorhus hat es eingebaut.
Gregers
64

Werfen Sie einen Blick auf das DOJ-Unit-Test-Framework (Dojo Object Harness), das für JavaScript-Unit-Tests weitgehend rahmenunabhängig ist und keine Dojo-Abhängigkeiten aufweist. Eine ausführliche Beschreibung finden Sie unter Testen von Web 2.0-Anwendungen mit dem Dojo Objective Harness .

Wenn Sie die UI-Tests automatisieren möchten (ein wunder Punkt vieler Entwickler), lesen Sie doh.robot (vorübergehend heruntergefahren. Update: anderer Link http://dojotoolkit.org/reference-guide/util/dohrobot.html ) und dijit .robotx (vorübergehend ausgefallen ) . Letzteres ist für eine Abnahmeprüfung vorgesehen. Aktualisieren:

In Artikeln, auf die verwiesen wird, wird erläutert, wie Sie sie verwenden, wie Sie einen Benutzer emulieren, der mit Ihrer Benutzeroberfläche über Maus und / oder Tastatur interagiert, und wie Sie eine Testsitzung aufzeichnen, damit Sie sie später automatisch "abspielen" können.

Eugene Lazutkin
quelle
Vielen Dank für den Vorschlag von Dojo Object Harness, ich hätte ihn nie gefunden. Ich schätze die anderen Vorschläge - aber Schritt für Schritt.
Mark Levison
Ich habe dies tatsächlich in einem früheren Projekt verwendet und fand es von unschätzbarem Wert. Aber andererseits kann ich nicht vergleichen - habe kein anderes TDD-Framework verwendet.
Rakesh Pai
Vielen Dank, dass Sie tote Links gemeldet haben. Ich habe eine davon aktualisiert und werde Links zu Roboterdokumenten ersetzen, sobald sie auf einer neuen Website verfügbar sind.
Eugene Lazutkin
Eine Sache, die ich an DOH nicht mag, ist, dass Zeilennummern nicht gemeldet werden, wenn Behauptungen fehlschlagen. Manuelles Auskommentieren und erneutes Ausführen des Tests funktioniert.
Aram Kocharyan
Dojo ersetzt DOH durch das TheIntern-Testframework. TheIntern ist sehr leistungsfähig und hat wesentliche Verbesserungen. sitepen.com/blog/2014/02/18/…
user64141
34

Chutzpah - Ein JavaScript-Testläufer

Ich habe ein Open-Source-Projekt namens Chutzpah erstellt, das ein Testläufer für JavaScript-Unit-Tests ist. Mit Chutzpah können Sie JavaScript-Komponententests über die Befehlszeile und innerhalb von Visual Studio ausführen. Es unterstützt auch die Ausführung auf dem TeamCity Continuous Integration Server.

Matthew Manela
quelle
7
Ich habe gerade angefangen, Chutzpah zu verwenden, um Jasmin-Tests in Visual Studio auszuführen - es ist gut integriert: Klicken Sie mit der rechten Maustaste in die Testdatei und wählen Sie "JS-Tests ausführen" oder "JS-Tests im Browser ausführen". Ich führe die gleichen Jasmin-Tests mit JSTestDriver durch. Ich bevorzuge Chutzpah, weil ich spezifiziere, von welchen Dateien ich abhängig bin, dass sie oben in der Testdatei geladen werden. Für JSTestDriver benötige ich eine separate Konfigurationsdatei.
GarethOwen
26

Der JavaScript-Abschnitt des Wikipedia-Eintrags " Liste der Unit Testing Frameworks" enthält eine Liste der verfügbaren Optionen. Es gibt an, ob sie clientseitig, serverseitig oder beides arbeiten.

Pete TerMaat
quelle
14

BusterJS

Es gibt auch BusterJS von Christian Johansen, dem Autor von Test Driven Javascript Development und dem Sinon Framework. Von der Website:

Buster.JS ist ein neues JavaScript-Testframework. Es führt Browsertests durch, indem Testläufe in tatsächlichen Browsern (denken Sie an JsTestDriver) sowie Node.js-Tests automatisiert werden.

Tauren
quelle
10

google-js-test:

Von Google veröffentlichtes JavaScript-Testframework: https://github.com/google/gjstest

  • Extrem schnelle Start- und Ausführungszeit für Tests, ohne dass ein Browser ausgeführt werden muss.
  • Saubere, lesbare Ausgabe bei bestandenen und nicht bestandenen Tests.
  • Ein browserbasierter Testläufer , der bei jeder JS-Änderung einfach aktualisiert werden kann.
  • Stil und Semantik, die Google Test für C ++ ähneln .
  • Ein integriertes Mocking-Framework, das nur minimalen Boilerplate-Code (z. B. no $tearDownor $verifyAll) mit Stil und Semantik erfordert, der auf dem Google C ++ Mocking Framework basiert .

Derzeit gibt es keine Binärdateien für Windows

Benutzer
quelle
1
Es scheint fast kein Interesse an Github zu haben, außerdem erfordert es ein Unix-Basis-Betriebssystem, und ich bin ein großer Windows-Fan. Ich verlasse mein Haus nicht, ohne meine Windows-Maschine zum Abschied zu küssen.
vsync
8

Wir verwenden Qunit jetzt zusammen mit Pavlov und JSTestDriver. Dieser Ansatz funktioniert gut für uns.

QUnit

Pawlow , Quelle

jsTestDriver , Quelle

Tom Stickel
quelle
Möchten Sie erklären, welche Rolle diese im gesamten Testprozess spielen und wie sie sich miteinander verbinden?
vsync
Es tut uns leid, dass es lange Zeit und viele Vertragsjobs her ist, um die Details dazu abzurufen.
Tom Stickel
6

Sie haben als Profi "läuft auf aktuellem Browser", aber meiner Erfahrung nach ist das ein Nachteil, weil es langsam ist. Was es jedoch wertvoll macht, ist das Fehlen einer ausreichenden JS-Emulation durch die Nicht-Browser-Alternativen. Es kann sein, dass, wenn Ihr JS komplex genug ist, nur ein Test im Browser ausreicht, aber es gibt noch ein paar weitere Optionen, die Sie berücksichtigen sollten:

HtmlUnit : "Es hat eine ziemlich gute JavaScript-Unterstützung (die sich ständig verbessert) und kann auch mit recht komplexen AJAX-Bibliotheken arbeiten, wobei je nach gewünschter Konfiguration entweder Firefox oder Internet Explorer simuliert wird." Wenn die Emulation für Ihre Verwendung gut genug ist, ist sie viel schneller als das Fahren eines Browsers.

Aber vielleicht hat HtmlUnit genug JS-Unterstützung, aber Sie mögen Java nicht? Dann vielleicht:

Schnelligkeit : Watir-API, die auf JRuby ausgeführt wird und von HtmlUnit unterstützt wird.

oder ähnlich

Schnell : ein weiterer JRuby-Wrapper von HtmlUnit.

Wenn HtmlUnit nicht gut genug ist und Sie einen Browser steuern müssen, können Sie Watir in Betracht ziehen, um Ihren JS zu steuern .

Jeffrey Fredrick
quelle
3

Vielleicht interessieren Sie sich auch für das Unit-Testing-Framework, das Teil von qooxdoo ist , einem Open-Source-RIA-Framework, das Dojo, ExtJS usw. ähnelt, aber eine recht umfassende Toolkette aufweist .

Probieren Sie die Online-Version des Testrunners aus . Hinweis: Drücken Sie den grauen Pfeil oben links (sollte deutlicher hervorgehoben werden). Es ist eine "Wiedergabe" -Taste, mit der die ausgewählten Tests ausgeführt werden.

Weitere Informationen zu den JS-Klassen, mit denen Sie Ihre Komponententests definieren können, finden Sie im Online- API-Viewer .

Informationen zu automatisierten UI-Tests (basierend auf Selenium RC) finden Sie im Simulator- Projekt.

Andreas Ecker
quelle
3

Wir haben die JUnit-Integration zu unserem Java-Javascript-Codegenerator ST-JS ( http://st-js.org ) hinzugefügt . Das Framework generiert das entsprechende Javascript sowohl für den getesteten Code als auch für die Komponententests und sendet den Code an verschiedene Browser.

Es ist kein separater Server erforderlich, da der Unit-Test-Runner den erforderlichen http-Port öffnet (und ihn nach Abschluss der Tests schließt). Das Framework manipuliert den Java-Stacktrace so, dass die fehlgeschlagenen Asserts vom JUnit Eclipse-Plugin korrekt angezeigt werden. Hier ist ein einfaches Beispiel mit jQuery und 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;
  }
}
alex.c
quelle