Willkommen zu diesem praktischen AngularJS-Test-Tutorial für Anfänger!
Tests sind entscheidend für den Aufbau robuster AngularJS-Anwendungen, doch viele Entwickler finden sie herausfordernd. Dieses Tutorial hat das Ziel, das Testen von Angular-Code mit leicht verständlichen Beispielen zu vereinfachen.
Durch die Anwendung grundlegender Testprinzipien wie Isolation und Mocking werden Sie praktische Erfahrungen im Erstellen wartbarer Tests sammeln, die Probleme schnell erkennen. Am Ende werden Sie über die wesentlichen Fähigkeiten verfügen, um produktionsreife AngularJS-Anwendungen zu erstellen, die den Anforderungen an Funktionalität, Kompatibilität, Zuverlässigkeit und Leistung gerecht werden.
Mit einem Fokus auf Einfachheit und praktischer Anwendbarkeit wird Ihnen dieses AngularJS-Test-Tutorial das Vertrauen geben, fehlerfreie AngularJS-Apps zu erstellen.
Also, lassen Sie uns anfangen!
Häufige AngularJS-Test-Tools
-
Cypress – End-to-End-Test-Framework, das direkt in modernen Browsern ausgeführt wird
-
Karma – Test Runner für das Unit-Testing von AngularJS-Code
-
Protractor – End-to-End-Test-Framework für AngularJS-Anwendungen
AngularJS-Anwendungen – Wichtige Komponenten
Beim Erstellen von AngularJS-Anwendungen arbeiten Entwickler mit mehreren wichtigen Komponenten, die die Struktur und Funktionalität der App ausmachen. Diese Komponenten arbeiten zusammen, um die Logik, Ansichten und zugrunde liegenden Dienste zu erstellen, die die Benutzererfahrung unterstützen.
Controller
Sie sind JavaScript-Funktionen, die die Geschäftslogik hinter den Ansichten bereitstellen. Im MVC-Designmuster fungieren Controller als die Steuerungen. Sie verarbeiten Benutzereingaben, manipulieren Daten und entscheiden, welchen Inhalt sie rendern.
Entwickler erstellen aktiv Controller, um AngularJS-Scope mit Ansichten zu verbinden.
Ansichten
Entwickler definieren aktiv Ansichten mit HTML, um Daten aus Controllern und Modellen darzustellen. Ansichten nutzen Datenbindung, um sich automatisch zu aktualisieren, wenn sich die Modelldaten ändern. Dadurch entfällt die Notwendigkeit, Ansichten manuell zu aktualisieren.
Modelle
Diese können einfache JavaScript-Objekte sein oder aus einem Persistenzframework wie Firebase abgeleitet werden. Entwickler erstellen aktiv Modellobjekte und -strukturen, um die Anwendungsdatenkonzepte darzustellen, die für Ansichten geeignet sind.
Dienste
Entwickler erstellen aktiv AngularJS-Dienste, um Aufgaben wie API-Aufrufe zu erledigen, ohne den Controller-Code zu überladen. Dienste können in der gesamten Anwendung geteilt werden, was die Flexibilität und Wiederverwendbarkeit erhöht.
Module
Entwickler definieren aktiv Module mit ng-app, die die Anwendungsabhängigkeiten und die Einstiegskomponente festlegen. Dies fördert die Organisation und gewährleistet eine klare Trennung der Verantwortlichkeiten.
Wenn Entwickler diese Schlüsselfunktionen nutzen, können sie aktiv robuste AngularJS-Webanwendungen mit einer sauberen Trennung der Verantwortlichkeiten zwischen den verschiedenen Schichten erstellen. Die Flexibilität der AngularJS-Komponenten ermöglicht es, komplexe, datengetriebene Benutzererlebnisse zu gestalten.
Unit-Testing in AngularJS
Das Unit-Testing in AngularJS ist entscheidend für den Aufbau hochwertiger Anwendungen. Es stellt sicher, dass einzelne Komponenten wie Controller, Direktiven und Dienste wie erwartet funktionieren.
Unit-Testing erkennt Fehler frühzeitig, ermöglicht eine sichere Refaktorierung des Codes und vereinfacht die Integration von Code aus verschiedenen Entwicklern.
Bevor eine AngularJS-Anwendung als produktionsbereit betrachtet werden kann, sollte sie gründlichem Unit-Testing unterzogen werden. Dies erkennt Probleme im Code bereits in der frühesten Phase des Entwicklungszyklus.
Robustes Unit-Testing führt zu Anwendungen, die zuverlässiger, besser optimiert und stärker an den geschäftlichen Anforderungen ausgerichtet sind. Es ermöglicht auch eine schnelle Diagnose und Behebung von Fehlern. Unit-getesteter Code gibt den Nutzern zudem mehr Vertrauen in die Fähigkeiten der Anwendung.
Grundlagen des Unit-Testing in AngularJS
Beim Schreiben von Unit-Tests für deinen AngularJS-Code sorgt das Befolgen grundlegender Prinzipien dafür, dass deine Testsuite robust, wartbar und nachhaltig bleibt, während sich deine App weiterentwickelt:
-
Isolierung von Abhängigkeiten:
Jeder Unit-Test sollte eine spezifische Komponente isoliert testen, ohne auf andere Module oder externe Abhängigkeiten angewiesen zu sein. Verwende Mocks, Spione und Stubs, um Abhängigkeiten zu simulieren.
-
Arrange, Act, Assert (AAA):
Strukturiere deinen Test in 3 klar definierte Abschnitte – arrangiere Testdaten/Inputs, führe die Logik aus, die getestet werden soll (Act), und stelle sicher, dass die erwartete Ausgabe erzeugt wurde (Assert).
-
Eine Assertion pro Test:
Jeder Testfall sollte ein Verhalten oder eine Ausgabe validieren, um es einfach zu machen, herauszufinden, was fehlgeschlagen ist. Vermeide Assertions, die mehrere Ausgaben überprüfen.
-
Mache Tests unabhängig:
Schreibe Testfälle, die ihre eigenen Testdaten einrichten, damit sie unabhängig ausgeführt werden können und nicht von der Reihenfolge der Ausführung abhängen. Dies ist besonders hilfreich, wenn Tests parallel ausgeführt werden.
-
Halte Tests kurz und lesbar:
Zerlege umfangreiche Testfälle in kleinere Hilfsfunktionen, die jeweils ein einzelnes Verhalten oder eine Untereinheit einer Komponente testen.
Das Befolgen dieser grundlegenden Richtlinien stellt sicher, dass deine AngularJS-Unit-Test-Suite robust bleibt und im Laufe der Zeit leicht erweiterbar ist, während die Komplexität der Anwendung wächst.
Einrichten Ihrer Entwicklungsumgebung
Folge einfach diesen Schritten:
- Installiere Node.js auf deinem Computer. Dies ist das Framework, auf dem wir aufbauen werden.
- Öffne deinen bevorzugten Code-Editor. Wir empfehlen Visual Studio Code, Brackets oder Sublime Text. Jeder dieser Editor funktioniert hervorragend.
- Erstelle einen neuen Ordner namens „unit-testing“ auf deinem Computer mit dem Befehl
mkdir
. Hier wirst du deine Testdateien speichern. - Öffne den „unit-testing“-Ordner in deinem Code-Editor und öffne ein Terminalfenster darin.
Erstelle package.json
npm initAngular installieren:
npm I angular –saveKarma installieren:
npm i -g karma –save -devJasmine installieren:
npm I karma-jasmine jasmine-core –save -devAngular-Mocks installieren:
npm I angular-mocks –save -devKarma Chrome-Browser installieren:
npm I karma-chrome-launcher –save-dev
· Erstellen Sie in Ihrem Unit-Testing-Ordner zwei neue Ordner mit den Namen „app“ und „test“.
· Erstellen Sie anschließend im Unit-Testing-Ordner eine neue Datei mit dem Namen karma.config.js.
· Öffnen Sie karma.config.js in Ihrem Code-Editor und geben Sie „karma init“ ein. Dadurch wird ein leeres Repository mit einigen Standardeinstellungen initialisiert.
· Es werden Ihnen einige Fragen zur Konfiguration von Karma gestellt. Beantworten Sie diese entsprechend Ihren Wünschen. Die Standardeinstellungen sind ebenfalls in Ordnung.
End-to-End-Testing in AngularJS mit Protractor oder Cypress
End-to-End (E2E)-Testing simuliert, wie ein echter Benutzer mit deiner Anwendung von Anfang bis Ende interagieren würde. Es geht über das Unit-Testing hinaus, indem es sicherstellt, dass alle Komponenten richtig zusammenarbeiten.
Unit-Tests sind begrenzt, weil sie nur einzelne Teile des Codes isoliert bewerten. E2E-Testing ist wichtig, um Probleme zu erkennen, die auftreten, wenn diese Bausteine in vollständige Workflows integriert werden.
Zum Beispiel könnten Unit-Tests überprüfen, ob ein Login-Formular und eine Datenbankabfrage wie erwartet funktionieren. Aber E2E-Testing meldet sich mit echten Zugangsdaten an, klickt durch die Anwendung, ruft tatsächliche Daten ab und mehr.
E2E-Testing gibt dir die Sicherheit, dass deine Anwendung unter realen Bedingungen reibungslos funktioniert. Es findet Lücken, die zwischen Unit- und Integrationstests liegen. E2E-Testing richtig zu machen ist entscheidend, um qualitativ hochwertige Software zu liefern, die die Geschäfts- und Benutzeranforderungen von Anfang bis Ende erfüllt.
Vorteile des End-to-End-Testings
Umfassendes End-to-End-Testing bietet mehrere wichtige Vorteile:
-
Erkennt mehr Fehler frühzeitig, was zu hochwertigerer Software führt
-
Stellt sicher, dass alle Komponenten reibungslos zusammenarbeiten, wodurch das Vertrauen gestärkt wird
-
Modelliert echte Benutzer-Workflows, was die Benutzererfahrung verbessert
-
Spart Zeit und Geld, indem Probleme früher statt später behoben werden
-
Fördert die Zusammenarbeit zwischen Teams, die an verschiedenen Komponenten arbeiten
-
Automatisiert wiederholende Tests, was die Produktivität steigert
-
Beschleunigt die Markteinführungszeit, indem Mängel vor der Veröffentlichung reduziert werden
E2E-Testing liefert robustere, zuverlässigere Software, die den Geschäfts- und Benutzeranforderungen gerecht wird. Es validiert die Qualität von Anfang bis Ende über die gesamte Anwendung. Die Investition in E2E-Testing zahlt sich durch eine schnellere Lieferung besserer Software aus.
Testumgebung mit Protractor und Cypress einrichten
Cypress für E2E-Tests einrichten
Erstellen Sie einen neuen Projektordner und initialisieren Sie ihn:
npm init
Installieren Sie Cypress im Projektordner:
npm install cypress –save-dev
Oder mit Yarn:
yarn add cypress –dev
Dadurch wird die neueste Version von Cypress (zum Zeitpunkt der Erstellung dieses Artikels Version 12.11.0) lokal als Entwicklungsabhängigkeit installiert.
Und das war’s! Nachdem Cypress installiert ist, können Sie nun End-to-End-Tests für Ihre Anwendung im neuen Projekt erstellen und ausführen.
End-to-End-Tests mit Protractor oder Cypress erstellen und ausführen
Best Practices für End-to-End-Tests in AngularJS mit Protractor oder Cypress
Protractor für E2E-Tests installieren
Voraussetzung: Node.js muss installiert sein.
1. Öffnen Sie ein Terminal und geben Sie Folgendes ein:
npm install -g protractor
2. Dadurch werden zwei Kommandozeilentools installiert:
– protractor – Der Testrunner
– webdriver-manager – Verwaltet den Selenium-Webtreiber
3. Überprüfen Sie die Installation mit:
protractor –version
Dadurch wird die neueste Protractor-Version global auf Ihrem System installiert. Der Testrunner und der Selenium-Manager stehen nun über die Kommandozeile zur Verfügung, um mit dem End-to-End-Test Ihrer Anwendung zu beginnen.
Integrationstests in AngularJS
Integrationstests validieren, dass verschiedene Einheiten oder Komponenten einer Anwendung korrekt zusammenarbeiten, wenn sie kombiniert werden.
Sie unterscheiden sich vom Unit-Testing, das sich auf das Testen einzelner Einheiten in Isolation konzentriert. Und sie unterscheiden sich vom End-to-End (E2E) Testing, das gesamte Benutzer-Workflows in der App nachbildet.
Stattdessen bestätigt das Integrationstesting, dass die Interaktionen zwischen integrierten Einheiten wie erwartet funktionieren. Zum Beispiel kann es testen, ob die UI-Schicht erfolgreich Daten von einem API-Endpunkt abruft und anzeigt.
Während Unit-Tests also einzelne Module untersuchen und E2E-Tests die gesamten Abläufe überprüfen, konzentriert sich das Integrationstesting auf die Überprüfung der Verbindungen zwischen integrierten Komponenten. Es stellt sicher, dass Einheiten korrekt zusammenarbeiten, auch wenn sie auf Netzwerke, Datenbanken oder andere externe Ressourcen angewiesen sind.
Einrichten der Testumgebung und Schreiben und Ausführen von Integrationstests
Einrichten eines Angular-Projekts
Schritt 1.
Um ein neues Angular-Projekt zu erstellen, gib den folgenden Befehl in dein Terminal oder die Kommandozeile ein:
Ersetze „angular-todo-app“ durch den Namen, den du für deine App bevorzugst.
Drücke danach die Eingabetaste. Warte einen Moment, während Angular dein neues Projekt einrichtet.
Schritt 2.
Jetzt hast du dein neues Projekt. Es kommt mit dem integrierten Test-Tool von Angular. Dies ermöglicht direktes Testen ohne weitere Einrichtung.
AngularJS generiert automatisch Testdateien für TypeScript-Komponenten, die mit der Angular CLI erstellt wurden. Navigiere zum Beispiel zu app > components > todo
, und du wirst eine todo.component.spec.ts
Testdatei finden, die der todo.component.ts
entspricht.
Dieses Muster findet sich in jedem Angular-Projekt – jede Komponente hat eine zugehörige *.spec.ts
-Datei, die ihre Tests enthält.
Für unseren Integrationstest werden wir die Standarddatei app.component.spec.ts
nutzen, die Angular im Root-Ordner des Apps generiert.
Diese Spec-Datei ist mit der Hauptdatei app.component.ts
verbunden und ermöglicht es uns, Tests zu schreiben, die Integrationspunkte mit anderen Diensten und Komponenten validieren.
Angular kümmert sich um die Verkabelung der Testumgebung für uns in app.component.spec.ts
, was es zu einem großartigen Ausgangspunkt für unseren ersten Integrationstest macht.
Schritt 3: Testsuite erstellen und einrichten
Öffnen Sie die Datei app.component.specs.ts, in der Sie eine neue Testsuite erstellen. Verwenden Sie die folgenden Codes:
describe(‚TodoList Integration‘, () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
let service: TodoService;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [FormsModule],
declarations: [AppComponent, TodoComponent],
providers: [
{
provide: TodoService,
useValue: {
getTasks: () => {
return dummyTodos;
}
}
}
]
}).compileComponents();
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
service = TestBed.inject(TodoService);
});
});
const dummyTodos = [
{
id: 1,
title: ‚Todo 1‘,
completed: false
},
{
id: 2,
title: ‚Todo 2‘,
completed: false
}
];
• Asynchrones Test-Setup mit beforeEach
• Testmodul konfigurieren und kompilieren
• Komponenten-Fixture und -Instanzen erstellen
• Externe Dummy-Daten zur Wiederverwendung definieren
• Injections mit TestBed.inject abrufen
Schritt 4.
it(’sollte Aufgaben vom Dienst laden‘, async(() => {
fixture.detectChanges();
expect(component.todos.length).toBe(2);
expect(service.getTasks()).toEqual(dummyTodos);
}));
In diesem Test:
• Verwenden Sie `it()`, um den Testfall zu definieren.
• Rufen Sie detectChanges() auf, um die Datenbindung auszulösen.
• Überprüfen Sie die Länge des Komponenten-ToDos-Arrays.
• Überprüfen Sie die Gleichheit zwischen Service- und Dummy-Daten.
Einige wichtige Punkte:
• Testname allgemeiner gestaltet.
• Asynchrone Testfunktion genutzt.
• Zuerst wurde die Länge als indirekte Prüfung geprüft.
• Servicedaten direkt mit Dummy-Daten verglichen.
Schritt 5.
Hier führen Sie den Test aus.
// Alle Testsuiten ausführen
ng test
// Eine bestimmte Testdatei ausführen
ng test –include Dateiname
So führen Sie die Integrationstests aus:
• Öffnen Sie ein Terminal/eine Eingabeaufforderung.
• Navigieren Sie zum Projektstammverzeichnis.
• Führen Sie `ng test` aus, um alle Spezifikationen auszuführen.
• Oder führen Sie `ng test –include <Dateiname>` aus, um eine bestimmte Testdatei auszuführen.
Angular führt Folgendes aus:
• Richtet die Testumgebung ein.
• Führt die Testfälle aus.
• Berichtet die Ergebnisse in der CLI und im browserbasierten Runner.
Einige wichtige Punkte:
• `ng test` führt standardmäßig alle Spezifikationen aus.
• Kann Filtern Sie nach Dateinamen, falls erforderlich.
• Ergebnisausgabe an Terminal und Browser-Test-Runner
Testen von Direktiven in AngularJS
Erklärung der Direktiven in AngularJS
Einrichten der Testumgebung für Direktiven
Schreiben und Ausführen von Tests für Direktiven
Best Practices zum Testen von Direktiven in AngularJS
AngularJS-Test-Tutorial und AngularJS-Test-Dienste
Dienste sind eine der wichtigsten Bausteine in AngularJS-Anwendungen. Sie bieten wiederverwendbare Geschäftslogik, die über Komponenten hinweg genutzt werden kann. Aber wie stellst du sicher, dass deine Dienste in AngularJS gut getestet sind?
Dieser einfache Abschnitt des AngularJS-Test-Tutorials bietet Best Practices für das Unit-Testing deiner Dienste. Lass uns eintauchen.
- Richte das AngularJS-Testframework und die Umgebung von Grund auf ein
- Simuliere effektiv Abhängigkeiten, mit denen deine Dienste interagieren
- Validiere das Verhalten der Dienste durch gut strukturierte Test-Specs
- Identifiziere relevante Anwendungsfälle, um maximale Abdeckung zu erreichen
- Organisiere Tests für die Wartbarkeit, während sich die Codebasis weiterentwickelt
- Integriere Dienste mit anderen wichtigen Bausteinen wie Komponenten
- Fehlerbehebung, wenn Dienste nicht wie erwartet funktionieren
- Das richtige Testen von Diensten deckt Fehler frühzeitig auf und gibt Vertrauen, dass Geschäftsregeln die Datenintegrität durchsetzen. Spare Stunden in der Zukunft, indem du lernst, wie man AngularJS-Dienste richtig testet. Statte dich mit einer gefragten Fähigkeit aus, die zu höherer Softwarequalität führt.
Die Konzepte gelten sowohl für Anfänger als auch für Entwickler, die bereits AngularJS-Anwendungen gebaut haben. Erfahrene Entwickler können diese Best Practices des AngularJS-Testens verwenden, um bestehende Testsuiten zu optimieren. Weitere Informationen findest du auf dieser Seite.
Testing von Controllern in AngularJS
Controller sind das Rückgrat des dynamischen Verhaltens in AngularJS-Anwendungen. Sie verbinden die Benutzeroberfläche mit der zugrunde liegenden Logik. Durch gründliches Testen der Controller werden Schnittstellenfehler in der Zukunft verhindert.
Mit einer zuverlässigen Testsuite kannst du Benutzerinteraktionen simulieren und sicherstellen, dass Controller Daten korrekt transformieren und anzeigen. Dies ermöglicht es dir, Funktionen selbstbewusst weiterzuentwickeln, da du Regressionen frühzeitig erkennen kannst.
Hier ist ein dedizierter Abschnitt des AngularJS-Test-Tutorials, der die Best Practices für das Testen von Controllern zeigt.
Dienste in AngularJS-Controller einfügen
Beim Unit-Test von Controllern müssen Sie deren Abhängigkeiten simulieren. Dienste wie $http oder benutzerdefinierte Provider ermöglichen Controllern die Auslagerung der Geschäftslogik.
Es gibt zwei Standardmethoden, um diese Abhängigkeiten einzufügen und so eine korrekte Auflösung zu gewährleisten:
Inline-Array
Definieren Sie ein Inline-Array mit den Abhängigkeiten – praktisch für einfache Fälle:
angular.module(‚myApp‘)
.controller(‚MyController‘, [‚$scope‘, ‚MyService‘, function($scope, MyService) {
// …
}]);
$inject-Eigenschaft
Oder legen Sie eine $inject-Eigenschaft für die Controller-Funktion fest:
angular.module(‚myApp‘)
.controller(‚MyController‘, MyController);
MyController.$inject = [‚$scope‘, ‚MyService‘];
function MyController($scope, MyService) {
// …
}
Beide Ansätze eignen sich für Mocking in Tests. Der Schlüssel liegt darin, Abhängigkeiten explizit aufzulisten, anstatt sich auf Inferenz zu verlassen.
So wird sichergestellt, dass Abhängigkeiten korrekt aufgelöst werden, wenn Code während des Build-Prozesses minimiert/verunstaltet wird – eine wichtige Best Practice für AngularJS-Tests.
Fazit unseres AngularJS-Test-Tutorials
Herzlichen Glückwunsch, wenn Sie unser AngularJS-Test-Tutorial bis hierher gelesen haben. Sie verfügen nun über die grundlegenden Kenntnisse und Fähigkeiten, um mit der Entwicklung robuster Testsuites für Ihre AngularJS-Anwendungen zu beginnen.
Testen mag zunächst entmutigend erscheinen. Doch wer dranbleibt, zahlt sich langfristig in Form von Anwendungsstabilität, schnellerer Bereitstellung und verbesserter Benutzerfreundlichkeit aus. Seien Sie geduldig und vergessen Sie nicht, Best Practices wie Isolation, Mocking und eine übersichtliche Testorganisation anzuwenden.
Das war erst der Anfang – es gibt noch viel mehr zu entdecken, wenn Sie ein erfahrener AngularJS-Testexperte werden. Sie müssen sich mit weiteren und tiefergehenden Themen wie Testdirektiven, End-to-End-Testframeworks wie Protractor und Cypress, visuellen Regressionstests und fortgeschrittenen Techniken für knifflige Testszenarien auseinandersetzen.
Während Sie verschiedene AngularJS-Test-Tutorials durchstöbern, ist es wichtig, positiv zu bleiben, frühzeitig mit dem Testen zu beginnen, regelmäßig zu refaktorieren und sich bei Bedarf an andere zu wenden. Kontinuierliches Üben von AngularJS-Tests festigt das Gelernte und stärkt Ihr Selbstvertrauen. Sie schaffen das!