AngularJS Unit Testing: Karma Jasmine Tutorial
Jednou z nejskvฤlejลกรญch vlastnostรญ Angular.JS je Testovรกnรญ aspekt. Kdyลพ vรฝvojรกลi z Google vyvรญjeli AngularJS, mฤli na pamฤti testovรกnรญ a ujistili se, ลพe celรฝ framework AngularJS je testovatelnรฝ.
V AngularJS se testovรกnรญ normรกlnฤ provรกdรญ pomocรญ Karma (rรกmce). Testovรกnรญ Angular JS lze provรกdฤt bez Karmy, ale rรกmec Karma mรก tak skvฤlou funkcionalitu pro testovรกnรญ kรณdu AngularJS, ลพe mรก smysl tento rรกmec pouลพรญvat.
- V AngularJS mลฏลพeme provรกdฤt Testovรกnรญ jednotek zvlรกลกลฅ pro kontrolory a smฤrnice.
- Mลฏลพeme takรฉ provรฉst end-end testovรกnรญ AngularJS, coลพ je testovรกnรญ z pohledu uลพivatele.
รvod a instalace rรกmce Karma
Karma je a testovacรญ automatizaฤnรญ nรกstroj vytvoลenรฝ tรฝmem Angular JS ve spoleฤnosti Google. Prvnรญm krokem pro pouลพitรญ Karmy je instalace Karmy. Karma se instaluje pลes npm (coลพ je sprรกvce balรญฤkลฏ pouลพรญvanรฝ pro snadnou instalaci modulลฏ na lokรกlnรญ poฤรญtaฤ).
Instalace karmy
Instalace Karmy pลes npm se provรกdรญ ve dvou krocรญch.
Krok 1) Spusลฅte nรญลพe uvedenรฝ ลรกdek z pลรญkazovรฉho ลรกdku
npm install karma karma-chrome-launcher karma-jasmine
pลiฤemลพ
- npm je nรกstroj pลรญkazovรฉho ลรกdku pro sprรกvce balรญฤkลฏ uzlลฏ pouลพรญvanรฝ k instalaci vlastnรญch modulลฏ na libovolnรฝ poฤรญtaฤ.
- Parametr install dรกvรก obsluลพnรฉmu programu pลรญkazovรฉho ลรกdku npm pokyn, ลพe je vyลพadovรกna instalace.
- V pลรญkazovรฉm ลรกdku jsou specifikovรกny 3 knihovny, kterรฉ jsou nutnรฉ pro prรกci s karmou.
- karma je zรกkladnรญ knihovna, kterรก bude pouลพita pro testovacรญ รบฤely.
- karma-chrome-launcher je samostatnรก knihovna, kterรก umoลพลuje rozpoznรกnรญ pลรญkazลฏ karmy prohlรญลพeฤem chrome.
- karma-jasmine โ Nainstaluje jasmรญn, kterรฝ je zรกvislรฝm rรกmcem pro Karmu.
Krok 2) Dalลกรญm krokem je instalace nรกstroje pลรญkazovรฉho ลรกdku karma. To je vyลพadovรกno pro provรกdฤnรญ pลรญkazลฏ linie karmy. Nรกstroj karma line bude pouลพit k inicializaci prostลedรญ karmy pro testovรกnรญ.
Chcete-li nainstalovat nรกstroj pลรญkazovรฉho ลรกdku, spusลฅte nรญลพe uvedenรฝ ลรกdek z pลรญkazovรฉho ลรกdku
npm install karma-cli
kde
Konfigurace rรกmce Karma
Dalลกรญm krokem je konfigurace karmy, kterou lze provรฉst pomocรญ pลรญkazu
"karma โinit"
Po provedenรญ vรฝลกe uvedenรฉho kroku karma vytvoลรญ soubor karma.conf.js. Soubor bude pravdฤpodobnฤ vypadat jako รบryvek zobrazenรฝ nรญลพe
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Vรฝลกe uvedenรฉ konfiguraฤnรญ soubory sdฤlujรญ karma runtime engine nรกsledujรญcรญ vฤci
- 'Nรกzev vaลกรญ aplikace' โ Toto bude nahrazeno nรกzvem vaลกรญ aplikace.
- "Nรกzev vaลกรญ aplikace'/AngularJS/AngularJS.js' โ To ลรญkรก karmฤ, ลพe vaลกe aplikace zรกvisรญ na zรกkladnรญch modulech v AngularJS
- 'Nรกzev vaลกรญ aplikace'/AngularJS-mocks/AngularJS-mocks.js' โ Toto ลekne karmฤ, aby pouลพila funkci Unit Testing pro AngularJS ze souboru Angular.JS-mocks.js.
- Vลกechny soubory hlavnรญ aplikace nebo obchodnรญ logiky jsou pลรญtomny ve sloลพce lib vaลกรญ aplikace.
- Sloลพka testy bude obsahovat vลกechny testy jednotek.
Chcete-li zkontrolovat, zda karma funguje, vytvoลte soubor s nรกzvem Sample.js, vloลพte nรญลพe uvedenรฝ kรณd a umรญstฤte jej do adresรกลe test.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Vรฝลกe uvedenรฝ kรณd mรก nรกsledujรญcรญ aspekty
- Funkce description se pouลพรญvรก k popisu testu. V naลกem pลรญpadฤ dรกvรกme naลกemu testu popis 'Ukรกzkovรฝ test'.
- Funkce 'it' se pouลพรญvรก k pojmenovรกnรญ testu. V naลกem pลรญpadฤ dรกvรกme nรกzev naลกeho testu jako 'Podmรญnka je pravdivรก'. Nรกzev testu musรญ bรฝt smysluplnรฝ.
- Kombinace klรญฤovรฝch slov 'oฤekรกvat' a 'toBe' udรกvรก, jakรก je oฤekรกvanรก a skuteฤnรก hodnota vรฝsledku testu. Pokud je skuteฤnรก a oฤekรกvanรก hodnota stejnรก, pak test projde, jinak selลพe.
Kdyลพ na pลรญkazovรฉm ลรกdku spustรญte nรกsledujรญcรญ ลรกdek, spustรญ se vรฝลกe uvedenรฝ testovacรญ soubor
KARMA start
Nรญลพe uvedenรฝ vรฝstup je pลevzat z IDE Webstorm ve kterรฉm byly provedeny vรฝลกe uvedenรฉ kroky.
- Vรฝstup pลichรกzรญ v prลฏzkumnรญku Karma uvnitล Webstorm. Toto okno ukazuje provedenรญ vลกech testลฏ, kterรฉ jsou definovรกny v rรกmci karmy.
- Zde vidรญte, ลพe je zobrazen popis provedenรฉho testu, kterรฝ je โUkรกzkovรฝ testโ.
- Dรกle mลฏลพete vidฤt, ลพe je proveden samotnรฝ test, kterรฝ mรก nรกzev โPodmรญnka je pravdivรกโ.
- Vลกimnฤte si, ลพe protoลพe vลกechny testy majรญ vedle sebe zelenou ikonu โOkโ, kterรก symbolizuje, ลพe vลกechny testy proลกly รบspฤลกnฤ.
Testovรกnรญ ovladaฤลฏ AngularJS
Rรกmec testovรกnรญ karmy mรก takรฉ funkcionalitu pro testovรกnรญ kontrolรฉrลฏ od zaฤรกtku do konce. To zahrnuje testovรกnรญ objektu $scope, kterรฝ se pouลพรญvรก v rรกmci Controllers.
Podรญvejme se na pลรญklad, jak toho mลฏลพeme dosรกhnout.
V naลกem pลรญkladu
Nejprve bychom potลebovali definovat regulรกtor. Tento ovladaฤ by provedl nรญลพe uvedenรฉ kroky
- Vytvoลte promฤnnou ID a pลiลaฤte jรญ hodnotu 5.
- Pลiลaฤte promฤnnou ID objektu $scope.
Nรกลก test otestuje existenci tohoto ลadiฤe a takรฉ otestuje, zda je promฤnnรก ID objektu $scope nastavena na 5.
Nejprve se musรญme ujistit, ลพe jsou splnฤny nรกsledujรญcรญ pลedpoklady
Nainstalujte knihovnu Angular.JS-mocks pลes npm. To lze provรฉst spuลกtฤnรญm nรญลพe uvedenรฉho ลรกdku v pลรญkazovรฉm ลรกdku
npm install Angular JS-mocks
Dรกle je tลeba upravit soubor karma.conf.js, aby bylo zajiลกtฤno, ลพe do testu budou zahrnuty sprรกvnรฉ soubory. Nรญลพe uvedenรฝ segment pouze zobrazuje soubory ฤรกsti karma.conf.js, kterรฉ je tลeba upravit
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Parametr 'files' v podstatฤ ลรญkรก Karmฤ vลกechny soubory, kterรฉ jsou vyลพadovรกny pro bฤh testลฏ.
- Ke spuลกtฤnรญ testลฏ jednotek AngularJS jsou vyลพadovรกny soubory AngularJS.js a AngularJS-mocks.js
- Soubor index.js bude obsahovat nรกลก kรณd pro ลadiฤ
- Sloลพka test bude obsahovat vลกechny naลกe testy AngularJS
Nรญลพe je nรกลก kรณd Angular.JS, kterรฝ bude uloลพen jako soubor Index.js v testovacรญ sloลพce naลกรญ aplikace.
Nรญลพe uvedenรฝ kรณd dฤlรก pouze nรกsledujรญcรญ vฤci
- Vytvoลit Modul AngularJS s nรกzvem sampleApp
- Vytvoลte ลadiฤ s nรกzvem AngularJSController
- Vytvoลte promฤnnou s nรกzvem ID, pลiลaฤte jรญ hodnotu 5 a pลiลaฤte ji k objektu $scope
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Jakmile je vรฝลกe uvedenรฝ kรณd รบspฤลกnฤ proveden, dalลกรญm krokem by bylo vytvoลenรญ a Testovacรญ pลรญpad abyste se ujistili, ลพe kรณd byl napsรกn a sprรกvnฤ proveden.
Kรณd pro nรกลก test bude vypadat nรญลพe.
Kรณd bude v samostatnรฉm souboru s nรกzvem ControllerTest.js, kterรฝ bude umรญstฤn ve sloลพce test. Nรญลพe uvedenรฝ kรณd dฤlรก pouze nรกsledujรญcรญ klรญฤovรฉ vฤci
- BeforeEach function โ Tato funkce se pouลพรญvรก k naฤtenรญ naลกeho modulu AngularJS.JS s nรกzvem 'sampleApp' pลed spuลกtฤnรญm testu. Vลกimnฤte si, ลพe toto je nรกzev modulu v souboru index.js.
- Objekt $controller je vytvoลen jako maketa objektu pro kontrolรฉr โAngular JSControllerโ, kterรฝ je definovรกn v naลกem souboru index.js. V jakรฉmkoliv typu Unit Testing pลedstavuje faleลกnรฝ objekt fiktivnรญ objekt, kterรฝ bude skuteฤnฤ pouลพit pro testovรกnรญ. Tento faleลกnรฝ objekt bude ve skuteฤnosti simulovat chovรกnรญ naลกeho ovladaฤe.
- beforeEach(inject(function(_$controller_)) โ Pouลพรญvรก se k vloลพenรญ faleลกnรฉho objektu v naลกem testu tak, aby se choval jako skuteฤnรฝ ovladaฤ.
- var $scope = {}; Toto je faleลกnรฝ objekt vytvรกลenรฝ pro objekt $scope.
- var controller = $controller('AngularJSController', { $scope: $scope }); โ Zde kontrolujeme existenci ลadiฤe s nรกzvem 'Angular.JSController'. Zde takรฉ pลiลazujeme vลกechny promฤnnรฉ z naลกeho objektu $scope v naลกem kontrolรฉru v souboru Index.js k objektu $scope v naลกem testovacรญm souboru
- Nakonec porovnรกvรกme $scope.ID s 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);
});
});
});
Vรฝลกe uvedenรฝ test se spustรญ v prohlรญลพeฤi karmy a poskytne stejnรฝ vรฝsledek, jakรฝ byl ukรกzรกn v pลedchozรญm tรฉmatu.
Testovรกnรญ smฤrnic AngularJS
Rรกmec testovรกnรญ karmy mรก takรฉ funkce pro testovรกnรญ vlastnรญch direktiv. To zahrnuje ลกablony URL, kterรฉ se pouลพรญvajรญ v rรกmci vlastnรญch direktiv.
Podรญvejme se na pลรญklad, jak toho mลฏลพeme dosรกhnout.
V naลกem pลรญkladu nejprve definujeme vlastnรญ direktivu, kterรก dฤlรก nรกsledujรญcรญ vฤci
- Vytvoลte modul AngularJS s nรกzvem sampleApp
- Vytvoลte vlastnรญ direktivu s nรกzvem โ Guru99
- Vytvoลte funkci, kterรก vrรกtรญ ลกablonu se znaฤkou zรกhlavรญ, kterรก zobrazรญ text โToto je AngularJS Testingโ.
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Jakmile je vรฝลกe uvedenรฝ kรณd รบspฤลกnฤ proveden, dalลกรญm krokem by bylo vytvoลenรญ testovacรญho pลรญpadu, aby se zajistilo, ลพe kรณd byl napsรกn a proveden sprรกvnฤ. Kรณd pro nรกลก test bude vypadat nรญลพe
Kรณd bude v samostatnรฉm souboru s nรกzvem DirectiveTest.js, kterรฝ bude umรญstฤn ve sloลพce test. Nรญลพe uvedenรฝ kรณd dฤlรก pouze nรกsledujรญcรญ klรญฤovรฉ vฤci
- Pลed kaลพdou funkcรญ โ Tato funkce se pouลพรญvรก k naฤtenรญ naลกeho modulu Angular JS s nรกzvem โsampleAppโ pลed testovacรญm provozem.
- Ke kompilaci smฤrnice se pouลพรญvรก sluลพba $compile. Tato sluลพba je povinnรก a musรญ bรฝt deklarovรกna, aby ji Angular.JS mohl pouลพรญt ke kompilaci naลกรญ vlastnรญ smฤrnice.
- $rootscope je primรกrnรญ rozsah jakรฉkoli aplikace AngularJS.JS. Objekt $scope ovladaฤe jsme vidฤli v pลedchozรญch kapitolรกch. Objekt $scope je potomkem objektu $rootscope. Dลฏvod, proฤ je to zde deklarovรกno, je ten, ลพe provรกdรญme zmฤnu skuteฤnรฉ HTML znaฤky v DOM prostลednictvรญm naลกรญ vlastnรญ direktivy. Proto musรญme pouลพรญt sluลพbu $rootscope, kterรก skuteฤnฤ naslouchรก nebo vรญ, kdyลพ dojde k jakรฉkoli zmฤnฤ v dokumentu HTML.
- var element = $compile(โ โ) โ Pouลพรญvรก se ke kontrole, zda je naลกe smฤrnice aplikovรกna tak, jak mรก. Nรกzev naลกรญ vlastnรญ smฤrnice je Guru99 a z kapitoly o vlastnรญch direktivรกch vรญme, ลพe kdyลพ je smฤrnice vloลพena do naลกeho HTML, bude vloลพena jako โ '. Proto se toto prohlรกลกenรญ pouลพรญvรก k provedenรญ tรฉto kontroly.
- expect(element.html()).toContain(โToto je AngularJS Testingโ) โ Pouลพรญvรก se k instruovรกnรญ funkce oฤekรกvat, ลพe by mฤla najรญt prvek (v naลกem pลรญpadฤ znaฤku div), kterรฝ obsahuje vnitลnรญ HTML text โToto je Testovรกnรญ 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");
});
});
Vรฝลกe uvedenรฝ test se spustรญ v prohlรญลพeฤi karmy a poskytne stejnรฝ vรฝsledek, jakรฝ byl ukรกzรกn v pลedchozรญm tรฉmatu.
End to End testovรกnรญ aplikacรญ AngularJS JS
Rรกmec pro testovรกnรญ karmy spolu s rรกmcem nazvanรฝm Protractor mรก funkci testovรกnรญ webovรฉ aplikace od zaฤรกtku do konce.
Nejde tedy pouze o testovรกnรญ direktiv a kontrolรฉrลฏ, ale takรฉ testovรกnรญ ฤehokoli jinรฉho, โโco se mลฏลพe na strรกnce HTML objevit.
Podรญvejme se na pลรญklad, jak toho mลฏลพeme dosรกhnout.
V naลกem pลรญkladu nรญลพe budeme mรญt aplikaci AngularJS, kterรก vytvoลรญ datovou tabulku pomocรญ direktivy ng-repeat.
- Nejprve vytvoลรญme promฤnnou nazvanou โtutorialโ a v jednom kroku jรญ pลiลadรญme nฤkolik pรกrลฏ klรญฤโhodnota. Kaลพdรฝ pรกr klรญฤโhodnota bude pouลพit jako data pลi zobrazenรญ tabulky. Promฤnnรก tutoriรกlu je pak pลiลazena k objektu scope, takลพe k nรญ lze pลistupovat z naลกeho pohledu.
- Pro kaลพdรฝ ลรกdek dat v tabulce pouลพรญvรกme direktivu ng-repeat. Tato direktiva prochรกzรญ kaลพdรฝ pรกr klรญฤโhodnota v objektu rozsahu kurzu pomocรญ promฤnnรฉ ptutor.
- Nakonec pouลพรญvรกme tag spolu s pรกry klรญฤ-hodnota (ptutor.Name a ptutor.Description) pro zobrazenรญ dat tabulky.
<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"}
] });
Jakmile je vรฝลกe uvedenรฝ kรณd รบspฤลกnฤ proveden, dalลกรญm krokem by bylo vytvoลenรญ testovacรญho pลรญpadu, aby se zajistilo, ลพe kรณd byl napsรกn a proveden sprรกvnฤ. Kรณd pro nรกลก test bude vypadat nรญลพe
Nรกลก test ve skuteฤnosti otestuje direktivu ng-repeat a zajistรญ, ลพe obsahuje 3 ลรกdky dat, jak by mฤla z vรฝลกe uvedenรฉho pลรญkladu.
Nejprve se musรญme ujistit, ลพe jsou splnฤny nรกsledujรญcรญ pลedpoklady
Nainstalujte knihovnu รบhlomฤrลฏ pลes npm. To lze provรฉst spuลกtฤnรญm nรญลพe uvedenรฉho ลรกdku v pลรญkazovรฉm ลรกdku
"npm install protractor"
Kรณd pro nรกลก test bude vypadat nรญลพe.
Kรณd bude v samostatnรฉm souboru s nรกzvem CompleteTest.js , kterรฝ bude umรญstฤn ve sloลพce test. Nรญลพe uvedenรฝ kรณd dฤlรก pouze nรกsledujรญcรญ klรญฤovรฉ vฤci
- Funkce prohlรญลพeฤe je poskytovรกna knihovnou รบhlomฤrลฏ a pลedpoklรกdรก, ลพe naลกe aplikace AngularJS (s kรณdem uvedenรฝm vรฝลกe) bฤลพรญ na adrese URL naลกeho webu โ http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor v tutoriรกlu')); -Tento ลรกdek kรณdu ve skuteฤnosti naฤรญtรก direktivu ng-repeat, kterรก je vyplnฤna kรณdem 'ptutor in tutorial'. Element a by.repeater jsou speciรกlnรญ klรญฤovรก slova poskytovanรก knihovnou protractor, kterรก nรกm umoลพลuje zรญskat podrobnosti o direktivฤ ng-repeat.
- oฤekรกvat(seznam.poฤet()).rovnocen(3); โ Nakonec pouลพรญvรกme funkci oฤekรกvat, abychom vidฤli, ลพe v naลกรญ tabulce jsou skuteฤnฤ zaplลovรกny 3 poloลพky v dลฏsledku direktivy ng-repeat.
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); }); });
Vรฝลกe uvedenรฝ test se spustรญ v prohlรญลพeฤi karmy a poskytne stejnรฝ vรฝsledek, jakรฝ byl ukรกzรกn v pลedchozรญm tรฉmatu.
Shrnutรญ
- Testovรกnรญ v AngularJS se provรกdรญ pomocรญ rรกmce karma, rรกmce, kterรฝ vyvinul sรกm Google.
- Rรกmec karmy se instaluje pomocรญ sprรกvce balรญฤkลฏ uzlลฏ. Klรญฤovรฉ moduly, kterรฉ je nutnรฉ nainstalovat pro zรกkladnรญ testovรกnรญ, jsou karma, karma-chrom-launcher, karma-jasmรญn a karma-cli.
- Testy jsou zapsรกny v samostatnรฝch souborech js, kterรฉ se obvykle uchovรกvajรญ ve sloลพce test vaลกรญ aplikace. Umรญstฤnรญ tฤchto testovacรญch souborลฏ musรญ bรฝt uvedeno ve speciรกlnรญm konfiguraฤnรญm souboru s nรกzvem karma.conf.js. Karma pouลพรญvรก tento konfiguraฤnรญ soubor pลi provรกdฤnรญ vลกech testลฏ.
- Karmu lze takรฉ pouลพรญt k testovรกnรญ ovladaฤลฏ a vlastnรญch direktiv.
- Pro รบplnรฉ testovรกnรญ webu je tลeba nainstalovat dalลกรญ rรกmec zvanรฝ รบhlomฤr prostลednictvรญm sprรกvce balรญฤkลฏ Node. Tento rรกmec poskytuje speciรกlnรญ metody, kterรฉ lze pouลพรญt k testovรกnรญ vลกech prvkลฏ na strรกnce HTML.

