AngularJS Unit Testing: Karma Jasmine Tutorial
Eine der brillantesten Funktionen von Angular.JS ist die Tests Aspekt. Wenn die Entwickler bei Google Bei der Entwicklung von AngularJS wurde stets auf Testbarkeit geachtet und sichergestellt, dass das gesamte AngularJS-Framework testbar ist.
In AngularJS erfolgt das Testen normalerweise mit Karma (Framework). Angular JS-Tests kรถnnen ohne Karma durchgefรผhrt werden, aber das Karma-Framework verfรผgt รผber eine so brillante Funktionalitรคt zum Testen von AngularJS-Code, dass es sinnvoll ist, dieses Framework zu verwenden.
- In AngularJS kรถnnen wir ausfรผhren Unit Tests getrennt fรผr Controller und Anweisungen.
- Wir kรถnnen auch End-of-End-Tests von AngularJS durchfรผhren, also Tests aus Benutzerperspektive.
Einfรผhrung und Installation des Karma-Frameworks
Karma ist ein Testautomatisierungstool erstellt vom Angular JS-Team bei GoogleDer erste Schritt zur Verwendung von Karma ist die Installation von Karma. Karma wird รผber npm installiert (ein Paketmanager zur einfachen Installation von Modulen auf dem lokalen Rechner).
Installation von Karma
Die Installation von Karma รผber npm erfolgt in einem zweistufigen Prozess.
Schritt 1) Fรผhren Sie die folgende Zeile in der Befehlszeile aus
npm install karma karma-chrome-launcher karma-jasmine
Worin,
- npm ist das Befehlszeilendienstprogramm fรผr den Node-Paketmanager, mit dem benutzerdefinierte Module auf jedem Computer installiert werden kรถnnen.
- Der Installationsparameter weist das npm-Befehlszeilendienstprogramm an, dass eine Installation erforderlich ist.
- In der Befehlszeile werden drei Bibliotheken angegeben, die fรผr die Arbeit mit Karma erforderlich sind.
- Karma ist die Kernbibliothek, die zu Testzwecken verwendet wird.
- Karma-Chrome-Launcher ist eine separate Bibliothek, die es ermรถglicht, Karma-Befehle vom Chrome-Browser zu erkennen.
- karma-jasmine โ Dadurch wird Jasmin installiert, ein abhรคngiges Framework fรผr Karma.
Schritt 2) Der nรคchste Schritt besteht darin, das Karma-Befehlszeilenprogramm zu installieren. Dies ist fรผr die Ausfรผhrung von Karma-Zeilenbefehlen erforderlich. Das Karma-Line-Dienstprogramm wird verwendet, um die Karma-Umgebung zum Testen zu initialisieren.
Um das Befehlszeilenprogramm zu installieren, fรผhren Sie die folgende Zeile in der Befehlszeile aus
npm install karma-cli
worin,
Konfiguration des Karma-Frameworks
Der nรคchste Schritt besteht darin, Karma zu konfigurieren, was รผber den Befehl erfolgen kann
"karma โinit"
Nachdem der obige Schritt ausgefรผhrt wurde, erstellt Karma eine Datei karma.conf.js. Die Datei wird wahrscheinlich wie der unten gezeigte Ausschnitt aussehen
files: [ 'Your application Name'/AngularJS/AngularJS.js', 'Your application Name'/AngularJS-mocks/AngularJS-mocks.js', 'lib/app.js', 'tests/*.js' ]
Die obigen Konfigurationsdateien teilen der Karma-Runtime-Engine Folgendes mit
- โIhr Anwendungsnameโ โ Dies wird durch den Namen Ihrer Bewerbung ersetzt.
- 'Ihr Anwendungsname'/AngularJS/AngularJS.js' โ Dies sagt Karma, dass Ihre Anwendung von den Kernmodulen in AngularJS abhรคngt
- โIhr Anwendungsnameโ/AngularJS-mocks/AngularJS-mocks.jsโ โ Dadurch wird Karma angewiesen, die Unit-Testing-Funktionalitรคt fรผr AngularJS aus der Datei Angular.JS-mocks.js zu verwenden.
- Alle Hauptanwendungs- oder Geschรคftslogikdateien sind im lib-Ordner Ihrer Anwendung vorhanden.
- Der Testordner enthรคlt alle Komponententests.
Um zu รผberprรผfen, ob Karma funktioniert, erstellen Sie eine Datei namens Sample.js, geben Sie den folgenden Code ein und legen Sie ihn im Testverzeichnis ab.
describe('Sample test', function() {
it('Condition is true', function() {
expect('AngularJS').toBe('AngularJS');
});
});
Der obige Code hat die folgenden Aspekte
- Die Funktion โbeschreibenโ wird verwendet, um eine Beschreibung des Tests zu geben. In unserem Fall geben wir unserem Test die Bezeichnung โBeispieltestโ.
- Die Funktion โitโ wird verwendet, um dem Test einen Namen zu geben. In unserem Fall nennen wir unseren Test โBedingung ist wahrโ. Der Name des Tests muss aussagekrรคftig sein.
- Die Kombination der Schlรผsselwรถrter โexpectโ und โtoBeโ gibt Auskunft รผber den erwarteten und tatsรคchlichen Wert des Testergebnisses. Wenn der tatsรคchliche und der erwartete Wert gleich sind, wird der Test bestanden, andernfalls schlรคgt er fehl.
Wenn Sie die folgende Zeile in der Eingabeaufforderung ausfรผhren, wird die obige Testdatei ausgefรผhrt
KARMA start
Die folgende Ausgabe stammt aus der IDE Webstorm in dem die oben genannten Schritte durchgefรผhrt wurden.
- Die Ausgabe erfolgt im Karma-Explorer Webstorm. Dieses Fenster zeigt die Ausfรผhrung aller Tests, die im Karma-Framework definiert sind.
- Hier sehen Sie, dass die Beschreibung des durchgefรผhrten Tests angezeigt wird, nรคmlich โBeispieltestโ.
- Als Nรคchstes kรถnnen Sie sehen, dass der Test selbst mit dem Namen โBedingung ist wahrโ ausgefรผhrt wird.
- Beachten Sie, dass neben allen Tests das grรผne โOkโ-Symbol angezeigt wird, das symbolisiert, dass alle Tests bestanden wurden.
Testen von AngularJS-Controllern
Das Karma-Test-Framework verfรผgt auch รผber die Funktionalitรคt, Controller durchgรคngig zu testen. Dazu gehรถrt das Testen des $scope-Objekts, das in Controllern verwendet wird.
Schauen wir uns ein Beispiel an, wie wir dies erreichen kรถnnen.
In unserem Beispiel,
Zuerst mรผssten wir einen Controller definieren. Dieser Controller wรผrde die unten aufgefรผhrten Schritte ausfรผhren
- Erstellen Sie eine ID-Variable und weisen Sie ihr den Wert 5 zu.
- Weisen Sie die ID-Variable dem $scope-Objekt zu.
Unser Test testet die Existenz dieses Controllers und prรผft auch, ob die ID-Variable des $scope-Objekts auf 5 gesetzt ist.
Zunรคchst mรผssen wir sicherstellen, dass die folgende Voraussetzung erfรผllt ist
Installieren Sie die Angular.JS-mocks-Bibliothek รผber npm. Dies kann durch Ausfรผhren der folgenden Zeile in der Eingabeaufforderung erfolgen
npm install Angular JS-mocks
Als Nรคchstes mรผssen Sie die Datei karma.conf.js รคndern, um sicherzustellen, dass die richtigen Dateien fรผr den Test enthalten sind. Das folgende Segment zeigt nur den Dateiteil von karma.conf.js, der geรคndert werden muss
files: ['lib/AngularJS.js','lib/AngularJS-mocks.js','lib/index.js','test/*.js']
- Der Parameter โfilesโ teilt Karma grundsรคtzlich alle Dateien mit, die fรผr die Ausfรผhrung der Tests erforderlich sind.
- Die Dateien AngularJS.js und AngularJS-mocks.js sind erforderlich, um AngularJS-Komponententests auszufรผhren
- Die Datei index.js wird unseren Code fรผr den Controller enthalten
- Der Testordner enthรคlt alle unsere AngularJS-Tests
Nachfolgend finden Sie unseren Angular.JS-Code, der als Datei Index.js im Testordner unserer Anwendung gespeichert wird.
Der folgende Code fรผhrt lediglich die folgenden Dinge aus
- Erstellen Sie ein AngularJS-Modul namens sampleApp
- Erstellen Sie einen Controller namens AngularJSController
- Erstellen Sie eine Variable namens ID, geben Sie ihr den Wert 5 und weisen Sie sie dem $scope-Objekt zu
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.controller('AngularJSController', function($scope) {
$scope.ID =5;
});
Sobald der obige Code erfolgreich ausgefรผhrt wurde, besteht der nรคchste Schritt darin, einen zu erstellen Testfall um sicherzustellen, dass der Code ordnungsgemรคร geschrieben und ausgefรผhrt wurde.
Der Code fรผr unseren Test sieht wie folgt aus.
Der Code befindet sich in einer separaten Datei namens ControllerTest.js, die im Testordner abgelegt wird. Der folgende Code fรผhrt lediglich die folgenden wichtigen Dinge aus:
- beforeEach-Funktion โ Diese Funktion wird verwendet, um unser AngularJS.JS-Modul namens โsampleAppโ vor dem Testlauf zu laden. Beachten Sie, dass dies der Name des Moduls in einer index.js-Datei ist.
- Das $controller-Objekt wird als Mockup-Objekt fรผr den Controller โAngular JSControllerโ erstellt, der in unserer Datei index.js definiert ist. Bei jeder Art von Unit-Test stellt ein Scheinobjekt ein Dummy-Objekt dar, das tatsรคchlich fรผr den Test verwendet wird. Dieses Scheinobjekt simuliert tatsรคchlich das Verhalten unseres Controllers.
- beforeEach(inject(function(_$controller_) โ Dies wird verwendet, um das Scheinobjekt in unserem Test einzufรผgen, damit es sich wie der tatsรคchliche Controller verhรคlt.
- var $scope = {}; Dies ist ein Scheinobjekt, das fรผr das $scope-Objekt erstellt wird.
- var controller = $controller('AngularJSController', { $scope: $scope }); โ Hier prรผfen wir die Existenz eines Controllers namens โAngular.JSControllerโ. Hier weisen wir auch alle Variablen aus unserem $scope-Objekt in unserem Controller in der Index.js-Datei dem $scope-Objekt in unserer Testdatei zu
- Abschlieรend vergleichen wir die $scope.ID mit 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);
});
});
});
Der obige Test wird im Karma-Browser ausgefรผhrt und liefert das gleiche bestandene Ergebnis wie im vorherigen Thema.
Testen von AngularJS-Direktiven
Das Karma-Testframework bietet auch die Mรถglichkeit, benutzerdefinierte Direktiven zu testen. Dies umfasst die Vorlage.URL's, die innerhalb benutzerdefinierter Direktiven verwendet werden.
Schauen wir uns ein Beispiel an, wie wir dies erreichen kรถnnen.
In unserem Beispiel definieren wir zunรคchst eine benutzerdefinierte Direktive, die folgende Dinge tut
- Erstellen Sie ein AngularJS-Modul namens โsampleAppโ.
- Erstellen Sie eine benutzerdefinierte Direktive mit dem Namen โ Guru99
- Erstellen Sie eine Funktion, die eine Vorlage mit einem Header-Tag zurรผckgibt, das den Text โThis is AngularJS Testingโ anzeigt.
var sampleApp = AngularJS.module('sampleApp',[]);
sampleApp.directive('Guru99', function () {
return {
restrict: 'E',
replace: true,
template: '<h1>This is AngularJS Testing</h1>'
};
});
Sobald der obige Code erfolgreich ausgefรผhrt wurde, besteht der nรคchste Schritt darin, einen Testfall zu erstellen, um sicherzustellen, dass der Code ordnungsgemรคร geschrieben und ausgefรผhrt wurde. Der Code fรผr unseren Test sieht wie folgt aus
Der Code befindet sich in einer separaten Datei namens DirectiveTest.js, die im Testordner abgelegt wird. Der folgende Code fรผhrt lediglich die folgenden wichtigen Aufgaben aus:
- beforeEach-Funktion โ Diese Funktion wird verwendet, um unser Angular JS-Modul namens โsampleAppโ vor dem Testlauf zu laden.
- Der Dienst $compile wird zum Kompilieren der Direktive verwendet. Dieser Dienst ist obligatorisch und muss deklariert werden, damit Angular.JS ihn zum Kompilieren unserer benutzerdefinierten Direktive verwenden kann.
- Der $rootscope ist der primรคre Bereich jeder AngularJS.JS-Anwendung. Wir haben das $scope-Objekt des Controllers in frรผheren Kapiteln gesehen. Nun, das $scope-Objekt ist das untergeordnete Objekt des $rootscope-Objekts. Der Grund dafรผr, dass dies hier deklariert wird, liegt darin, dass wir รผber unsere benutzerdefinierte Direktive eine รnderung an einem tatsรคchlichen HTML-Tag im DOM vornehmen. Daher mรผssen wir den Dienst $rootscope verwenden, der tatsรคchlich abhรถrt oder weiร, wann in einem HTML-Dokument รnderungen vorgenommen werden.
- var element = $compile(โGuru99>Guru99>โ) โ Dies dient der รberprรผfung, ob unsere Direktive wie vorgesehen eingefรผgt wird. Der Name unserer benutzerdefinierten Direktive lautet: Guru99, und wir wissen aus unserem Kapitel รผber benutzerdefinierte Direktiven, dass die Direktive beim Einfรผgen in unser HTML als โโ eingefรผgt wird.Guru99>Guru99>'. Daher wird diese Anweisung verwendet, um diese รberprรผfung durchzufรผhren.
- expect(element.html()).toContain(โThis is AngularJS Testingโ) โ Dies wird verwendet, um die Expect-Funktion anzuweisen, das Element (in unserem Fall das div-Tag) zu finden, das den innerHTML-Text von โThis isโ enthรคlt AngularJS-Testsโ.
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");
});
});
Der obige Test wird im Karma-Browser ausgefรผhrt und liefert das gleiche bestandene Ergebnis wie im vorherigen Thema.
End-to-End-Test von AngularJS-JS-Anwendungen
Das Karma-Testing-Framework zusammen mit einem Framework namens ProtracTor bietet die Funktionalitรคt, eine Webanwendung von Anfang bis Ende zu testen.
Es geht also nicht nur um das Testen von Anweisungen und Controllern, sondern auch um das Testen von allem anderen, was auf einer HTML-Seite erscheinen kann.
Schauen wir uns ein Beispiel an, wie wir dies erreichen kรถnnen.
In unserem Beispiel unten haben wir eine AngularJS-Anwendung, die mithilfe der ng-repeat-Direktive eine Datentabelle erstellt.
- Wir erstellen zunรคchst eine Variable namens โtutorialโ und weisen ihr in einem Schritt einige Schlรผssel-Wert-Paare zu. Jedes Schlรผssel-Wert-Paar wird bei der Anzeige der Tabelle als Daten verwendet. Die Tutorial-Variable wird dann dem Scope-Objekt zugewiesen, sodass aus unserer Sicht darauf zugegriffen werden kann.
- Fรผr jede Datenzeile in der Tabelle verwenden wir die Direktive ng-repeat. Diese Anweisung durchlรคuft jedes Schlรผssel-Wert-Paar im Tutorial-Bereichsobjekt mithilfe der Variablen ptutor.
- Schlieรlich verwenden wir die Tag zusammen mit den Schlรผssel-Wert-Paaren (ptutor.Name und ptutor.Description), um die Tabellendaten anzuzeigen.
<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"}
] });
Sobald der obige Code erfolgreich ausgefรผhrt wurde, besteht der nรคchste Schritt darin, einen Testfall zu erstellen, um sicherzustellen, dass der Code ordnungsgemรคร geschrieben und ausgefรผhrt wurde. Der Code fรผr unseren Test sieht wie folgt aus
Unser Test wird tatsรคchlich die ng-repeat-Direktive testen und sicherstellen, dass sie 3 Datenzeilen enthรคlt, wie es im obigen Beispiel sein sollte.
Zunรคchst mรผssen wir sicherstellen, dass die folgende Voraussetzung erfรผllt ist
Installieren Sie die Profi-VersiontracDie Tor-Bibliothek kann รผber npm installiert werden. Dies geschieht durch Ausfรผhren der folgenden Zeile in der Kommandozeile.
"npm install protractor"
Der Code fรผr unseren Test sieht wie folgt aus.
Der Code befindet sich in einer separaten Datei namens CompleteTest.js, die im Testordner abgelegt wird. Der folgende Code fรผhrt lediglich die folgenden wichtigen Dinge aus:
- Die Browserfunktion wird vom Pro bereitgestellt.tracDie Tor-Bibliothek wird verwendet und setzt voraus, dass unsere AngularJS-Anwendung (mit dem oben gezeigten Code) auf unserer Website lรคuft. URL โ http://localhost:8080/Guru99 /
- var list=element.all(by.repeater(ptutor in tutorial')); - Diese Codezeile ruft die ng-repeat-Direktive ab, die mit dem Code 'ptutor in tutorial' befรผllt wird. element und by.repeater sind spezielle Schlรผsselwรถrter, die von der Bibliothek bereitgestellt werden.tracTor-Bibliothek, die es uns ermรถglicht, Details der ng-repeat-Direktive zu erhalten.
- erwarten(list.count()).toEqual(3); โ Zuletzt verwenden wir die Expect-Funktion, um zu sehen, dass unsere Tabelle aufgrund der ng-repeat-Direktive tatsรคchlich mit drei Elementen gefรผllt wird.
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); }); });
Der obige Test wird im Karma-Browser ausgefรผhrt und liefert das gleiche bestandene Ergebnis wie im vorherigen Thema.
Zusammenfassung
- Das Testen in AngularJS erfolgt mithilfe des Karma-Frameworks, das von [Name des Entwicklers/der Entwicklerin] entwickelt wurde. Google sich.
- Das Karma-Framework wird mit dem Node-Paketmanager installiert. Die wichtigsten Module, die fรผr grundlegende Tests installiert werden mรผssen, sind Karma, Karma-Chrome-Launcher, Karma-Jasmine und Karma-Cli.
- Die Tests werden in separaten JS-Dateien geschrieben, die normalerweise im Testordner Ihrer Anwendung gespeichert sind. Der Speicherort dieser Testdateien muss in einer speziellen Konfigurationsdatei namens karma.conf.js angegeben werden. Karma verwendet diese Konfigurationsdatei bei der Ausfรผhrung aller Tests.
- Karma kann auch zum Testen von Controllern und benutzerdefinierten Anweisungen verwendet werden.
- Fรผr ein umfassendes Webtesting wird ein weiteres Framework namens Pro verwendet.tracTor muss รผber den Node-Paketmanager installiert werden. Dieses Framework bietet spezielle Methoden, mit denen alle Elemente einer HTML-Seite getestet werden kรถnnen.

