AngularJS Unit Testing: Karma Jasmine Tutorial
En av de mest briljanta funktionerna i Angular.JS รคr Testning aspekt. Nรคr utvecklarna pรฅ Google utvecklade AngularJS fortsatte de att testa och sรฅg till att hela AngularJS-ramverket var testbart.
I AngularJS utfรถrs testning normalt med Karma (framework). Angular JS-testning kan utfรถras utan Karma, men Karma-ramverket har en sรฅ lysande funktionalitet fรถr att testa AngularJS-kod, att det รคr vettigt att anvรคnda detta ramverk.
- I AngularJS kan vi upptrรคda Enhetstestning separat fรถr styrenheter och direktiv.
- Vi kan ocksรฅ utfรถra end of end-testning av AngularJS, vilket รคr testning ur ett anvรคndarperspektiv.
Introduktion och installation av Karma-ramverket
Karma รคr en testautomationsverktyg skapad av Angular JS-teamet pรฅ Google. Det fรถrsta steget fรถr att anvรคnda Karma รคr att installera Karma. Karma installeras via npm (som รคr en pakethanterare som anvรคnds fรถr enkel installation av moduler pรฅ en lokal maskin).
Installation av Karma
Installationen av Karma via npm gรถrs i en tvรฅstegsprocess.
Steg 1) Utfรถr raden nedan frรฅn kommandoraden
npm install karma karma-chrome-launcher karma-jasmine
Vart i,
- npm รคr kommandoradsverktyget fรถr nodpakethanteraren som anvรคnds fรถr att installera anpassade moduler pรฅ vilken maskin som helst.
- Installationsparametern instruerar kommandoradsverktyget npm att installation krรคvs.
- Det finns 3 bibliotek som anges pรฅ kommandoraden som krรคvs fรถr att arbeta med karma.
- karma รคr kรคrnbiblioteket som kommer att anvรคndas fรถr testรคndamรฅl.
- karma-chrome-launcher รคr ett separat bibliotek som gรถr att karma-kommandon kan identifieras av Chrome-webblรคsaren.
- karma-jasmin โ Detta installerar jasmin som รคr ett beroende ramverk fรถr karma.
Steg 2) Nรคsta steg รคr att installera kommandoradsverktyget karma. Detta krรคvs fรถr att utfรถra karma-linjekommandon. Karmalinjeverktyget kommer att anvรคndas fรถr att initiera karmamiljรถn fรถr testning.
Fรถr att installera kommandoradsverktyget, kรถr raden nedan frรฅn kommandoraden
npm install karma-cli
vart i,
Konfiguration av Karma-ramverket
Nรคsta steg รคr att konfigurera karma som kan gรถras via kommandot
"karma โinit"
Efter att steget ovan har utfรถrts kommer karma att skapa en karma.conf.js-fil. Filen kommer fรถrmodligen att se ut som utdraget som visas nedan
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Ovanstรฅende konfigurationsfiler berรคttar fรถr karma runtime-motorn fรถljande saker
- "Ditt program namn" โ Detta kommer att ersรคttas med namnet pรฅ din ansรถkan.
- 'Ditt program Namn'/AngularJS/AngularJS.js' โ Detta talar om fรถr karma att din applikation beror pรฅ kรคrnmodulerna i AngularJS
- 'Ditt programnamn'/AngularJS-mocks/AngularJS-mocks.js' โ Detta sรคger รฅt karma att anvรคnda enhetstestningsfunktionen fรถr AngularJS frรฅn filen Angular.JS-mocks.js.
- Alla huvudapplikations- eller affรคrslogikfiler finns i lib-mappen i din applikation.
- Testmappen kommer att innehรฅlla alla enhetstester.
Fรถr att kontrollera om karma fungerar, skapa en fil som heter Sample.js, lรคgg in koden nedan och placera den i testkatalogen.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Ovanstรฅende kod har fรถljande aspekter
- Beskriv-funktionen anvรคnds fรถr att ge en beskrivning av testet. I vรฅrt fall ger vi beskrivningen "Sample test" till vรฅrt test.
- Funktionen 'it' anvรคnds fรถr att ge testet ett namn. I vรฅrt fall anger vi namnet pรฅ vรฅrt test som "villkoret รคr sant". Namnet pรฅ testet mรฅste vara meningsfullt.
- Kombinationen av nyckelorden 'fรถrvรคnta' och 'toBe' anger vad som รคr det fรถrvรคntade och faktiska vรคrdet av testresultatet. Om det faktiska och fรถrvรคntade vรคrdet รคr detsamma, kommer testet att klara, annars misslyckas det.
Nรคr du kรถr fรถljande rad vid kommandotolken kommer den att kรถra ovanstรฅende testfil
KARMA start
Utdata nedan รคr hรคmtad frรฅn IDE Webstorm dรคr ovanstรฅende steg utfรถrdes.
- Utdata kommer i Karma explorer inom Webstorm. Detta fรถnster visar utfรถrandet av alla tester som รคr definierade i karma-ramverket.
- Hรคr kan du se att beskrivningen av det utfรถrda testet visas som รคr "Sample test".
- Dรคrefter kan du se att sjรคlva testet som har namnet "Condition is true" exekveras.
- Observera att eftersom alla tester har den grรถna "Ok"-ikonen bredvid sig som symboliserar att alla tester รคr godkรคnda.
Testar AngularJS-kontroller
Karmatestramverket har ocksรฅ funktionen att testa Controllers frรฅn bรถrjan till slut. Detta inkluderar testning av $scope-objektet som anvรคnds inom Controllers.
Lรฅt oss titta pรฅ ett exempel pรฅ hur vi kan uppnรฅ detta.
I vรฅrt exempel,
Vi skulle fรถrst behรถva definiera en styrenhet. Denna styrenhet skulle utfรถra de nedan nรคmnda stegen
- Skapa en ID-variabel och tilldela vรคrdet 5 till den.
- Tilldela ID-variabeln till $scope-objektet.
Vรฅrt test kommer att testa fรถrekomsten av denna kontroller och รคven testa fรถr att se om ID-variabeln fรถr $scope-objektet รคr instรคlld pรฅ 5.
Fรถrst mรฅste vi se till att fรถljande fรถrutsรคttning รคr pรฅ plats
Installera Angular.JS-mocks-biblioteket via npm. Detta kan gรถras genom att utfรถra raden nedan i kommandotolken
npm install Angular JS-mocks
Nรคsta รคr att modifiera filen karma.conf.js fรถr att sรคkerstรคlla att rรคtt filer ingรฅr fรถr testet. Segmentet nedan visar bara fildelen av karma.conf.js som behรถver modifieras
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Parametern 'filer' berรคttar i princip fรถr Karma alla filer som krรคvs fรถr att kรถra testerna.
- Filerna AngularJS.js och AngularJS-mocks.js krรคvs fรถr att kรถra AngularJS enhetstester
- Filen index.js kommer att innehรฅlla vรฅr kod fรถr styrenheten
- Testmappen kommer att innehรฅlla alla vรฅra AngularJS-tester
Nedan finns vรฅr Angular.JS-kod som kommer att lagras som en fil Index.js i testmappen i vรฅr applikation.
Koden nedan gรถr bara fรถljande saker
- Skapa ett AngularJS-modul kallas sampleApp
- Skapa en kontroller som heter AngularJSController
- Skapa en variabel som heter ID, ge den vรคrdet 5 och tilldela den till $scope-objektet
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Nรคr ovanstรฅende kod har kรถrts framgรฅngsrikt, skulle nรคsta steg vara att skapa en Testfall fรถr att sรคkerstรคlla att koden har skrivits och kรถrts korrekt.
Koden fรถr vรฅrt test kommer att vara som visas nedan.
Koden kommer att finnas i en separat fil som heter ControllerTest.js, som kommer att placeras i testmappen. Koden nedan gรถr bara fรถljande viktiga saker
- beforeEach funktion โ Denna funktion anvรคnds fรถr att ladda vรฅr AngularJS.JS-modul som heter 'sampleApp' innan testkรถrningen. Observera att detta รคr namnet pรฅ modulen i en index.js-fil.
- $controller-objektet skapas som ett mockup-objekt fรถr styrenheten โAngular JSControllerโ som definieras i vรฅr index.js-fil. I vilken typ av enhetstestning som helst representerar ett skenobjekt ett dummyobjekt som faktiskt kommer att anvรคndas fรถr testet. Detta skenobjekt kommer faktiskt att simulera beteendet hos vรฅr kontroller.
- beforeEach(inject(function(_$controller_) โ Detta anvรคnds fรถr att injicera skenobjektet i vรฅrt test sรฅ att det beter sig som den faktiska kontrollern.
- var $scope = {}; Detta รคr ett skenobjekt som skapas fรถr $scope-objektet.
- var controller = $controller('AngularJSController', { $scope: $scope }); โ Hรคr kontrollerar vi om det finns en styrenhet som heter 'Angular.JSController'. Hรคr tilldelar vi ocksรฅ alla variabler frรฅn vรฅrt $scope-objekt i vรฅr styrenhet i Index.js-filen till $scope-objektet i vรฅr testfil
- Slutligen jรคmfรถr 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);
});
});
});
Ovanstรฅende test kรถrs i karma-webblรคsaren och ger samma godkรคnt resultat som visades i fรถregรฅende avsnitt.
Testa AngularJS-direktiv
Ramverket fรถr karmatestning har ocksรฅ funktionen att testa anpassade direktiv. Detta inkluderar mallURL:erna som anvรคnds inom anpassade direktiv.
Lรฅt oss titta pรฅ ett exempel pรฅ hur vi kan uppnรฅ detta.
I vรฅrt exempel kommer vi fรถrst att definiera ett anpassat direktiv som gรถr fรถljande saker
- Skapa en AngularJS-modul som heter sampleApp
- Skapa ett anpassat direktiv med namnet - Guru99
- Skapa en funktion som returnerar en mall med en header-tagg som visar texten "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 koden ovan har exekveras framgรฅngsrikt, skulle nรคsta steg vara att skapa ett testfall fรถr att sรคkerstรคlla att koden har skrivits och exekveras korrekt. Koden fรถr vรฅrt test kommer att vara som visas nedan
Koden kommer att finnas i en separat fil som heter DirectTest.js, som kommer att placeras i testmappen. Koden nedan gรถr bara fรถljande viktiga saker
- beforeEach function โ Denna funktion anvรคnds fรถr att ladda vรฅr Angular JS-modul som heter 'sampleApp' innan testkรถrningen.
- Tjรคnsten $compile anvรคnds fรถr att kompilera direktivet. Denna tjรคnst รคr obligatorisk och mรฅste deklareras sรฅ att Angular.JS kan anvรคnda den fรถr att sammanstรคlla vรฅrt anpassade direktiv.
- $rootscope รคr det primรคra omfรฅnget fรถr alla AngularJS.JS-applikationer. Vi har sett $scope-objektet fรถr kontrollern i tidigare kapitel. Tja, $scope-objektet รคr det underordnade objektet till $rootscope-objektet. Anledningen till att detta deklareras hรคr รคr att vi gรถr en รคndring av en faktisk HTML-tagg i DOM via vรฅrt anpassade direktiv. Dรคrfรถr mรฅste vi anvรคnda $rootscope-tjรคnsten som faktiskt lyssnar eller vet nรคr nรฅgon fรถrรคndring sker inifrรฅn ett HTML-dokument.
- var element = $compile(โ โ) โ Detta anvรคnds fรถr att kontrollera om vรฅrt direktiv injiceras som det ska. Namnet pรฅ vรฅrt anpassade direktiv รคr Guru99, och vi vet frรฅn kapitlet med anpassade direktiv att nรคr direktivet injiceras i vรฅr HTML, kommer det att injiceras som ' '. Dรคrfรถr anvรคnds detta uttalande fรถr att gรถra den kontrollen.
- expect(element.html()).toContain(โDetta รคr AngularJS-testningโ) โ Detta anvรคnds fรถr att instruera expect-funktionen att den ska hitta elementet (i vรฅrt fall div-taggen) fรถr att innehรฅlla innerHTML-texten i โ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");
});
});
Ovanstรฅende test kรถrs i karma-webblรคsaren och ger samma godkรคnt resultat som visades i fรถregรฅende avsnitt.
End to End-testning AngularJS JS-applikationer
Ramverket fรถr karmatestning tillsammans med ett ramverk som heter Protractor har funktionen att testa en webbapplikation frรฅn bรถrjan till slut.
Sรฅ det รคr inte bara testning av direktiv och kontroller, utan รคven testning av allt annat som kan dyka upp pรฅ en HTML-sida.
Lรฅt oss titta pรฅ ett exempel pรฅ hur vi kan uppnรฅ detta.
I vรฅrt exempel nedan kommer vi att ha en AngularJS-applikation som skapar en datatabell med ng-repeat-direktivet.
- Vi skapar fรถrst en variabel som heter "tutorial" och tilldelar den nรฅgra nyckel-vรคrdepar i ett steg. Varje nyckel-vรคrdepar kommer att anvรคndas som data nรคr tabellen visas. Handledningsvariabeln tilldelas sedan scope-objektet sรฅ att den kan nรฅs frรฅn vรฅr vy.
- Fรถr varje rad med data i tabellen anvรคnder vi direktivet ng-repeat. Detta direktiv gรฅr igenom varje nyckel-vรคrdepar i tutorial scope-objektet med hjรคlp av variabeln ptutor.
- Slutligen anvรคnder vi tagga tillsammans med nyckelvรคrdeparen (ptutor.Name och ptutor.Description) fรถr att visa tabelldata.
<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 koden ovan har exekveras framgรฅngsrikt, skulle nรคsta steg vara att skapa ett testfall fรถr att sรคkerstรคlla att koden har skrivits och exekveras korrekt. Koden fรถr vรฅrt test kommer att vara som visas nedan
Vรฅrt test kommer faktiskt att testa direktivet ng-repeat och sรคkerstรคlla att det innehรฅller 3 rader med data som det ska frรฅn exemplet ovan.
Fรถrst mรฅste vi se till att fรถljande fรถrutsรคttning รคr pรฅ plats
Installera proffsettractor-biblioteket via npm. Detta kan gรถras genom att kรถra raden nedan i kommandotolken
"npm install protractor"
Koden fรถr vรฅrt test kommer att vara som visas nedan.
Koden kommer att finnas i en separat fil som heter CompleteTest.js , som kommer att placeras i testmappen. Koden nedan gรถr bara fรถljande viktiga saker
- Webblรคsarfunktionen tillhandahรฅlls av proffsentractor-biblioteket och antar att vรฅr AngularJS-applikation (med koden som visas ovan) kรถrs pรฅ vรฅr webbplats-URL โ http://localhost:8080/Guru99/
- var list=element.all(by.repeater(ptutor in tutorial')); -Denna kodrad hรคmtar faktiskt ng-repeat-direktivet som fylls i med koden 'ptutor in tutorial'. Elementet och by.repeater รคr speciella nyckelord som tillhandahรฅlls av proen.tractor-bibliotek som lรฅter oss fรฅ detaljer om ng-repeat-direktivet.
- fรถrvรคnta(list.count()).toEqual(3); โ Slutligen anvรคnder vi fรถrvรคnta-funktionen fรถr att se att vi verkligen fรฅr 3 poster som fylls i vรฅr tabell som ett resultat av 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); }); });
Ovanstรฅende test kรถrs i karma-webblรคsaren och ger samma godkรคnt resultat som visades i fรถregรฅende avsnitt.
Sammanfattning
- Testning i AngularJS uppnรฅs genom att anvรคnda karma-ramverket, ett ramverk som har utvecklats av Google sjรคlv.
- Karma-ramverket installeras med hjรคlp av nodpakethanteraren. Nyckelmodulerna som krรคvs fรถr att installeras fรถr grundlรคggande testning รคr karma, karma-chrome-launcher, karma-jasmine och karma-cli.
- Testerna รคr skrivna i separata js-filer, normalt lagrade i testmappen i din applikation. Placeringen av dessa testfiler mรฅste anges i en speciell konfigurationsfil som heter karma.conf.js. Karma anvรคnder denna konfigurationsfil nรคr alla tester utfรถrs.
- Karma kan ocksรฅ anvรคndas fรถr att testa styrenheter och anpassade direktiv.
- Fรถr heltรคckande webbtestning, ett annat ramverk som kallas protractor behรถver installeras via Node, pakethanteraren. Detta ramverk tillhandahรฅller speciella metoder som kan anvรคndas fรถr att testa alla element pรฅ en HTML-sida.

