AngularJS Unit Testing: Karma Jasmine Tutorial
Una dintre cele mai strฤlucitoare caracteristici ale Angular.JS este Testarea aspect. Cรขnd dezvoltatorii de la Google au dezvoltat AngularJS, au ศinut cont de testare ศi s-au asigurat cฤ รฎntregul cadru AngularJS poate fi testat.
รn AngularJS, testarea este รฎn mod normal efectuatฤ folosind Karma (cadru). Testarea Angular JS poate fi efectuatฤ fฤrฤ Karma, dar cadrul Karma are o funcศionalitate atรขt de strฤlucitoare pentru testarea codului AngularJS, รฎncรขt are sens sฤ utilizaศi acest cadru.
- รn AngularJS, putem performa Testarea unitฤศii separat pentru controlori ศi directive.
- De asemenea, putem efectua testarea finalฤ a AngularJS, care este testarea din perspectiva utilizatorului.
Introducere ศi instalare a cadrului Karma
Karma este o instrument de automatizare de testare creat de echipa Angular JS de la Google. Primul pas pentru utilizarea Karma este instalarea Karma. Karma este instalat prin npm (care este un manager de pachete folosit pentru instalarea uศoarฤ a modulelor pe o maศinฤ localฤ).
Instalarea Karma
Instalarea Karma prin npm se face รฎntr-un proces รฎn doi paศi.
Pas 1) Executaศi linia de mai jos din linia de comandฤ
npm install karma karma-chrome-launcher karma-jasmine
รฎn care,
- npm este utilitarul de linie de comandฤ pentru managerul de pachete nod utilizat pentru instalarea modulelor personalizate pe orice maศinฤ.
- Parametrul de instalare indicฤ utilitarului de linie de comandฤ npm cฤ este necesarฤ instalarea.
- Existฤ 3 biblioteci specificate รฎn linia de comandฤ care sunt necesare pentru a lucra cu karma.
- karma este biblioteca de bazฤ care va fi folositฤ รฎn scopuri de testare.
- karma-chrome-launcher este o bibliotecฤ separatฤ care permite comenzilor karma sฤ fie recunoscute de browserul Chrome.
- karma-jasmine โ Aceasta instaleazฤ iasomie, care este un cadru dependent pentru Karma.
Pas 2) Urmฤtorul pas este sฤ instalaศi utilitarul de linie de comandฤ karma. Acest lucru este necesar pentru executarea comenzilor din linia karma. Utilitarul karma line va fi folosit pentru a iniศializa mediul karma pentru testare.
Pentru a instala utilitarul de linie de comandฤ, executaศi linia de mai jos din linia de comandฤ
npm install karma-cli
รฎn care,
Configurarea cadrului Karma
Urmฤtorul pas este configurarea karmei, care poate fi fฤcutฤ prin intermediul comenzii
"karma โinit"
Dupฤ ce pasul de mai sus este executat, karma va crea un fiศier karma.conf.js. Fiศierul va arฤta probabil ca fragmentul de mai jos
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Fiศierele de configurare de mai sus รฎi spun motorului de rulare karma urmฤtoarele lucruri
- โNumele aplicaศiei dvs.โ โ Acesta va fi รฎnlocuit cu numele aplicaศiei dvs.
- "Numele aplicaศiei dvs."/AngularJS/AngularJS.js" โ Acest lucru รฎi spune karmei cฤ aplicaศia dvs. depinde de modulele de bazฤ din AngularJS
- โNumele aplicaศiei dvs.โ/AngularJS-mocks/AngularJS-mocks.jsโ โ Aceasta รฎi spune karmei sฤ foloseascฤ funcศionalitatea Unit Testing pentru AngularJS din fiศierul Angular.JS-mocks.js.
- Toate fiศierele principale ale aplicaศiei sau ale logicii de afaceri sunt prezente รฎn folderul lib al aplicaศiei dvs.
- Dosarul de teste va conศine toate testele unitare.
Pentru a verifica dacฤ karma funcศioneazฤ, creaศi un fiศier numit Sample.js, introduceศi codul de mai jos ศi plasaศi-l รฎn directorul de testare.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Codul de mai sus are urmฤtoarele aspecte
- Funcศia descrie este folositฤ pentru a oferi o descriere a testului. รn cazul nostru, dฤm descrierea โSample testโ testului nostru.
- Funcศia โitโ este folositฤ pentru a da un nume testului. รn cazul nostru, dฤm numele testului nostru ca โCondiศia este adevฤratฤโ. Numele testului trebuie sฤ aibฤ sens.
- Combinaศia dintre cuvintele cheie โaศteptaศiโ ศi โtoBeโ indicฤ care este valoarea aศteptatฤ ศi realฤ a rezultatului testului. Dacฤ valoarea realฤ ศi cea aศteptatฤ este aceeaศi, atunci testul va trece, altfel va eศua.
Cรขnd executaศi urmฤtoarea linie la promptul de comandฤ, acesta va executa fiศierul de testare de mai sus
KARMA start
Ieศirea de mai jos este preluatฤ din IDE Webstorm รฎn care au fost efectuate etapele de mai sus.
- Ieศirea vine รฎn exploratorul Karma din interior Webstorm. Aceastฤ fereastrฤ aratฤ execuศia tuturor testelor care sunt definite รฎn cadrul karma.
- Aici puteศi vedea cฤ este afiศatฤ descrierea testului executat care este โSample testโ.
- Apoi, puteศi vedea cฤ testul รฎn sine, care are numele โCondiศia este adevฤratฤโ, este executat.
- Reศineศi cฤ, deoarece toate testele au lรขngฤ el pictograma verde โOkโ, care simbolizeazฤ cฤ toate testele au trecut.
Testarea controlerelor AngularJS
Cadrul de testare a karmei are, de asemenea, funcศionalitatea de a testa controlerele cap la cap. Aceasta include testarea obiectului $scope care este utilizat รฎn Controllers.
Sฤ ne uitฤm la un exemplu despre cum putem realiza acest lucru.
รn exemplul nostru,
Mai รฎntรขi ar trebui sฤ definim un controler. Acest controlor va efectua paศii menศionaศi mai jos
- Creaศi o variabilฤ ID ศi atribuiศi-i valoarea 5.
- Atribuiศi variabila ID obiectului $scope.
Testul nostru va testa existenศa acestui controler ศi, de asemenea, va testa pentru a vedea dacฤ variabila ID a obiectului $scope este setatฤ la 5.
Mai รฎntรขi trebuie sฤ ne asigurฤm cฤ este รฎndeplinitฤ urmฤtoarea cerinศฤ prealabilฤ
Instalaศi biblioteca Angular.JS-mocks prin npm. Acest lucru se poate face prin executarea liniei de mai jos รฎn promptul de comandฤ
npm install Angular JS-mocks
Urmฤtorul este sฤ modificaศi fiศierul karma.conf.js pentru a vฤ asigura cฤ fiศierele potrivite sunt incluse pentru test. Segmentul de mai jos aratฤ doar pฤrศile fiศierelor din karma.conf.js care trebuie modificate
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Parametrul โfiศiereโ รฎi spune practic Karma toate fiศierele care sunt necesare รฎn derularea testelor.
- Fiศierul AngularJS.js ศi AngularJS-mocks.js sunt necesare pentru a rula testele unitare AngularJS
- Fiศierul index.js va conศine codul nostru pentru controler
- Dosarul de testare va conศine toate testele noastre AngularJS
Mai jos este codul nostru Angular.JS care va fi stocat ca fiศier Index.js รฎn folderul de testare al aplicaศiei noastre.
Codul de mai jos face doar urmฤtoarele lucruri
- Creaศi o Modulul AngularJS numit sampleApp
- Creaศi un controler numit AngularJSController
- Creaศi o variabilฤ numitฤ ID, acordaศi-i o valoare de 5 ศi atribuiศi-o obiectului $scope
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Odatฤ ce codul de mai sus este executat cu succes, urmฤtorul pas ar fi crearea unui Caz de testare pentru a se asigura cฤ codul a fost scris ศi executat corect.
Codul pentru testul nostru va fi aศa cum se aratฤ mai jos.
Codul va fi รฎntr-un fiศier separat numit ControllerTest.js, care va fi plasat รฎn folderul de testare. Codul de mai jos face doar urmฤtoarele lucruri cheie
- beforeEach funcศia โ Aceastฤ funcศie este folositฤ pentru a รฎncฤrca modulul nostru AngularJS.JS numit โsampleAppโ รฎnainte de rularea testului. Reศineศi cฤ acesta este numele modulului dintr-un fiศier index.js.
- Obiectul $controller este creat ca obiect model pentru controlerul โAngular JSControllerโ, care este definit รฎn fiศierul nostru index.js. รn orice fel de testare unitarฤ, un obiect simulat reprezintฤ un obiect fals care va fi de fapt folosit pentru testare. Acest obiect simulat va simula de fapt comportamentul controlerului nostru.
- beforeEach(inject(function(_$controller_)) โ Acesta este folosit pentru a injecta obiectul simulat รฎn testul nostru, astfel รฎncรขt acesta sฤ se comporte ca controlerul real.
- var $scope = {}; Acesta este un obiect simulat care este creat pentru obiectul $scope.
- var controller = $controller('AngularJSColler', { $scope: $scope }); โ Aici verificฤm existenศa unui controler numit โAngular.JSControllerโ. Aici, de asemenea, atribuim toate variabilele de la obiectul nostru $scope din controlerul nostru din fiศierul Index.js obiectului $scope din fiศierul nostru de testare
- รn cele din urmฤ, comparฤm $scope.ID cu 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);
});
});
});
Testul de mai sus va rula รฎn browserul karma ศi va da acelaศi rezultat de trecere ca ศi รฎn subiectul anterior.
Testarea directivelor AngularJS
Cadrul de testare a karmei are, de asemenea, funcศionalitatea de a testa directivele personalizate. Aceasta include templateURL-urile care sunt utilizate รฎn cadrul directivelor personalizate.
Sฤ ne uitฤm la un exemplu despre cum putem realiza acest lucru.
รn exemplul nostru, vom defini mai รฎntรขi o directivฤ personalizatฤ care face urmฤtoarele lucruri
- Creaศi un modul AngularJS numit sampleApp
- Creaศi o directivฤ personalizatฤ cu numele โ Guru99
- Creaศi o funcศie care returneazฤ un ศablon cu o etichetฤ de antet care afiศeazฤ textul โAcesta este testarea AngularJSโ.
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Odatฤ ce codul de mai sus este executat cu succes, urmฤtorul pas ar fi crearea unui caz de testare pentru a vฤ asigura cฤ codul a fost scris ศi executat corect. Codul pentru testul nostru va fi aศa cum se aratฤ mai jos
Codul va fi รฎntr-un fiศier separat numit DirectiveTest.js, care va fi plasat รฎn folderul de testare. Codul de mai jos face doar urmฤtoarele lucruri cheie
- beforeEach function โ Aceastฤ funcศie este folositฤ pentru a รฎncฤrca modulul nostru Angular JS numit โsampleAppโ รฎnainte de rularea testului.
- Serviciul $compile este folosit pentru a compila directiva. Acest serviciu este obligatoriu ศi trebuie declarat pentru ca Angular.JS sฤ รฎl poatฤ utiliza pentru a compila directiva noastrฤ personalizatฤ.
- $rootscope este domeniul principal al oricฤrei aplicaศii AngularJS.JS. Am vฤzut obiectul $scope al controlerului รฎn capitolele anterioare. Ei bine, obiectul $scope este obiectul copil al obiectului $rootscope. Motivul pentru care acest lucru este declarat aici este pentru cฤ facem o modificare a unei etichete HTML reale รฎn DOM prin directiva noastrฤ personalizatฤ. Prin urmare, trebuie sฤ folosim serviciul $rootscope care de fapt ascultฤ sau ศtie cรขnd are loc vreo modificare dintr-un document HTML.
- element var = $compile(โ โ) โ Acesta este folosit pentru a verifica dacฤ directiva noastrฤ este injectatฤ aศa cum ar trebui. Numele directivei noastre personalizate este Guru99 ศi ศtim din capitolul privind directivele personalizate cฤ atunci cรขnd directiva este injectatฤ รฎn HTML, aceasta va fi injectatฤ ca โ '. Prin urmare, aceastฤ declaraศie este folositฤ pentru a face acea verificare.
- expect(element.html()).toContain(โAcesta este testarea AngularJSโ) โ Acesta este folosit pentru a instrui funcศia expect cฤ ar trebui sฤ gฤseascฤ elementul (รฎn cazul nostru eticheta div) sฤ conศinฤ textul HTML interior al โAcesta este Testarea 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");
});
});
Testul de mai sus va rula รฎn browserul karma ศi va da acelaศi rezultat de trecere ca ศi รฎn subiectul anterior.
Testarea de la capฤt la capฤt a aplicaศiilor AngularJS JS
Cadrul de testare a karmei รฎmpreunฤ cu un cadru numit Protractor are funcศionalitatea de a testa o aplicaศie web cap la cap.
Deci nu este vorba doar de testarea directivelor ศi controlerelor, ci ศi de testarea oricฤror altceva care poate apฤrea pe o paginฤ HTML.
Sฤ ne uitฤm la un exemplu despre cum putem realiza acest lucru.
รn exemplul nostru de mai jos, vom avea o aplicaศie AngularJS care creeazฤ un tabel de date folosind directiva ng-repeat.
- Mai รฎntรขi creฤm o variabilฤ numitฤ โtutorialโ ศi รฎi atribuim cรขteva perechi cheie-valoare รฎntr-un singur pas. Fiecare pereche cheie-valoare va fi folositฤ ca date la afiศarea tabelului. Variabila tutorial este apoi atribuitฤ obiectului scope, astfel รฎncรขt sฤ poatฤ fi accesatฤ din vizualizarea noastrฤ.
- Pentru fiecare rรขnd de date din tabel, folosim directiva ng-repeat. Aceastฤ directivฤ parcurge fiecare pereche cheie-valoare din obiectul domeniului tutorial folosind variabila ptutor.
- รn cele din urmฤ, folosim eticheta รฎmpreunฤ cu perechile valori-cheie (ptutor.Name ศi ptutor.Description) pentru a afiศa datele din tabel.
<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"}
] });
Odatฤ ce codul de mai sus este executat cu succes, urmฤtorul pas ar fi crearea unui caz de testare pentru a vฤ asigura cฤ codul a fost scris ศi executat corect. Codul pentru testul nostru va fi aศa cum se aratฤ mai jos
Testul nostru va testa de fapt directiva ng-repeat ศi va asigura cฤ conศine 3 rรขnduri de date aศa cum ar trebui din exemplul de mai sus.
Mai รฎntรขi trebuie sฤ ne asigurฤm cฤ este รฎndeplinitฤ urmฤtoarea cerinศฤ prealabilฤ
Instalaศi biblioteca raportorului prin npm. Acest lucru se poate face prin executarea liniei de mai jos รฎn promptul de comandฤ
"npm install protractor"
Codul pentru testul nostru va fi aศa cum se aratฤ mai jos.
Codul va fi รฎntr-un fiศier separat numit CompleteTest.js , care va fi plasat รฎn folderul de testare. Codul de mai jos face doar urmฤtoarele lucruri cheie
- Funcศia de browser este furnizatฤ de biblioteca raportorului ศi presupune cฤ aplicaศia noastrฤ AngularJS (cu codul afiศat mai sus) ruleazฤ pe adresa URL a site-ului nostru โ http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor รฎn tutorial')); -Aceastฤ linie de cod preia de fapt directiva ng-repeat care este populatฤ de codul โptutor รฎn tutorialโ. Elementul ศi by.repeater sunt cuvinte cheie speciale furnizate de biblioteca raportor care ne permite sฤ obศinem detalii despre directiva ng-repeat.
- aศteptaศi(listฤ.numฤr()).toEqual(3); โ รn cele din urmฤ, folosim funcศia expect pentru a vedea cฤ รฎntr-adevฤr primim 3 elemente populate รฎn tabelul nostru ca urmare a directivei 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); }); });
Testul de mai sus va rula รฎn browserul karma ศi va da acelaศi rezultat de trecere ca ศi รฎn subiectul anterior.
Rezumat
- Testarea รฎn AngularJS se realizeazฤ prin utilizarea cadrului karma, un cadru care a fost dezvoltat chiar de Google.
- Cadrul karma este instalat folosind managerul de pachete nod. Modulele cheie care trebuie instalate pentru testarea de bazฤ sunt karma, karma-chrome-launcher, karma-jasmine ศi karma-cli.
- Testele sunt scrise รฎn fiศiere js separate, pฤstrate รฎn mod normal รฎn folderul de testare al aplicaศiei dumneavoastrฤ. Locaศia acestor fiศiere de testare trebuie menศionatฤ รฎntr-un fiศier de configurare special numit karma.conf.js. Karma foloseศte acest fiศier de configurare atunci cรขnd executฤ toate testele.
- Karma poate fi folositฤ ศi pentru a testa controlerele ศi directivele personalizate.
- Pentru o testare web de la capฤt la capฤt, un alt cadru numit raportor trebuie sฤ fie instalat prin intermediul Node, manager de pachete. Acest cadru oferฤ metode speciale care pot fi folosite pentru a testa toate elementele dintr-o paginฤ HTML.

