AngularJS Unit Testing: Karma Jasmine Tutorial

En af de mest geniale funktioner ved Angular.JS er Test aspekt. Da udviklerne hos Google udviklede AngularJS, blev de ved med at teste og sรธrgede for, at hele AngularJS-frameworket var testbart.

I AngularJS udfรธres test normalt ved hjรฆlp af Karma (ramme). Angular JS-test kan udfรธres uden Karma, men Karma-rammevรฆrket har en sรฅ genial funktionalitet til at teste AngularJS-kode, at det giver mening at bruge denne ramme.

  • I AngularJS kan vi optrรฆde Enhedstest separat for controllere og direktiver.
  • Vi kan ogsรฅ udfรธre end of end-test af AngularJS, som er test fra et brugerperspektiv.

Introduktion og installation af Karma framework

Karma er en test automatiseringsvรฆrktรธj oprettet af Angular JS-teamet hos Google. Det fรธrste trin for at bruge Karma er at installere Karma. Karma installeres via npm (som er en pakkehรฅndtering, der bruges til nem installation af moduler pรฅ en lokal maskine).

Installation af Karma

Installationen af โ€‹โ€‹Karma via npm sker i en to-trins proces.

Trin 1) Udfรธr nedenstรฅende linje fra kommandolinjen

npm install karma karma-chrome-launcher karma-jasmine

hvori,

  1. npm er kommandolinjevรฆrktรธjet til node-pakkehรฅndteringen, der bruges til at installere brugerdefinerede moduler pรฅ enhver maskine.
  2. Installationsparameteren instruerer kommandolinjevรฆrktรธjet npm om, at installation er pรฅkrรฆvet.
  3. Der er angivet 3 biblioteker i kommandolinjen, som er nรธdvendige for at arbejde med karma.
    • karma er kernebiblioteket, som vil blive brugt til testformรฅl.
    • karma-chrome-launcher er et separat bibliotek, som gรธr det muligt at genkende karma-kommandoer af chrome-browseren.
    • karma-jasmin โ€“ Dette installerer jasmin, som er en afhรฆngig ramme for karma.

Trin 2) Det nรฆste trin er at installere kommandolinjevรฆrktรธjet karma. Dette er nรธdvendigt for at udfรธre karma-linjekommandoer. Karmalinjevรฆrktรธjet vil blive brugt til at initialisere karmamiljรธet til test.

For at installere kommandolinjevรฆrktรธjet skal du udfรธre nedenstรฅende linje fra kommandolinjen

npm install karma-cli

hvori,

  • karma-cli bruges til at installere kommandolinjegrรฆnsefladen for karma, som vil blive brugt til at skrive karmakommandoer i kommandolinjegrรฆnsefladen.
  • Konfiguration af Karma-rammen

    Det nรฆste trin er at konfigurere karma, som kan udfรธres via kommandoen

    "karma โ€“init"

    Efter at ovenstรฅende trin er udfรธrt, vil karma oprette en karma.conf.js-fil. Filen vil sandsynligvis se ud som uddraget vist nedenfor

    files: [
      'Your application Name'/AngularJS/AngularJS.js',
      'Your application Name'/AngularJS-mocks/AngularJS-mocks.js',
      'lib/app.js',
      'tests/*.js'
    ]

    Ovenstรฅende konfigurationsfiler fortรฆller karma runtime-motoren fรธlgende ting

    1. 'Dit applikationsnavn' โ€“ Dette vil blive erstattet af navnet pรฅ din ansรธgning.
    2. 'Dit applikationsnavn'/AngularJS/AngularJS.js' โ€“ Dette fortรฆller karma, at din applikation afhรฆnger af kernemodulerne i AngularJS
    3. 'Dit applikationsnavn'/AngularJS-mocks/AngularJS-mocks.js' โ€“ Dette fortรฆller karma at bruge Unit Testing-funktionaliteten til AngularJS fra Angular.JS-mocks.js-filen.
    4. Alle hovedapplikations- eller forretningslogikfilerne er til stede i lib-mappen i din applikation.
    5. Testmappen vil indeholde alle enhedstestene.

    For at kontrollere, om karma virker, skal du oprette en fil kaldet Sample.js, indsรฆtte nedenstรฅende kode og placere den i testmappen.

    describe('Sample test', function() {
      it('Condition is true', function() {
        expect('AngularJS').toBe('AngularJS');
      });
    });

    Ovenstรฅende kode har fรธlgende aspekter

    1. Beskriv-funktionen bruges til at give en beskrivelse af testen. I vores tilfรฆlde giver vi beskrivelsen 'Sample test' til vores test.
    2. 'it'-funktionen bruges til at give et navn til testen. I vores tilfรฆlde angiver vi navnet pรฅ vores test som 'Betingelsen er sand'. Navnet pรฅ testen skal give mening.
    3. Kombinationen af โ€‹โ€‹sรธgeordet 'forvent' og 'toBe' angiver, hvad der er den forventede og faktiske vรฆrdi af testresultatet. Hvis den faktiske og forventede vรฆrdi er den samme, vil testen bestรฅ, ellers mislykkes den.

    Nรฅr du udfรธrer fรธlgende linje ved kommandoprompten, vil den udfรธre ovenstรฅende testfil

    KARMA start

    Nedenstรฅende output er taget fra IDE Webstorm hvor ovenstรฅende trin blev udfรธrt.

    Konfiguration af Karma Framework

    1. Outputtet kommer i Karma explorer indeni Webstorm. Dette vindue viser udfรธrelsen af โ€‹โ€‹alle test, som er defineret i karma-rammen.
    2. Her kan du se, at beskrivelsen af โ€‹โ€‹den udfรธrte test vises, som er "Sample test".
    3. Dernรฆst kan du se, at selve testen, som har navnet "Condition is true", er udfรธrt.
    4. Bemรฆrk, at da alle tests har det grรธnne "Ok"-ikon ved siden af, hvilket symboliserer, at alle tests bestรฅet.

    Test af AngularJS-controllere

    Karma-testrammen har ogsรฅ funktionaliteten til at teste controllere fra ende til anden. Dette inkluderer test af $scope-objektet, som bruges i controllere.

    Lad os se pรฅ et eksempel pรฅ, hvordan vi kan opnรฅ dette.

    I vores eksempel,

    Vi skal fรธrst definere en controller. Denne controller ville udfรธre de nedenstรฅende trin

    1. Opret en ID-variabel og tildel vรฆrdien 5 til den.
    2. Tildel ID-variablen til $scope-objektet.

    Vores test vil teste eksistensen af โ€‹โ€‹denne controller og ogsรฅ teste for at se, om ID-variablen for $scope-objektet er sat til 5.

    Fรธrst skal vi sikre, at fรธlgende forudsรฆtning er pรฅ plads

    Installer Angular.JS-mocks biblioteket via npm. Dette kan gรธres ved at udfรธre nedenstรฅende linje i kommandoprompten

    npm install Angular JS-mocks

    Det nรฆste er at รฆndre filen karma.conf.js for at sikre, at de rigtige filer er inkluderet til testen. Nedenstรฅende segment viser blot fildelen af โ€‹โ€‹karma.conf.js, som skal รฆndres

    files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
    • Parameteren 'filer' fortรฆller grundlรฆggende Karma alle de filer, der krรฆves til afviklingen af โ€‹โ€‹testene.
    • Filen AngularJS.js og AngularJS-mocks.js er pรฅkrรฆvet for at kรธre AngularJS-enhedstests
    • Filen index.js kommer til at indeholde vores kode til controlleren
    • Testmappen kommer til at indeholde alle vores AngularJS-tests

    Nedenfor er vores Angular.JS-kode, som vil blive gemt som en fil Index.js i testmappen i vores applikation.

    Nedenstรฅende kode gรธr bare fรธlgende ting

    1. Opret en AngularJS modul kaldet sampleApp
    2. Opret en controller kaldet AngularJSController
    3. Opret en variabel kaldet ID, giv den en vรฆrdi pรฅ 5 og tildel den til $scope-objektet
    var sampleApp = AngularJS.module('sampleApp',[]);
    sampleApp.controller('AngularJSController', function($scope) {
        $scope.ID =5;
    });

    Nรฅr ovenstรฅende kode er eksekveret med succes, ville nรฆste trin vรฆre at oprette en Test sag for at sikre, at koden er skrevet og udfรธrt korrekt.

    Koden til vores test vil vรฆre som vist nedenfor.

    Koden vil vรฆre i en separat fil kaldet ControllerTest.js, som vil blive placeret i testmappen. Nedenstรฅende kode gรธr blot fรธlgende vigtige ting

    1. beforeEach funktion โ€“ Denne funktion bruges til at indlรฆse vores AngularJS.JS modul kaldet 'sampleApp' fรธr testkรธrslen. Bemรฆrk, at dette er navnet pรฅ modulet i en index.js-fil.
    2. $controller objektet er oprettet som et mockup objekt for controlleren "Angular JSController", som er defineret i vores index.js fil. I enhver form for enhedstest reprรฆsenterer et falsk objekt et dummy-objekt, som faktisk vil blive brugt til testen. Dette falske objekt vil faktisk simulere vores controllers opfรธrsel.
    3. beforeEach(inject(function(_$controller_) โ€“ Dette bruges til at injicere det falske objekt i vores test, sรฅ det opfรธrer sig som den faktiske controller.
    4. var $omfang = {}; Dette er et falsk objekt, der oprettes for $scope objektet.
    5. var controller = $controller('AngularJSController', { $scope: $scope }); โ€“ Her tjekker vi for eksistensen af โ€‹โ€‹en controller ved navn 'Angular.JSController'. Her tildeler vi ogsรฅ alle variabler fra vores $scope-objekt i vores controller i Index.js-filen til $scope-objektet i vores testfil
    6. Til sidst sammenligner vi $scope.ID med 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);
            });
        });
    });

    Ovenstรฅende test vil kรธre i karma-browseren og give det samme bestรฅelsesresultat, som blev vist i det forrige emne.

    Test af AngularJS-direktiver

    Karma-testrammen har ogsรฅ funktionaliteten til at teste brugerdefinerede direktiver. Dette inkluderer templateURL'erne, som bruges i brugerdefinerede direktiver.

    Lad os se pรฅ et eksempel pรฅ, hvordan vi kan opnรฅ dette.

    I vores eksempel vil vi fรธrst definere et brugerdefineret direktiv, som gรธr fรธlgende

    1. Opret et AngularJS-modul kaldet sampleApp
    2. Opret et brugerdefineret direktiv med navnet - Guru99
    3. Opret en funktion, der returnerer en skabelon med et header-tag, der viser teksten "This is AngularJS Testing."
    var sampleApp = AngularJS.module('sampleApp',[]);
    sampleApp.directive('Guru99', function () {
        return {
            restrict: 'E',
            replace: true,
            template: '<h1>This is AngularJS Testing</h1>'
        };
    });

    Nรฅr ovenstรฅende kode er eksekveret med succes, ville nรฆste trin vรฆre at oprette en testcase for at sikre, at koden er skrevet og udfรธrt korrekt. Koden til vores test vil vรฆre som vist nedenfor

    Koden vil vรฆre i en separat fil kaldet DirektivTest.js, som vil blive placeret i testmappen. Nedenstรฅende kode gรธr blot fรธlgende vigtige ting

    1. beforeEach funktion โ€“ Denne funktion bruges til at indlรฆse vores Angular JS-modul kaldet 'sampleApp' fรธr testkรธrslen.
    2. Tjenesten $compile bruges til at kompilere direktivet. Denne service er obligatorisk og skal deklareres, sรฅ Angular.JS kan bruge den til at kompilere vores brugerdefinerede direktiv.
    3. $rootscope er det primรฆre omfang af enhver AngularJS.JS-applikation. Vi har set $scope-objektet for controlleren i tidligere kapitler. Nรฅ, $scope-objektet er det underordnede objekt af $rootscope-objektet. Grunden til, at dette erklรฆres her, er, at vi foretager en รฆndring af et faktisk HTML-tag i DOM via vores brugerdefinerede direktiv. Derfor er vi nรธdt til at bruge $rootscope-tjenesten, som faktisk lytter eller ved, hvornรฅr en รฆndring sker inde fra et HTML-dokument.
    4. var element = $compile(โ€œ โ€) โ€“ Dette bruges til at kontrollere, om vores direktiv bliver injiceret som det skal. Navnet pรฅ vores brugerdefinerede direktiv er Guru99, og vi ved fra vores brugerdefinerede direktivkapitel, at nรฅr direktivet injiceres i vores HTML, vil det blive injiceret som ' '. Derfor bruges denne erklรฆring til at foretage denne kontrol.
    5. expect(element.html()).toContain(โ€œThis is AngularJS Testingโ€) โ€“ Dette bruges til at instruere expect-funktionen om, at den skal finde elementet (i vores tilfรฆlde div-tagget) til at indeholde den indreHTML-tekst af โ€œThis is AngularJS-testningโ€.
    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");
      });
    });

    Ovenstรฅende test vil kรธre i karma-browseren og give det samme bestรฅelsesresultat, som blev vist i det forrige emne.

    End to End-testning af AngularJS JS-applikationer

    Karma-testrammerne sammen med en ramme kaldet Protractor har funktionaliteten til at teste en webapplikation fra ende til anden.

    Sรฅ det er ikke kun test af direktiver og controllere, men ogsรฅ test af alt andet, som kan dukke op pรฅ en HTML-side.

    Lad os se pรฅ et eksempel pรฅ, hvordan vi kan opnรฅ dette.

    I vores eksempel nedenfor vil vi have en AngularJS-applikation, som opretter en datatabel ved hjรฆlp af ng-repeat-direktivet.

    1. Vi opretter fรธrst en variabel kaldet "tutorial" og tildeler den nogle nรธglevรฆrdi-par i รฉt trin. Hvert nรธgle-vรฆrdi-par vil blive brugt som data, nรฅr tabellen vises. Selvstudievariablen tildeles derefter scope-objektet, sรฅ det kan tilgรฅs fra vores visning.
    2. For hver rรฆkke af data i tabellen bruger vi ng-repeat-direktivet. Dette direktiv gennemgรฅr hvert nรธglevรฆrdi-par i selvstudiets scope-objekt ved at bruge variablen ptutor.
    3. Endelig bruger vi tag sammen med nรธglevรฆrdiparrene (ptutor.Name og ptutor.Description) for at vise tabeldataene.
    <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"}
    			]   });

    Nรฅr ovenstรฅende kode er eksekveret med succes, ville nรฆste trin vรฆre at oprette en testcase for at sikre, at koden er skrevet og udfรธrt korrekt. Koden til vores test vil vรฆre som vist nedenfor

    Vores test vil faktisk teste ng-repeat-direktivet og sikre, at det indeholder 3 rรฆkker af data, som det skal fra ovenstรฅende eksempel.

    Fรธrst skal vi sikre, at fรธlgende forudsรฆtning er pรฅ plads

    Installer vinkelmรฅlerbiblioteket via npm. Dette kan gรธres ved at udfรธre nedenstรฅende linje i kommandoprompten

    "npm install protractor"

    Koden til vores test vil vรฆre som vist nedenfor.

    Koden vil vรฆre i en separat fil kaldet CompleteTest.js , som vil blive placeret i testmappen. Nedenstรฅende kode gรธr blot fรธlgende vigtige ting

    1. Browserfunktionen leveres af vinkelmรฅlerbiblioteket og antager, at vores AngularJS-applikation (med koden vist ovenfor) kรธrer pรฅ vores websteds URL - http://localhost:8080/Guru99/
    2. var list=element.all(by.repeater(ptutor i tutorial')); -Denne kodelinje henter faktisk ng-repeat-direktivet, som er udfyldt af koden 'ptutor in tutorial'. Elementet og by.repeater er specielle sรธgeord leveret af vinkelmรฅlerbiblioteket, der giver os mulighed for at fรฅ detaljer om ng-repeat-direktivet.
    3. forventer(liste.antal()).tilLige(3); โ€“ Til sidst bruger vi forventningsfunktionen til at se, at vi faktisk fรฅr 3 elementer udfyldt i vores tabel som fรธlge af ng-repeat-direktivet.
    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);  }); });

    Ovenstรฅende test vil kรธre i karma-browseren og give det samme bestรฅelsesresultat, som blev vist i det forrige emne.

    Resumรฉ

    • Test i AngularJS opnรฅs ved at bruge karma frameworket, et framework som er udviklet af Google selv.
    • Karma-rammen installeres ved hjรฆlp af node-pakkehรฅndteringen. Nรธglemodulerne, der skal installeres til grundlรฆggende test, er karma, karma-chrome-launcher, karma-jasmin og karma-cli.
    • Testene er skrevet i separate js-filer, som normalt opbevares i testmappen i din applikation. Placeringen af โ€‹โ€‹disse testfiler skal nรฆvnes i en speciel konfigurationsfil kaldet karma.conf.js. Karma bruger denne konfigurationsfil, nรฅr alle tests udfรธres.
    • Karma kan ogsรฅ bruges til at teste controllere og brugerdefinerede direktiver.
    • For en ende til ende webtest skal en anden ramme kaldet vinkelmรฅler installeres via Node, pakkehรฅndtering. Denne ramme giver specielle metoder, som kan bruges til at teste alle elementerne pรฅ en HTML-side.

    Opsummer dette indlรฆg med: