Testowanie jednostkowe AngularJS: samouczek Karma Jasmine
Jednฤ z najbardziej genialnych funkcji Angular.JS jest Testy aspekt. Kiedy programiลci w Google opracowywali AngularJS, pamiฤtali o testowaniu i upewniali siฤ, ลผe caลy framework AngularJS nadawaล siฤ do testowania.
W AngularJS testowanie jest zwykle przeprowadzane przy uลผyciu Karmy (framework). Testowanie Angular JS moลผna przeprowadziฤ bez Karmy, ale framework Karma ma tak ลwietnฤ funkcjonalnoลฤ do testowania kodu AngularJS, ลผe sensowne jest uลผycie tego frameworka.
- W AngularJS moลผemy wykonaฤ Testรณw jednostkowych oddzielnie dla kontrolerรณw i dyrektyw.
- Moลผemy rรณwnieลผ przeprowadziฤ koลcowe testy AngularJS, czyli testowanie z perspektywy uลผytkownika.
Wprowadzenie i instalacja frameworku Karma
Karma jest narzฤdzie do automatyzacji testรณw stworzony przez zespรณล Angular JS w Google. Pierwszym krokiem do korzystania z Karmy jest jej zainstalowanie. Karmฤ instaluje siฤ poprzez npm (ktรณry jest menedลผerem pakietรณw sลuลผฤ cym do ลatwej instalacji moduลรณw na komputerze lokalnym).
Instalacja Karmy
Instalacja Karmy poprzez npm odbywa siฤ w procesie dwuetapowym.
Krok 1) Wykonaj poniลผszฤ liniฤ z poziomu wiersza poleceล
npm install karma karma-chrome-launcher karma-jasmine
W ktรณrym,
- npm to narzฤdzie wiersza poleceล dla menedลผera pakietรณw wฤzลรณw, uลผywane do instalowania niestandardowych moduลรณw na dowolnym komputerze.
- Parametr install informuje narzฤdzie wiersza poleceล npm, ลผe wymagana jest instalacja.
- W wierszu poleceล okreลlone sฤ 3 biblioteki wymagane do pracy z karmฤ .
- karma jest podstawowฤ bibliotekฤ , ktรณra bฤdzie uลผywana do celรณw testowych.
- karma-chrome-launcher to osobna biblioteka, ktรณra umoลผliwia rozpoznawanie poleceล karmy przez przeglฤ darkฤ Chrome.
- karma-jasmine โ instaluje jaลmin, ktรณry jest zaleลผnym frameworkiem dla Karmy.
Krok 2) Nastฤpnym krokiem jest instalacja narzฤdzia wiersza poleceล karma. Jest to wymagane do wykonywania poleceล linii karmy. Narzฤdzie karma line zostanie uลผyte do zainicjowania ลrodowiska karmy do testรณw.
Aby zainstalowaฤ narzฤdzie wiersza poleceล, wykonaj poniลผszy wiersz z poziomu wiersza poleceล
npm install karma-cli
w ktรณrej,
Konfiguracja frameworku Karma
Nastฤpnym krokiem jest skonfigurowanie karmy, czego moลผna dokonaฤ za pomocฤ polecenia
"karma โinit"
Po wykonaniu powyลผszego kroku karma utworzy plik karma.conf.js. Plik prawdopodobnie bฤdzie wyglฤ daล jak fragment pokazany poniลผej
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Powyลผsze pliki konfiguracyjne przekazujฤ silnikowi wykonawczemu Karma nastฤpujฤ ce informacje
- โNazwa Twojej aplikacjiโ โ Zostanie ono zastฤ pione nazwฤ Twojej aplikacji.
- "Nazwa Twojej aplikacji'/AngularJS/AngularJS.js' โ To mรณwi karmie, ลผe Twoja aplikacja zaleลผy od podstawowych moduลรณw AngularJS
- โNazwa Twojej aplikacjiโ/AngularJS-mocks/AngularJS-mocks.jsโ โ To mรณwi karmie, aby uลผyลa funkcjonalnoลci testรณw jednostkowych dla AngularJS z pliku Angular.JS-mocks.js.
- Wszystkie gลรณwne pliki aplikacji lub logiki biznesowej znajdujฤ siฤ w folderze lib Twojej aplikacji.
- Folder testรณw bฤdzie zawieraล wszystkie testy jednostkowe.
Aby sprawdziฤ czy karma dziaลa utwรณrz plik o nazwie Sample.js, umieลฤ w nim poniลผszy kod i umieลฤ go w katalogu test.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Powyลผszy kod ma nastฤpujฤ ce aspekty
- Funkcja opisu sลuลผy do opisywania testu. W naszym przypadku do naszego testu nadajemy opis โTest prรณbnyโ.
- Funkcja โitโ sลuลผy do nadania nazwy testowi. W naszym przypadku podajemy nazwฤ naszego testu jako โWarunek jest prawdziwyโ. Nazwa testu musi byฤ zrozumiaลa.
- Kombinacja sลรณw kluczowych โoczekiwaฤโ i โbyฤโ okreลla, jaka jest oczekiwana i rzeczywista wartoลฤ wyniku testu. Jeลli wartoลฤ rzeczywista i oczekiwana sฤ takie same, test zakoลczy siฤ pomyลlnie, w przeciwnym razie zakoลczy siฤ niepowodzeniem.
Po wykonaniu poniลผszego wiersza poleceล zostanie wykonany powyลผszy plik testowy
KARMA start
Poniลผsze dane wyjลciowe pochodzฤ z IDE Webstorm w ktรณrym wykonano powyลผsze czynnoลci.
- Dane wyjลciowe znajdujฤ siฤ w eksploratorze Karmy Webstorm. To okno pokazuje wykonanie wszystkich testรณw zdefiniowanych w ramach karmy.
- Tutaj moลผesz zobaczyฤ, ลผe pokazany jest opis wykonanego testu, ktรณry jest โTestem prรณbkiโ.
- Nastฤpnie widaฤ, ลผe wykonywany jest sam test o nazwie โWarunek jest prawdziwyโ.
- Naleลผy pamiฤtaฤ, ลผe obok wszystkich testรณw znajduje siฤ zielona ikona โOKโ, ktรณra symbolizuje pomyลlne zakoลczenie wszystkich testรณw.
Testowanie kontrolerรณw AngularJS
Struktura testowania karmy ma rรณwnieลผ funkcjฤ kompleksowego testowania kontrolerรณw. Obejmuje to testowanie obiektu $scope uลผywanego w kontrolerach.
Spรณjrzmy na przykลad, jak moลผemy to osiฤ gnฤ ฤ.
W naszym przykลadzie
Najpierw musielibyลmy zdefiniowaฤ kontroler. Ten kontroler wykona poniลผsze kroki
- Utwรณrz zmiennฤ ID i przypisz jej wartoลฤ 5.
- Przypisz zmiennฤ ID do obiektu $scope.
Nasz test sprawdzi istnienie tego kontrolera, a takลผe sprawdzi, czy zmienna ID obiektu $scope jest ustawiona na 5.
Najpierw musimy siฤ upewniฤ, ลผe speลnione sฤ nastฤpujฤ ce warunki wstฤpne
Zainstaluj bibliotekฤ Angular.JS-mocks poprzez npm. Moลผna to zrobiฤ, wykonujฤ c poniลผszy wiersz w wierszu poleceล
npm install Angular JS-mocks
Nastฤpnie naleลผy zmodyfikowaฤ plik karma.conf.js, aby upewniฤ siฤ, ลผe do testu zostanฤ doลฤ czone odpowiednie pliki. Poniลผszy segment pokazuje tylko czฤลฤ plikรณw karma.conf.js, ktรณra wymaga modyfikacji
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Parametr โplikiโ w zasadzie informuje Karmฤ o wszystkich plikach wymaganych do przeprowadzenia testรณw.
- Do uruchomienia testรณw jednostkowych AngularJS wymagane sฤ pliki AngularJS.js i AngularJS-mocks.js
- Plik Index.js bฤdzie zawieraล nasz kod dla kontrolera
- Folder test bฤdzie zawieraล wszystkie nasze testy AngularJS
Poniลผej znajduje siฤ nasz kod Angular.JS, ktรณry zostanie zapisany jako plik Index.js w folderze testowym naszej aplikacji.
Poniลผszy kod wykonuje nastฤpujฤ ce czynnoลci
- Tworzenie Moduล AngularJS o nazwie przykลadowa aplikacja
- Utwรณrz kontroler o nazwie AngularJSController
- Utwรณrz zmiennฤ o nazwie ID, nadaj jej wartoลฤ 5 i przypisz jฤ do obiektu $scope
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Po pomyลlnym wykonaniu powyลผszego kodu nastฤpnym krokiem bฤdzie utworzenie pliku Przypadek testowy aby upewniฤ siฤ, ลผe kod zostaล napisany i wykonany poprawnie.
Kod naszego testu bฤdzie taki, jak pokazano poniลผej.
Kod bฤdzie w osobnym pliku o nazwie ControllerTest.js, ktรณry zostanie umieszczony w folderze test. Poniลผszy kod wykonuje nastฤpujฤ ce kluczowe czynnoลci
- beforeEach funkcja โ Ta funkcja sลuลผy do zaลadowania naszego moduลu AngularJS.JS o nazwie โsampleAppโ przed uruchomieniem testowym. Zauwaลผ, ลผe jest to nazwa moduลu w pliku Index.js.
- Obiekt $controller tworzony jest jako obiekt makiety dla kontrolera โAngular JSControllerโ, ktรณry jest zdefiniowany w naszym pliku Index.js. W kaลผdym rodzaju testรณw jednostkowych obiekt prรณbny reprezentuje obiekt fikcyjny, ktรณry faktycznie bฤdzie uลผywany do testowania. Ten prรณbny obiekt bฤdzie w rzeczywistoลci symulowaล zachowanie naszego kontrolera.
- beforeEach(inject(function(_$controller_)) โ Sลuลผy do wstrzykniฤcia prรณbnego obiektu w naszym teลcie, tak aby zachowywaล siฤ jak rzeczywisty kontroler.
- var $zakres = {}; To jest obiekt prรณbny tworzony dla obiektu $scope.
- var kontroler = $kontroler('AngularJSController', { $zakres: $zakres }); โ Tutaj sprawdzamy istnienie kontrolera o nazwie โAngular.JSControllerโ. Tutaj przypisujemy rรณwnieลผ wszystkie zmienne z naszego obiektu $scope w naszym kontrolerze w pliku Index.js do obiektu $scope w naszym pliku testowym
- Na koniec porรณwnujemy $scope.ID z 5
describe('AngularJSController', function() {
beforeEach(module('sampleApp'));
var $controller;
beforeEach(inject(function(_$controller_){
$controller = _$controller_;
}));
describe('$scope.ID', function() {
it('Check the scope object', function() {
var $scope = {};
var controller = $controller('AngularJSController', { $scope: $scope });
expect($scope.ID).toEqual(5);
});
});
});
Powyลผszy test zostanie uruchomiony w przeglฤ darce karmy i da taki sam wynik pozytywny, jak pokazano w poprzednim temacie.
Testowanie dyrektyw AngularJS
Struktura testowania karmy ma rรณwnieลผ funkcjฤ testowania niestandardowych dyrektyw. Obejmuje to szablony URL uลผywane w dyrektywach niestandardowych.
Spรณjrzmy na przykลad, jak moลผemy to osiฤ gnฤ ฤ.
W naszym przykลadzie najpierw zdefiniujemy niestandardowฤ dyrektywฤ, ktรณra wykonuje nastฤpujฤ ce czynnoลci
- Utwรณrz moduล AngularJS o nazwie sampleApp
- Utwรณrz niestandardowฤ dyrektywฤ o nazwie โ Guru99
- Utwรณrz funkcjฤ zwracajฤ cฤ szablon ze znacznikiem nagลรณwka wyลwietlajฤ cym tekst โTo jest testowanie AngularJSโ.
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Po pomyลlnym wykonaniu powyลผszego kodu nastฤpnym krokiem bฤdzie utworzenie przypadku testowego, aby upewniฤ siฤ, ลผe kod zostaล napisany i wykonany poprawnie. Kod naszego testu bฤdzie taki, jak pokazano poniลผej
Kod bฤdzie w osobnym pliku o nazwie DirectiveTest.js, ktรณry zostanie umieszczony w folderze test. Poniลผszy kod wykonuje nastฤpujฤ ce kluczowe czynnoลci
- beforeEach funkcja โ Ta funkcja sลuลผy do zaลadowania naszego moduลu Angular JS o nazwie โsampleAppโ przed uruchomieniem testowym.
- Do kompilacji dyrektywy uลผywana jest usลuga $compile. Ta usลuga jest obowiฤ zkowa i musi zostaฤ zadeklarowana, aby Angular.JS mรณgล jej uลผyฤ do skompilowania naszej niestandardowej dyrektywy.
- $rootscope to podstawowy zakres dowolnej aplikacji AngularJS.JS. Obiekt $scope kontrolera widzieliลmy juลผ we wczeลniejszych rozdziaลach. Cรณลผ, obiekt $scope jest obiektem podrzฤdnym obiektu $rootscope. Powodem tej deklaracji jest to, ลผe wprowadzamy zmianฤ w rzeczywistym tagu HTML w DOM za pomocฤ naszej niestandardowej dyrektywy. Dlatego musimy skorzystaฤ z usลugi $rootscope, ktรณra faktycznie nasลuchuje i wie, kiedy nastฤ pi jakakolwiek zmiana z poziomu dokumentu HTML.
- element var = $kompiluj(โ โ) โ Sลuลผy do sprawdzania, czy nasza dyrektywa zostaลa wstrzykniฤta tak, jak powinna. Nazwa naszej niestandardowej dyrektywy to Guru99 i wiemy z naszego rozdziaลu o niestandardowych dyrektywach, ลผe kiedy dyrektywa zostanie wstrzykniฤta do naszego kodu HTML, zostanie wstrzykniฤta jako โ '. Dlatego ta instrukcja jest uลผywana do sprawdzenia.
- oczekiwanie(element.html()).toContain(โTo jest test AngularJSโ) โ sลuลผy do poinstruowania funkcji oczekiwania, ลผe โโpowinna znaleลบฤ element (w naszym przypadku znacznik div), ktรณry bฤdzie zawieraล tekst w formacie internalHTML โThis is Testowanie AngularJSโ.
describe('Unit testing directives', function() {
var $compile,
$rootScope;
beforeEach(module('sampleApp'));
beforeEach(inject(function(_$compile_, _$rootScope_){
$compile = _$compile_;
$rootScope = _$rootScope_;
}));
it('Check the directive', function() {
// Compile a piece of HTML containing the directive
var element = $compile("<ng-Guru99></ng-Guru99>")($rootScope);
$rootScope.$digest();
expect(element.html()).toContain("This is AngularJS Testing");
});
});
Powyลผszy test zostanie uruchomiony w przeglฤ darce karmy i da taki sam wynik pozytywny, jak pokazano w poprzednim temacie.
Kompleksowe testowanie aplikacji AngularJS JS
Framework do testowania karmy wraz ze frameworkiem o nazwie Protractor ma funkcjonalnoลฤ kompleksowego testowania aplikacji internetowej.
Zatem nie jest to tylko testowanie dyrektyw i kontrolerรณw, ale takลผe testowanie czegokolwiek innego, co moลผe pojawiฤ siฤ na stronie HTML.
Spรณjrzmy na przykลad, jak moลผemy to osiฤ gnฤ ฤ.
W naszym przykลadzie poniลผej bฤdziemy mieฤ aplikacjฤ AngularJS, ktรณra tworzy tabelฤ danych za pomocฤ dyrektywy ng-repeat.
- Najpierw tworzymy zmiennฤ o nazwie โsamouczekโ i przypisujemy jej kilka par klucz-wartoลฤ w jednym kroku. Kaลผda para klucz-wartoลฤ bฤdzie uลผywana jako dane podczas wyลwietlania tabeli. Zmienna samouczka jest nastฤpnie przypisywana do obiektu zakresu, tak aby moลผna byลo uzyskaฤ do niej dostฤp z naszego widoku.
- Dla kaลผdego wiersza danych w tabeli uลผywamy dyrektywy ng-repeat. Ta dyrektywa przechodzi przez kaลผdฤ parฤ klucz-wartoลฤ w obiekcie zakresu tutoriala przy uลผyciu zmiennej ptutor.
- Na koniec uลผywamy tag wraz z parami klucz-wartoลฤ (ptutor.Name i ptutor.Description), aby wyลwietliฤ dane tabeli.
<table >
<tr ng-repeat="ptutor in tutorial">
<td>{{ ptutor.Name }}</td>
<td>{{ ptutor.Description }}</td>
</tr>
</table>
</div>
<script type="text/javascript">
var app = AngularJS.module('DemoApp', []);
app.controller('DemoController', function($scope) {
$scope.tutorial =[
{Name: "Controllers" , Description : "Controllers in action"},
{Name: "Models" , Description : "Models and binding data"},
{Name: "Directives" , Description : "Flexibility of Directives"}
] });
Po pomyลlnym wykonaniu powyลผszego kodu nastฤpnym krokiem bฤdzie utworzenie przypadku testowego, aby upewniฤ siฤ, ลผe kod zostaล napisany i wykonany poprawnie. Kod naszego testu bฤdzie taki, jak pokazano poniลผej
Nasz test tak naprawdฤ przetestuje dyrektywฤ ng-repeat i upewni siฤ, ลผe zawiera ona 3 wiersze danych, tak jak powinno to wynikaฤ z powyลผszego przykลadu.
Najpierw musimy siฤ upewniฤ, ลผe speลnione sฤ nastฤpujฤ ce warunki wstฤpne
Zainstaluj bibliotekฤ kฤ tomierza za poลrednictwem npm. Moลผna to zrobiฤ, wykonujฤ c poniลผszy wiersz w wierszu poleceล
"npm install protractor"
Kod naszego testu bฤdzie taki, jak pokazano poniลผej.
Kod bฤdzie w osobnym pliku o nazwie CompleteTest.js, ktรณry zostanie umieszczony w folderze test. Poniลผszy kod wykonuje nastฤpujฤ ce kluczowe rzeczy
- Funkcjฤ przeglฤ darki zapewnia biblioteka kฤ tomierza i zakลada, ลผe โโnasza aplikacja AngularJS (z kodem pokazanym powyลผej) dziaลa na adresie URL naszej witryny โ http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor in tutorial')); -Ta linia kodu faktycznie pobiera dyrektywฤ ng-repeat, ktรณra jest wypeลniana przez kod 'ptutor in tutorial'. Element i by.repeater to specjalne sลowa kluczowe dostarczane przez bibliotekฤ protractor, ktรณre pozwalajฤ nam uzyskaฤ szczegรณลy dyrektywy ng-repeat.
- oczekiwaฤ(list.liczba()).toEqual(3); โ Na koniec uลผywamy funkcji oczekiwanie, aby sprawdziฤ, czy rzeczywiลcie w wyniku dyrektywy ng-repeat rzeczywiลcie zapeลniajฤ siฤ 3 pozycje w naszej tabeli.
Describe('Unit testing end to end', function() {
beforeEach(function() {
browser.get('http://localhost:8080/Guru99/');
})
it('Check the ng directive', function() {
var list=element.all(by.repeater(ptutor in tutorial'));
expect(list.count()).toEqual(3); }); });
Powyลผszy test zostanie uruchomiony w przeglฤ darce karmy i da taki sam wynik pozytywny, jak pokazano w poprzednim temacie.
Podsumowanie
- Testowanie w AngularJS odbywa siฤ przy uลผyciu frameworku karma, ktรณry zostaล opracowany przez samo Google.
- Framework karma instaluje siฤ za pomocฤ menedลผera pakietรณw wฤzลรณw. Kluczowymi moduลami, ktรณre naleลผy zainstalowaฤ w celu przeprowadzenia podstawowych testรณw, sฤ karma, karma-chrome-launcher, karma-jasmine i karma-cli.
- Testy sฤ zapisywane w oddzielnych plikach js, zwykle przechowywanych w folderze testowym aplikacji. Lokalizacja tych plikรณw testowych musi byฤ podana w specjalnym pliku konfiguracyjnym o nazwie karma.conf.js. Karma uลผywa tego pliku konfiguracyjnego podczas wykonywania wszystkich testรณw.
- Karmy moลผna uลผywaฤ rรณwnieลผ do testowania kontrolerรณw i niestandardowych dyrektyw.
- Aby mรณc kompleksowo testowaฤ sieฤ, naleลผy zainstalowaฤ innฤ platformฤ zwanฤ kฤ tomierzem za poลrednictwem wฤzลa, menedลผera pakietรณw. Ten framework udostฤpnia specjalne metody, ktรณrych moลผna uลผyฤ do testowania wszystkich elementรณw strony HTML.

