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,

  1. npm este utilitarul de linie de comandฤƒ pentru managerul de pachete nod utilizat pentru instalarea modulelor personalizate pe orice maศ™inฤƒ.
  2. Parametrul de instalare indicฤƒ utilitarului de linie de comandฤƒ npm cฤƒ este necesarฤƒ instalarea.
  3. 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,

  • karma-cli este folosit pentru a instala interfaศ›a de linie de comandฤƒ pentru karma, care va fi folositฤƒ pentru a scrie comenzile karma รฎn interfaศ›a de linie de comandฤƒ.
  • 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

    1. โ€žNumele aplicaศ›iei dvs.โ€ โ€“ Acesta va fi รฎnlocuit cu numele aplicaศ›iei dvs.
    2. "Numele aplicaศ›iei dvs."/AngularJS/AngularJS.js" โ€“ Acest lucru รฎi spune karmei cฤƒ aplicaศ›ia dvs. depinde de modulele de bazฤƒ din AngularJS
    3. โ€ž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.
    4. Toate fiศ™ierele principale ale aplicaศ›iei sau ale logicii de afaceri sunt prezente รฎn folderul lib al aplicaศ›iei dvs.
    5. 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

    1. Funcศ›ia descrie este folositฤƒ pentru a oferi o descriere a testului. รŽn cazul nostru, dฤƒm descrierea โ€žSample testโ€ testului nostru.
    2. 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.
    3. 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.

    Configurarea cadrului Karma

    1. Ieศ™irea vine รฎn exploratorul Karma din interior Webstorm. Aceastฤƒ fereastrฤƒ aratฤƒ execuศ›ia tuturor testelor care sunt definite รฎn cadrul karma.
    2. Aici puteศ›i vedea cฤƒ este afiศ™atฤƒ descrierea testului executat care este โ€žSample testโ€.
    3. Apoi, puteศ›i vedea cฤƒ testul รฎn sine, care are numele โ€žCondiศ›ia este adevฤƒratฤƒโ€, este executat.
    4. 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

    1. Creaศ›i o variabilฤƒ ID ศ™i atribuiศ›i-i valoarea 5.
    2. 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

    1. Creaศ›i o Modulul AngularJS numit sampleApp
    2. Creaศ›i un controler numit AngularJSController
    3. 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

    1. 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.
    2. 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.
    3. 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.
    4. var $scope = {}; Acesta este un obiect simulat care este creat pentru obiectul $scope.
    5. 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
    6. รŽ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

    1. Creaศ›i un modul AngularJS numit sampleApp
    2. Creaศ›i o directivฤƒ personalizatฤƒ cu numele โ€“ Guru99
    3. 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

    1. beforeEach function โ€“ Aceastฤƒ funcศ›ie este folositฤƒ pentru a รฎncฤƒrca modulul nostru Angular JS numit โ€žsampleAppโ€ รฎnainte de rularea testului.
    2. 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ฤƒ.
    3. $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.
    4. 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.
    5. 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.

    1. 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ฤƒ.
    2. 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.
    3. รŽ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

    1. 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/
    2. 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.
    3. 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.

    Rezumaศ›i aceastฤƒ postare cu: