Narzędzia do testowania jednostek JavaScript dla TDD

716

Przejrzałem i rozważałem wiele testów jednostkowych JavaScript i narzędzi testujących, ale nie byłem w stanie znaleźć odpowiedniej opcji, aby zachować pełną zgodność z TDD. Czy istnieje narzędzie do testowania jednostek JavaScript, które jest w pełni zgodne z TDD?

Mark Levison
źródło

Odpowiedzi:

1506

Karma lub kątomierz

Karma to skrypt uruchomieniowy JavaScript zbudowany w środowisku Node.js i przeznaczony do testów jednostkowych.

Kątomierz jest przeznaczony do kompleksowych testów i używa Selenium Web Driver do przeprowadzania testów.

Oba zostały wykonane przez zespół Angular. Możesz użyć dowolnej biblioteki asercji.

Screencast: Karma Pierwsze kroki

powiązane :

plusy :

  • Używa node.js, więc jest kompatybilny z Win / OS X / Linux
  • Uruchom testy z przeglądarki lub bez głowicy za pomocą PhantomJS
  • Uruchom na wielu klientach jednocześnie
  • Opcja uruchamiania, przechwytywania i automatycznego wyłączania przeglądarek
  • Opcja uruchamiania serwera / klientów na komputerze programistycznym lub osobno
  • Uruchom testy z wiersza poleceń (może być zintegrowany z Ant / maven)
  • Napisz testy w stylu xUnit lub BDD
  • Obsługuje wiele ram testowych JavaScript
  • Automatyczne uruchamianie testów przy zapisywaniu
  • Prośby o proxy obejmują wiele domen
  • Możliwe dostosowanie:
    • Rozszerz go, aby zawinął inne frameworki testowe (Jasmine, Mocha, wbudowane QUnit)
    • Twoje własne twierdzenia / obalenia
    • Reporterzy
    • Wyrzutnie przeglądarki
  • Wtyczka do WebStorm
  • Obsługiwane przez Netbeans IDE

Wady :

mocha.js

Nie mam żadnych uprawnień do komentowania cech, mocnych i słabych stron mocha.js, ale ktoś mi zaufał społeczności JS.

Lista funkcji zgłoszonych przez jej stronę internetową:

  • obsługa przeglądarki
  • proste wsparcie asynchroniczne, w tym obietnice
  • raportowanie pokrycia testowego
  • obsługa łańcucha różnicy
  • javascript # API do uruchamiania testów
  • odpowiedni status wyjścia do obsługi CI itp
  • automatycznie wykrywa i wyłącza kolorowanie dla non-tty
  • odwzorowuje nieprzechwycone wyjątki do poprawnego przypadku testowego
  • obsługa limitu czasu testu asynchronicznego
  • limity czasu specyficzne dla testu
  • obsługa powiadomień warczenie
  • raportuje czas trwania testu
  • podkreśla powolne testy
  • obsługa obserwatora plików
  • globalna zmienna detekcja wycieków
  • opcjonalnie uruchom testy, które pasują do wyrażenia regularnego
  • automatyczne wyjście, aby zapobiec „zawieszeniu się” przy aktywnej pętli
  • łatwo generuje meta-pakiety i przypadki testowe
  • Obsługa plików mocha.opts
  • klikalne tytuły pakietów do filtrowania wykonania testu
  • obsługa debuggera węzła
  • wykrywa wiele wywołań do done ()
  • użyj dowolnej biblioteki asercji
  • raportowanie rozszerzalne, w pakiecie z ponad 9 reporterami
  • rozszerzalne testowe DSL lub „interfejsy”
  • przed, po, przed każdym, po każdym haku
  • dowolna obsługa transpilatora (skrypt kawy itp.)
  • Pakiet TextMate

yolpo

yolpo

To już nie istnieje, zamiast tego przekierowuje do sequential.js

Yolpo to narzędzie do wizualizacji wykonywania javascript. Zachęcamy programistów JavaScript API do pisania przypadków użycia, aby pokazać i powiedzieć swoje API. Takie przypadki użycia stanowią podstawę testów regresji.

AVA

Logo AVA

Futurystyczny tester z wbudowanym wsparciem dla ES2015. Mimo że JavaScript jest jednowątkowy, operacje we / wy w Node.js mogą występować równolegle ze względu na jego asynchroniczny charakter. AVA korzysta z tego i jednocześnie wykonuje testy, co jest szczególnie korzystne w przypadku ciężkich testów IO. Ponadto pliki testowe są uruchamiane równolegle jako osobne procesy, co zapewnia jeszcze lepszą wydajność i izolowane środowisko dla każdego pliku testowego.

  • Minimalna i szybka
  • Prosta składnia testu
  • Uruchamia testy jednocześnie
  • Wymusza pisanie testów atomowych
  • Żadnych niejawnych globałów
  • Izolowane środowisko dla każdego pliku testowego
  • Napisz swoje testy w ES2015
  • Obietnica wsparcia
  • Obsługa funkcji generatora
  • Obsługa funkcji asynchronicznych
  • Obserwowalne wsparcie
  • Ulepszone zapewnia
  • Opcjonalne wyjście TAP
  • Wyczyść ślady stosu

Buster.js

Tester Runner JavaScript zbudowany przy pomocy Node.js. Bardzo modułowy i elastyczny. Ma własną bibliotekę asercji, ale możesz dodać własną, jeśli chcesz. Biblioteka twierdzenia jest odłączony, dzięki czemu można z niego korzystać także z innych testowych biegaczy. Zamiast używać assert(!...)lub expect(...).not..., używa, refute(...)co jest fajnym imho.

Zestaw narzędzi do testowania JavaScript w przeglądarce. Testuje przeglądarkę za pomocą automatyzacji przeglądarki (myśl JsTestDriver), statycznego testowania strony HTML w stylu QUnit, testowania w przeglądarkach bezgłowych (PhantomJS, jsdom, ...) i innych. Spójrz na przegląd !

Zestaw narzędzi do testowania Node.js. Otrzymujesz tę samą bibliotekę przypadków testowych, bibliotekę asercji itp. Jest to również świetne dla przeglądarki hybrydowej i kodu Node.js. Napisz swoją skrzynkę testową za pomocą Buster.JS i uruchom ją zarówno w Node.js, jak i w prawdziwej przeglądarce.

Screencast: Buster.js Pierwsze kroki (2:45)

plusy :

  • Używa node.js, więc jest kompatybilny z Win / OS X / Linux
  • Uruchom testy z przeglądarki lub bez głowy za pomocą PhantomJS (wkrótce)
  • Uruchom na wielu klientach jednocześnie
  • Obsługuje testy NodeJS
  • Nie trzeba uruchamiać serwera / klientów na komputerze programistycznym (nie wymaga IE)
  • Uruchom testy z wiersza poleceń (może być zintegrowany z Ant / maven)
  • Napisz testy w stylu xUnit lub BDD
  • Obsługuje wiele ram testowych JavaScript
  • Odkładaj testy zamiast je komentować
  • Wbudowany SinonJS
  • Automatyczne uruchamianie testów przy zapisywaniu
  • Prośby o proxy obejmują wiele domen
  • Możliwe dostosowanie:
    • Rozszerz go, aby zawinął inne środowiska testowe (wbudowany JsTestDriver)
    • Twoje własne twierdzenia / obalenia
    • Reporterzy (xUnit XML, tradycyjne kropki, specyfikacja, tap, TeamCity i więcej wbudowanych)
    • Dostosuj / zamień kod HTML używany do uruchamiania testów przeglądarki
  • Integracja TextMate i Emacs

Wady :

  • Stil w wersji beta, więc może być wadliwy
  • Brak wtyczki dla Eclipse / IntelliJ (jeszcze)
  • Nie grupuje wyników według systemu operacyjnego / przeglądarki / wersji, takich jak TestSwarm *. W wynikach testu drukuje jednak nazwę i wersję przeglądarki.
  • Brak historii poprzednich wyników testów, takich jak TestSwarm *
  • Nie działa w pełni w systemie Windows od maja 2014

* TestSwarm to także serwer Continuous Integration, podczas gdy potrzebujesz osobnego serwera CI dla Buster.js. Jednak generuje raporty xUnit XML, więc integracja z serwerami Hudson , Bamboo lub innymi serwerami CI powinna być łatwa .

TestSwarm

https://github.com/jquery/testswarm

TestSwarm oficjalnie nie jest już aktywnie rozwijany, jak podano na stronie GitHub. Polecają Karmę, przeglądarkę stosów przeglądarki lub stażystę.

Jaśmin

Jaśmin

Jest to struktura oparta na zachowaniu (jak podano w cytacie poniżej), która może zainteresować programistów znających Ruby lub Ruby on Rails. Składnia jest oparta na RSpec, które są używane do testowania w projektach Railsowych.

Specyfikacje Jasmine można uruchamiać ze strony HTML (w sposób qUnit) lub z testera (jako Karma).

Jasmine to oparta na zachowaniu platforma programistyczna do testowania kodu JavaScript. Nie zależy od żadnych innych struktur JavaScript. Nie wymaga DOM.

Jeśli masz doświadczenie w korzystaniu z tego środowiska testowego, prześlij więcej informacji :)

Strona projektu: http://jasmine.github.io/

QUnit

QUnit koncentruje się na testowaniu JavaScript w przeglądarce, zapewniając jednocześnie jak największą wygodę programistom. Napis na stronie:

QUnit to potężny, łatwy w użyciu pakiet testów jednostkowych JavaScript. Jest używany w projektach jQuery, jQuery UI i jQuery Mobile i jest w stanie przetestować dowolny ogólny kod JavaScript

QUnit dzieli się pewną historią z TestSwarm (powyżej):

QUnit został pierwotnie opracowany przez Johna Resiga jako część jQuery. W 2008 r. Otrzymała własną dokumentację domową, nazwę i API, dzięki czemu inni mogą z niej korzystać również w testach jednostkowych. W tym czasie nadal zależało to od jQuery. Przepisanie w 2009 roku naprawiło to, teraz QUnit działa całkowicie autonomicznie. Metody asercji QUnit są zgodne ze specyfikacją CommonJS Unit Testing, na którą QUnit miał do pewnego stopnia wpływ.

Strona główna projektu: http://qunitjs.com/

Sinon

Innym doskonałym narzędziem jest sinon.js autorstwa Christiana Johansena, autora Test-Driven JavaScript Development . Najlepiej opisany przez siebie:

Samodzielne testy szpiegowskie, kody pośredniczące i makiety dla JavaScript. Żadne zależności nie działają z żadnymi ramami testów jednostkowych.

Stażysta

Witryna internetowa stażysty zapewnia bezpośrednie porównanie funkcji z innymi platformami testowymi z tej listy. Oferuje więcej funkcji po wyjęciu z pudełka niż jakikolwiek inny system testowy oparty na JavaScript.

ŻART

Nowa, ale bardzo wydajna platforma testowa. Pozwala także na testowanie migawkowe, co zwiększa szybkość testowania i tworzy nową dynamikę w zakresie testowania

Sprawdź jeden z ich rozmów: https://www.youtube.com/watch?v=cAKYQpTC7MA

Jeszcze lepiej: Pierwsze kroki

gregers
źródło
2
Jasmine może pracować bez głowy za pomocą V8, ale możesz także używać jej interaktywnie. Chociaż DOM nie jest konieczny w odniesieniu do Jasmine, twoja baza kodów może uzyskać dostęp do DOM. Dzięki dyscyplinie możliwe jest wyeliminowanie, ochrona warunków lub udostępnianie próbnych części kodu, które uzyskują dostęp do DOM i uruchamiają testy całkowicie niezależnie od urządzeń HTML. Możesz także uzyskać obsługę wiersza polecenia i urządzenia za pomocą dodatków.
jerseyboy
2
@ rehevkor5: Selenium służy do testowania integracji, podczas gdy narzędzia tutaj służą do testowania jednostek. typemock.com/unit-tests-integration-tests
gregers
26
Prawie każdy tester korzysta z przeglądarki. Wtf, czy nikt nigdy nie uruchamia testów jednostkowych tylko po stronie serwera ????
2
Czy nie byłoby lepiej podzielić / podzielić każdą alternatywę na różne odpowiedzi? Może to unieważnić obecne głosy w tej sprawie, ale myślę, że miałoby to jak najbardziej sens.
cregox
2
@Raisen Możesz podłączyć ES 2015 do większości z nich za pomocą Babel , ale AVA Sindre Sorhus ma to wbudowane.
Gregers
64

Spójrz na strukturę testową jednostki Dojo Object Harness (DOH), która jest właściwie niezależną od niej strukturą do testowania jednostek JavaScript i nie ma żadnych zależności Dojo. Jest to bardzo dobry opis w jednostce testującej aplikacje Web 2.0 za pomocą Uprzęży Celowej Dojo .

Jeśli chcesz zautomatyzować testowanie interfejsu użytkownika ( problem wielu programistów) - sprawdź doh.robot (tymczasowe wyłączenie. Aktualizacja: inny link http://dojotoolkit.org/reference-guide/util/dohrobot.html ) i dijit .robotx (chwilowe wyłączenie) . Ten ostatni jest przeznaczony do testów akceptacyjnych. Aktualizacja:

W odnośnych artykułach wyjaśniono, jak z nich korzystać, jak emulować użytkownika wchodzącego w interakcję z interfejsem użytkownika za pomocą myszy i / lub klawiatury, a także jak nagrać sesję testową, aby można było „odtworzyć” ją później automatycznie.

Eugene Lazutkin
źródło
Dzięki za sugestię Uprzęży Obiektowej Dojo, nigdy bym jej nie znalazł. Doceniam inne sugestie - ale krok po kroku.
Mark Levison,
Użyłem tego w poprzednim projekcie i uznałem, że jest to bezcenne. Ale z drugiej strony nie mogę porównać - nie użyłem żadnej innej struktury TDD.
Rakesh Pai,
Dziękujemy za zgłoszenie martwych linków. Zaktualizowałem jeden z nich i zastąpię linki do dokumentów robotów, gdy tylko pojawią się na nowej stronie internetowej.
Eugene Lazutkin
Jedną z rzeczy, których nie lubię w DOH, jest to, że numery linii nie są zgłaszane, gdy asercje zawodzą. Komentowanie ich ręcznie i ponowne uruchomienie testu działa.
Aram Kocharyan
Dojo zastępuje DOH ramą testową TheIntern. Wnętrze jest bardzo potężne i ma znaczną poprawę. sitepen.com/blog/2014/02/18/…
user64141
34

Chutzpah - A JavaScript Test Runner

Stworzyłem projekt open source o nazwie Chutzpah, który jest testerem testów jednostkowych JavaScript. Chutzpah umożliwia uruchamianie testów jednostkowych JavaScriptu z wiersza poleceń i z poziomu Visual Studio. Obsługuje także działanie na serwerze ciągłej integracji TeamCity.

Matthew Manela
źródło
7
Właśnie zacząłem używać Chutzpah do uruchamiania testów Jasmine w Visual Studio - jest ładnie zintegrowany: kliknij prawym przyciskiem myszy plik testowy i wybierz „Uruchom testy JS” lub „Uruchom testy JS w przeglądarce”. Przeprowadzam te same testy jaśminu przy użyciu JSTestDriver. Wolę Chutzpah, ponieważ określam, które pliki zależą od załadowania na górze pliku testowego. Do JSTestDriver potrzebuję osobnego pliku konfiguracyjnego.
GarethOwen
26

Sekcja JavaScript wpisu w Wikipedii, List of Framework Testing Unit , zawiera listę dostępnych opcji. Wskazuje, czy działają po stronie klienta, po stronie serwera, czy oba.

Pete TerMaat
źródło
14

BusterJS

Istnieje również BusterJS od Christian Johansen, autor Test Driven Javascript Development i frameworku Sinon. Ze strony:

Buster.JS to nowa platforma testowania JavaScript. Testuje przeglądarkę, automatyzując testy w rzeczywistych przeglądarkach (pomyśl JsTestDriver), a także testuje Node.js.

Tauren
źródło
10

test google-js:

Framework testowy JavaScript wydany przez Google: https://github.com/google/gjstest

  • Niezwykle szybki czas uruchamiania i wykonywania testu, bez konieczności uruchamiania przeglądarki.
  • Czysty, czytelny wynik zarówno w przypadku pozytywnego, jak i negatywnego wyniku testu.
  • Uruchomiony w przeglądarce test runner, który można po prostu odświeżyć po każdej zmianie JS.
  • Styl i semantyka, które przypominają test Google dla C ++.
  • Wbudowana frakcja próbna, która wymaga minimalnego kodu (np. Nie $tearDownlub $verifyAll) ze stylem i semantyką oparta na frameworku Google C ++ .

Obecnie nie ma plików binarnych dla systemu Windows

użytkowników
źródło
1
Wygląda na to, że ma prawie zerowe zainteresowanie Githubem, wymaga także systemu operacyjnego opartego na unixach i jestem wielkim fanem okien, nie wychodzę z domu bez pożegnania się z maszyną do okien.
vsync
8

Używamy teraz Qunit razem z Pavlovem i JSTestDriver. To podejście działa dla nas dobrze.

QUnit

Pavlov , źródło

jsTestDriver , źródło

Tom Stickel
źródło
Czy chciałbyś wyjaśnić, jaka jest rola każdego z nich w całym procesie testowania i jak się ze sobą łączą?
vsync,
Przepraszam, że minęło sporo czasu i wiele prac kontraktowych temu przywołało szczegóły na ten temat.
Tom Stickel,
6

Masz „działa na prawdziwej przeglądarce” jako profesjonalista, ale z mojego doświadczenia jest to oszustwo, ponieważ jest powolne. Ale to, co sprawia, że ​​jest cenny, to brak wystarczającej emulacji JS z alternatywnych przeglądarek. Może się zdarzyć, że jeśli Twój JS jest na tyle skomplikowany, że wystarczy tylko test w przeglądarce, ale jest kilka innych opcji do rozważenia:

HtmlUnit : „Ma dość dobrą obsługę JavaScript (która ciągle się poprawia) i jest w stanie pracować nawet z dość złożonymi bibliotekami AJAX, symulując Firefox lub Internet Explorer w zależności od konfiguracji, której chcesz użyć”. Jeśli jego emulacja jest wystarczająca do użycia, będzie znacznie szybsza niż obsługa przeglądarki.

Ale może HtmlUnit ma wystarczająco dobrą obsługę JS, ale nie lubisz Javy? Więc może:

Celerity : Watir API uruchomiony na JRuby poparte HtmlUnit.

lub podobnie

Schnell : kolejne opakowanie JRuby HtmlUnit.

Oczywiście, jeśli HtmlUnit nie jest wystarczająco dobry i musisz prowadzić przeglądarkę, możesz rozważyć Watir do prowadzenia JS .

Jeffrey Fredrick
źródło
6

YUI ma również środowisko testowe . Ten film od Yahoo! Teatr to miłe wprowadzenie, choć z przodu jest wiele podstaw TDD.

Ten framework jest ogólny i może być uruchamiany z dowolną biblioteką JavaScript lub JS.

Matthew Taylor
źródło
5
Należy pamiętać, że Yahoo powstrzymał cały nowy rozwój YUI
Peter V. Mørch
3

Możesz być także zainteresowany strukturą testów jednostkowych, która jest częścią qooxdoo , frameworku RIA typu open source podobnego do Dojo, ExtJS itp., Ale z dość rozbudowanym łańcuchem narzędzi.

Wypróbuj wersję testrunner online . Wskazówka: naciśnij szarą strzałkę w lewym górnym rogu (powinno być bardziej oczywiste). Jest to przycisk „play”, który uruchamia wybrane testy.

Aby dowiedzieć się więcej o klasach JS, które pozwalają zdefiniować testy jednostkowe, zobacz przeglądarkę API online .

Aby zautomatyzować testowanie interfejsu użytkownika (w oparciu o Selenium RC), sprawdź projekt symulatora .

Andreas Ecker
źródło
3

Trzeba spojrzeć na env.js . Zobacz mój blog na przykład, jak pisać testy jednostkowe za pomocą env.js.

Aaron Digulla
źródło
3

Dodaliśmy integrację JUnit do naszego generatora kodu Java do Javascript ST-JS ( http://st-js.org ). Struktura generuje odpowiedni Javascript zarówno dla testowanego kodu, jak i testów jednostkowych i wysyła kod do różnych przeglądarek.

Nie ma potrzeby posiadania osobnego serwera, ponieważ moduł uruchamiający testy jednostkowe otwiera wymagany port http (i zamyka go po zakończeniu testów). Struktura manipuluje śledzeniem stosu Java, tak aby nieudane aserty były poprawnie wyświetlane przez wtyczkę JUnit Eclipse. Oto prosty przykład z jQuery i 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
źródło