Testy jednostkowe, Karma i Jasmine: jak zacząć?

Jak jeszcze byłem raczkującym programistą JavaScript, pojęcia takie jak „TDD”, czy „test jednostkowy” były dla mnie nawet nie tyle obce, ile zwyczajnie przerażające. Co to, do czego to, jak się za to zabrać? Brakowało mi jakiegoś prostego tutorialu, jak się za to w ogóle zabrać. Postanowiłem, że takowy popełnię dla potomności.

Zanim zaczniemy zabawę, potrzebujemy narzędzi zwanych Node.js i npm. Pod Windowsem są gotowe binarki do zainstalowania, podobnie jest chyba z OSX. Pod Linuxem zazwyczaj są odpowiednie paczki. W przypadku Ubuntu instalujemy je tak:

sudo apt-get install nodejs npm 

Odpalamy zatem terminal i przechodzimy sobie do katalogu projektu, do którego będziemy pisać testy jednostkowe. Musimy zainstalować co najmniej dwie paczki npm: karma i karma-jasmine. Dodatkowo proponuję doinstalować również karma-phantomjs-launcher — o użyteczności tego czegoś za chwilę.

Jasmine to framework służący do pisania testów jednostkowych. Karma to tzw. test runner, czyli środowisko służące do uruchamiania tych testów. Opcjonalna trzecia paczka służy do uruchamiania testów w PhantomJS, przeglądarce opartej na silniku WebKit.

Instalacja odbywa się bardzo prosto:

npm init
npm install karma karma-jasmine karma-phantomjs-launcher --save-dev

Pierwsza z powyższych komend zainicjuje nam projekt npm (należy interaktywnie odpowiedzieć na parę pytań — nie ma się co zagłębiać, w każdej chwili można wszystko zmodyfikować edytując plik package.json, który to w efekcie powstanie w naszym projekcie).

Druga komenda zainstaluje wszystkie trzy paczki i dopisze je do pliku package.json. Paczki są zainstalowane w katalogu node_modules. Jest to o tyle fajne, że po wybraniu projektu z repozytorium można od nowa zainstalować wszystkie paczki npm jednym prostym poleceniem:

npm install

OK, zadbajmy teraz o to, by Karmę dało się odpalić. Inicjalizacja konfiguracji Karmy jest równie prosta, co projektu npm:

node_modules/karma/bin/karma init

Znowu odpowiadamy na pytania — na razie wystarczy zatwierdzić wybory domyślne, a za chwilę zajmiemy się edycją pliku konfiguracyjnego, czyli karma.conf.js. Wewnątrz wspomnianego pliku znajdziemy konfigurację kilku interesujących nas elementów. Po pierwsze, zmienna files. Wszystkie wymienione tam pliki są włączane do testów jednostkowych. Jeśli nasz projekt to np. plugin do jQuery, musimy przed dołączeniem plików projektu również zawrzeć samą bibliotekę jQuery. Na koniec znaleźć się muszą pliki zawierające testy jednostkowe. Przykładowo tablica files mogłaby wyglądać tak:

files: [
    "bower_components/jquery/dist/jquery.js",
    "src/**/*.js", // wszystkie pliki js projektu
    "test/**/*.js" // testy
]

Kolejna interesująca nas zmienna to browsers. Ponieważ wcześniej doradzałem instalację pluginu służącego do uruchamiania testów w PhantomJS, właśnie tę przeglądarkę umieśćmy w konfiguracji:

browsers: ["PhantomJS"]

I jeszcze jedna rzecz: zadbajmy, by zmienna frameworks zawierała nazwę frameworka, którego będziemy używać:

frameworks: ["jasmine"]

Od tego momentu możemy sobie swobodnie uruchamiać Karmę i wszystkie testy jednostkowe za pomocą prostego polecenia:

node_modules/karma/bin/karma start

Uwaga: Wersje Karmy 0.8 i 0.10 umieszczały dodatkowo symlink do pliku wykonywalnego Karmy w katalogu mode_modules/.bin. Obecna wersja 0.12.6 nie robi tego, w związku z czym należy doinstalować sobie paczkę karma-cli. Najlepiej globalnie. Wtedy będziemy mieli dostępne polecenie karma bez konieczności podawania ścieżki do lokalnie zainstalowanej paczki.

Teraz wystarczy napisać jakiś test jednoskowy. Stwórzmy zatem plik test/test.js i wpiszmy w nim następującą zawartość:

describe("first test", function() {
    it("should add 2 and 2", function() {
        expect(2 + 2).toBe(5);
    });
});

W ten spsób, zgodnie z ideą TDD, zaczęliśmy od napisania failującego testu :). O ile konfiguracja Karmy jest prawidłowa (konkretnie chodzi o zawarte pliki), to każdy test ma dostęp do kodu projektu i można do woli testować sobie tworzoną właśnie funkcjonalność.


Komentarze

cyan

2015-02-03, 09:28

a w Angularze, mozemy zainstalowac za pomoca npm grunt-karma. Wtedy mamy zadanie grunt test, ktore uruchamia testy.

Dominik Marczuk

2015-02-03, 09:37

A można. Chociaż ja to wolę zawołać npm test niż grunt test :).

Alan

2015-10-16, 17:11

"OK, zadbajmy teraz o to, by Karmę dało się odpalić. Inicjalizacja konfiguracji Karmy jest równie prosta, co projektu NPM:

mingos@Trololo:~/projekt$ node_modules/karma/bin/karma init "

~~ wydaje mi się, że nie powinno być 'node_modules/karma/bin/karma init', tylko 'node_modules/.bin/karma init', przynajmniej u mnie dopiero wtedy przeszło. :) wcześniej wywalało:
"`node_modules` is not recognized as an internal or external command, operable program or batch file.", choć robiłem wszystko krok po kroku jak tłumaczyłeś. ;)
Pozdrawiam!

Dominik Marczuk

2015-10-21, 00:26

Być może coś się zmieniło w aktualnej wersji Karmy, ale półtora roku temu, czyli w momencie pisania tego postu, chyba działało to tak, jak opisałem. A tak naprawdę to najlepiej zainstalować sobie globalnie paczkę karma-cli i wołać zwyczajnie "karma init", bez podawania ścieżki :).


Napisz komentarz


Szukaj wpisów


Chmura tagów