Skip to content

Commit f3acc98

Browse files
authored
Update README.de.md
1 parent a50f1d9 commit f3acc98

File tree

1 file changed

+22
-184
lines changed

1 file changed

+22
-184
lines changed

docs/README.de.md

Lines changed: 22 additions & 184 deletions
Original file line numberDiff line numberDiff line change
@@ -16,204 +16,42 @@ Um die in den virtuellen Kursen erworbenen Kenntnisse unter Beweis zu stellen, b
1616

1717
<!-- ------------------------------------------------------------------------------------------- -->
1818

19-
## Erlernte und Entwickelte Kenntnisse
19+
## Erlerntes und Entwickeltes Wissen
2020

21-
### Testing
21+
### Softwaretests
2222

23-
#### Definition und Ziele
24-
25-
Softwaretests sind ein grundlegender Prozess, dessen Hauptzweck darin besteht, Fehler (Bugs) zu identifizieren, bevor der Code in die Produktion gelangt. Die Implementierung verfolgt folgende Ziele:
26-
27-
1. **Frühzeitige Fehlererkennung**: Ermöglicht die Identifizierung von Defekten in frühen Phasen des Entwicklungszyklus, um Kosten und Auswirkungen von Korrekturen zu minimieren.
28-
2. **Steigerung des Vertrauens in den Code**: Bietet eine höhere Sicherheit bezüglich Stabilität und Funktionalität der Software, auch wenn kein Test-Set eine vollständige Fehlerfreiheit garantieren kann.
29-
3. **Unterstützung bei Deployment-Entscheidungen**: Erleichtert die Beurteilung, ob die Software bereit ist, neue Funktionen zu integrieren, oder ob es besser ist, den Release zu verschieben, um Probleme zu beheben.
30-
4. **Förderung von Codequalität und -sauberkeit**: Motiviert Entwickler, modularen und gut strukturierten Code zu schreiben, da lesbarer und organisierter Code einfacher zu testen und zu warten ist.
31-
32-
#### Rolle im Projektmanagement (PM) und DevOps
33-
34-
Softwaretests sollten in jede Entwicklungsmethodik integriert werden, sei es Waterfall, Agile oder DevOps. Insbesondere in einem DevOps-Kontext sind Tests Teil eines kontinuierlichen Lieferzyklus (bekannt als „unendliche Schleife“) und werden häufig automatisiert, um schnelle und zuverlässige Deployments zu gewährleisten.
35-
36-
- In **Waterfall**-Methodiken werden Testphasen nach Abschluss jeder Design- oder Entwicklungsphase geplant.
37-
- In **Agile**-Methodiken werden Tests iterativ in jeden Sprint integriert, um konstantes Feedback zu fördern.
38-
- In **DevOps**-Umgebungen ermöglicht die Automatisierung von Tests, die Software mit jeder Änderung im Repository zu validieren und dadurch die Qualität während des gesamten Lebenszyklus zu sichern.
23+
Tests sind unerlässlich, um Fehler vor dem Deployment zu erkennen, Vertrauen in den Code zu stärken, Entscheidungen über Releases zu unterstützen und gute Entwicklungspraktiken zu fördern. Sie sind ein zentraler Bestandteil von Methoden wie Waterfall, Agile und DevOps, wo Tests oft automatisiert in CI/CD-Zyklen integriert sind.
3924

4025
### Testarten
4126

42-
#### 1. Externe Tests (End-to-End Visuell)
43-
44-
1. **Manuell**
45-
Ein Tester folgt einer vordefinierten Schritt-für-Schritt-Anleitung und überprüft visuell die korrekte Funktionsweise der Benutzeroberfläche. Dieser Ansatz deckt oft Usability- und Ablaufprobleme auf, die automatisierten Tests entgehen können.
46-
47-
2. **Automatisiert**
48-
Basieren auf der Aufzeichnung und Wiedergabe von Benutzerinteraktionen mit der Anwendung (Klicks, Texteingaben, Navigation usw.). Diese Tests werden zeitgesteuert ausgeführt, um zu prüfen, ob die Benutzeroberfläche nach Codeänderungen weiterhin wie erwartet funktioniert.
27+
#### 1. Externe Tests (End-to-End)
28+
- Manuell: Ein Tester überprüft das Verhalten der Anwendung visuell anhand vordefinierter Schritte.
29+
- Automatisiert: Simulieren Benutzerinteraktionen, um das Verhalten nach Codeänderungen zu validieren.
4930

5031
#### 2. Funktionale Tests
32+
- Unit-Tests: Testen einzelne Funktionen oder Module isoliert.
33+
- Integrationstests: Prüfen das Zusammenspiel mehrerer Komponenten.
34+
- End-to-End: Simulieren vollständige Nutzerabläufe, um die Gesamtfunktionalität der Anwendung sicherzustellen.
5135

52-
1. **Unit-Tests**
53-
Testen einzelne Codeeinheiten (Funktionen, Klassen oder Module) isoliert. Jeder Test sollte nur einen Aspekt des Verhaltens der Codeeinheit unter kontrollierten Bedingungen überprüfen.
54-
55-
2. **Integrations-Tests**
56-
Verifizieren, dass mehrere Komponenten, Module oder Dienste gemeinsam korrekt funktionieren. Beispielsweise werden im Backend-Bereich HTTP-Anfragen an die API gesendet und die empfangenen Antworten validiert, um sicherzustellen, dass jede Schicht (Controller, Service, Datenbank) erwartungsgemäß zusammenarbeitet.
57-
58-
3. **End-to-End-Tests (E2E)**
59-
Simulieren vollständige Benutzerabläufe, wie Anmeldeprozesse, Kaufvorgänge oder andere typische Anwendungsszenarien. Diese Tests stellen sicher, dass die Anwendung in ihrem Gesamtkontext auf Benutzeraktionen korrekt reagiert. Aufgrund ihres Aufwands für Erstellung und Wartung sollten sie auf die kritischsten Szenarien beschränkt werden.
60-
61-
#### 3. Nicht-Funktionale Tests
62-
63-
1. **Sicherheit**
64-
Ziel ist es, Schwachstellen in Abhängigkeiten und Paketen zu entdecken sowie die korrekte Verschlüsselung und Handhabung sensibler Daten zu gewährleisten. Umfasst Penetrationstests, Abhängigkeits-Audits und Authentifizierungs-/Autorisierungsprüfungen.
65-
66-
2. **Performance**
67-
Bewerten Metriken wie Time To First Byte (TTFB), die Fähigkeit der Anwendung, gleichzeitig hohe Last zu bewältigen, sowie die Berechnung der Betriebskosten anhand der Nutzung. Diese Tests sind essenziell, um eine optimale Performance in produktiven Umgebungen mit hoher Konkurrenz sicherzustellen.
68-
69-
3. **Usability**
70-
Analysieren die Interaktion realer Nutzer mit der Anwendung, um mögliche Schwierigkeiten oder Barrieren bei der Navigation zu identifizieren. Methoden umfassen Usability-Studien, Benutzertests und die Auswertung von Interaktionsmetriken.
71-
72-
4. **Accessibility**
73-
Überprüfen, ob die Benutzeroberfläche für Menschen mit Behinderungen zugänglich ist, indem sichergestellt wird, dass alle visuellen Elemente korrekt gerendert werden und Alternativen wie Tastaturnavigation oder Screenreader-Unterstützung vorhanden sind. Ebenfalls relevant sind Farbkontrast und semantische HTML-Struktur.
74-
75-
### Hilfsmittel
76-
77-
#### Grundlegende Voraussetzungen
78-
79-
- **Tiefgehende Kenntnisse der Programmiersprache**, die getestet werden soll.
80-
- **Vertrautheit mit dem bestehenden Code** sowie der Architektur der Anwendung.
81-
- **Verständnis der zu testenden Funktionalitäten**, einschließlich Anforderungen und Akzeptanzkriterien.
82-
83-
#### Empfohlene Software
84-
85-
1. **Unit-Tests**
86-
87-
- **Jasmine**: Testframework für JavaScript.
88-
- **Jest**: Von Facebook entwickeltes Testing-Tool, weit verbreitet in React- und Node.js-Projekten.
89-
- **Mocha + Chai**: Kombination aus Test-Runner (Mocha) und Assertion-Bibliothek (Chai) für Node.js.
90-
91-
2. **Funktionale Tests**
92-
93-
- **Supertest**: Bibliothek zum Senden von HTTP-Anfragen und Validieren von Antworten in Node.js-Umgebungen.
94-
95-
3. **E2E-Tests**
96-
- **Selenium**: Framework zur Automatisierung von Webbrowsern.
97-
- **Puppeteer**: High-Level-Bibliothek zur Steuerung von Chrome/Chromium über das DevTools-Protokoll.
98-
- **Protractor**: Spezielle Lösung für Angular-Projekte.
99-
- **Playwright**: Plattformübergreifendes Tool für zuverlässige Web-Tests (Chrome, Firefox, Safari).
100-
101-
## Jest
102-
103-
Jest ist ein von Facebook entwickeltes Framework für Unit-Tests, das auf Geschwindigkeit, Erweiterbarkeit und einfache Konfiguration ausgelegt ist. Die wichtigsten Merkmale sind:
104-
105-
1. **Konfiguration und Einstellungen**
106-
107-
- Ermöglicht das Definieren von Konfigurationsdateien (`jest.config.js`), um Suchmuster, Verzeichnisausschlüsse, Code-Transformationen (z. B. Babel) und Modul-Mapping festzulegen.
108-
109-
2. **Hooks (beforeEach, afterEach, etc.)**
110-
111-
- Bietet Lifecycle-Funktionen, um die Umgebung vor jedem Test vorzubereiten (`beforeEach`) und nach der Ausführung aufzuräumen (`afterEach`). Außerdem stehen `beforeAll` und `afterAll` für Aktionen auf Suite-Ebene zur Verfügung.
112-
113-
3. **Ausnahmebehandlung**
114-
115-
- Unterstützt Assertions, die erwarten, dass bestimmte Funktionen Ausnahmen auslösen (`toThrow()`), und fängt asynchrone Fehler ab.
116-
117-
4. **Testing von Promises**
118-
119-
- Erleichtert die Validierung aufgelöster und abgelehnter Promises mittels `resolves` und `rejects` sowie der `async/await`-Syntax.
120-
121-
5. **Mocking von Modulen und Funktionen**
122-
123-
- Erlaubt das Simulieren von Abhängigkeiten und das Ersetzen realer Implementierungen durch Mocks, um die getestete Einheit zu isolieren und das Verhalten externer Module zu kontrollieren.
124-
125-
6. **Code-Coverage**
126-
- Generiert Berichte, die anzeigen, welche Zeilen, Zweige und Funktionen während der Tests ausgeführt wurden. Dies hilft, die Effektivität der Tests zu quantifizieren und ungetestete Bereiche zu identifizieren.
127-
128-
## TDD (Test Driven Development)
129-
130-
### Definition
131-
132-
Test Driven Development (TDD) ist eine iterative Methodik, bei der automatisierte Tests geschrieben werden, bevor die tatsächliche Funktionalität implementiert wird. Der grundlegende Zyklus, bekannt als **Red–Green–Refactor**, besteht aus:
133-
134-
1. **Red**: Schreibe einen Test, der fehlschlägt (da die Funktionalität noch nicht existiert).
135-
2. **Green**: Implementiere die minimal erforderliche Funktionalität, damit der Test erfolgreich besteht.
136-
3. **Refactor**: Verbessere den Code, ohne sein Verhalten zu ändern, und stelle sicher, dass alle Tests weiterhin erfolgreich sind.
137-
138-
Dieser Zyklus wiederholt sich kontinuierlich bei jeder neuen Anforderung oder Änderung im System.
139-
140-
#### TDD-Gesetze (Robert C. Martin)
141-
142-
1. **Schreibe keinen Produktionscode, ohne zuvor einen Test zu schreiben, der fehlschlägt.**
143-
2. **Schreibe nicht mehr als einen Unit-Test, der ausreicht, um einen einzelnen Fehler zu erzeugen.** (Selbst ein Kompilierungsfehler zählt als Fehler.)
144-
3. **Schreibe nicht mehr Code, als unbedingt notwendig, damit der Test besteht.**
145-
146-
#### Zusätzliche Regeln
147-
148-
1. **Anforderungen der Funktionalität klar festlegen**: Ohne präzise Definitionen verliert der TDD-Prozess an Effektivität.
149-
2. **Alle möglichen Fälle berücksichtigen** (inklusive Erfolgs- und Fehlerfälle) innerhalb der Akzeptanzkriterien.
150-
3. **Jeden Test so gestalten, dass nur die Logik der getesteten Einheit überprüft wird**, und bei Bedarf Mocks verwenden, um externe Abhängigkeiten zu isolieren.
151-
4. **Genau bestimmen, welcher Aspekt in jedem Test überprüft wird**, und vermeiden, mehrere Kriterien in einem Test zu bündeln.
152-
5. **Die Anzahl der Tests ist nicht vorhergegeben**, sondern richtet sich nach den Szenarien, die die implementierte Funktionalität abdecken.
153-
154-
#### SOLID-Prinzipien im TDD
155-
156-
- **S – Single Responsibility Principle**: Jede Klasse oder jedes Modul sollte nur eine einzige Verantwortung haben.
157-
- **O – Open/Closed Principle**: Code sollte erweiterbar sein, ohne dass bestehender Code verändert werden muss.
158-
- **L – Liskov Substitution Principle**: Jeder abgeleitete Typ muss den Basistyp ersetzen können, ohne das korrekte Verhalten des Programms zu beeinträchtigen.
159-
- **I – Interface Segregation Principle**: Eine Klasse sollte nicht gezwungen werden, von Schnittstellen zu abhängen, die sie nicht verwendet.
160-
- **D – Dependency Inversion Principle**: Implementierungsdetails sollten von Abstraktionen abhängen und nicht umgekehrt.
161-
162-
#### Vorteile von TDD
163-
164-
- Verbessert die Gesamtqualität des Codes, da Entwickler gezwungen werden, Anforderungen vor der Implementierung zu bedenken.
165-
- Fördert ein an Anforderungen ausgerichtetes Design und reduziert unnötige Funktionalitäten.
166-
- Führt zu einfacherem Code, der sich auf minimale, funktionsfähige Anforderungen konzentriert.
167-
- Reduziert Redundanzen und erleichtert die frühzeitige Fehlererkennung.
168-
- Verringert die Zeit für Debugging und steigert die Produktivität des Teams.
169-
- Trägt zu einem Codebestand bei, der weniger anfällig für zukünftige Fehler ist.
170-
171-
#### Nachteile von TDD
172-
173-
- Erfordert eine steile Lernkurve für Entwickler, die mit dieser Methodik nicht vertraut sind.
174-
- Es besteht die Gefahr, den Gesamtüberblick zu verlieren, wenn man sich zu sehr auf Unit-Tests und Einzelfälle konzentriert.
175-
- Wenn Anforderungen nicht klar definiert sind, können Tests fehlerhaft erstellt werden.
176-
- Die Integration externer Services (Datenbanken, APIs) kann komplex werden, wenn Mocks und Stubs nicht richtig gehandhabt werden.
177-
- Die Anwendung im Frontend kann schwieriger sein, da dort oft die Benutzeroberfläche und nicht nur die Geschäftslogik im Fokus steht.
178-
- Erfordert zu Projektbeginn einen erheblichen Zeit- und Ressourceneinsatz.
179-
180-
## Verwandte Ansätze
181-
182-
### BDD (Behavior Driven Development)
183-
184-
Behavior Driven Development (BDD) erweitert die TDD-Konzepte durch eine gemeinsame Sprache zwischen technischen Teams und Fachbereichen. Akzeptanztests, die in einem natürlichen Sprachstil (z. B. Gherkin) geschrieben sind, beschreiben das erwartete Verhalten des Systems aus Anwendersicht.
185-
186-
- **Hauptwerkzeuge**:
187-
188-
- **Cucumber**: Framework, das Gherkin-Dateien interpretiert, um automatisierte Tests durchzuführen.
189-
- **Gherkin**: Klartext-Syntax, die auf Schlüsselwörtern (Given, When, Then) basiert, um Verhaltensszenarien zu beschreiben.
190-
191-
- **Vorteile**:
192-
193-
1. Definiert Verhaltensweisen statt spezifischer Tests, was die Zusammenarbeit zwischen Entwicklern, Testern und Fachanwendern fördert.
194-
2. Verbessert Kommunikation und gegenseitiges Verständnis durch die Verwendung einer natürlichen Sprache zur Beschreibung von Funktionen.
195-
3. Bietet eine geringere Lernkurve als reines TDD, da der Fokus nicht nur auf Unit-Tests liegt.
196-
4. Erleichtert die Einführung agiler Methoden, indem es einen Rahmen zur Definition von Akzeptanzkriterien vor der Implementierung bereitstellt.
197-
5. Ermöglicht einen Konsens über zu entwickelnde Funktionen, bevor Code geschrieben wird.
36+
#### 3. Nicht-funktionale Tests
37+
- Sicherheit: Erkennen Schwachstellen und prüfen den Schutz sensibler Daten.
38+
- Leistung: Messen Antwortzeiten und Verhalten unter Last.
39+
- Benutzerfreundlichkeit: Analysieren die reale Nutzererfahrung in der Oberfläche.
40+
- Barrierefreiheit: Stellen sicher, dass die Anwendung auch für Menschen mit Behinderungen nutzbar ist.
19841

199-
- **Nachteile**:
200-
1. Das Risiko, relevante Fälle auszulassen, besteht, wenn Verhaltensszenarien nicht umfassend definiert sind.
201-
2. Die Pflege von Verhaltenstests für Datenbanken und umfangreiche Frontend-Anwendungen kann komplex sein.
202-
3. Erfordert einen mittelhohen bis hohen Zeitaufwand für das Schreiben und Warten von Gherkin-Skripten.
203-
4. Benötigt eine ständige Kommunikation zwischen Entwicklern, Testern und Kunden, was Teams ohne dieses Vorgehen ausbremsen kann.
42+
### Verwendete Werkzeuge
20443

205-
### ATDD (Acceptance Test Driven Development)
44+
- Jasmine, Jest, Mocha + Chai: Unit-Tests für JavaScript und Node.js.
45+
- Supertest: Funktionstests in Backend-Umgebungen.
46+
- Selenium, Puppeteer, Protractor, Playwright: Automatisierte End-to-End-Tests im Browser.
20647

207-
Acceptance Test Driven Development (ATDD) ähnelt BDD, legt jedoch größeren Wert darauf, dass von Beginn des Projekts an die richtigen Ziele verfolgt werden.
48+
### TDD (Testgetriebene Entwicklung)
20849

209-
- **Hauptziel**: Sicherstellen, dass das Team nur an notwendigen Funktionen arbeitet und unnötige Komponenten vermieden werden.
210-
- **Vorteile**:
50+
Bei TDD wird zuerst ein Test geschrieben, dann der minimale Code zur Erfüllung des Tests und anschließend refaktorisiert. Diese Methode erhöht die Codequalität, vermeidet unnötige Komplexität und erkennt Fehler frühzeitig. Sie basiert auf den SOLID-Prinzipien und fördert sauberen, wartbaren Code.
21151

212-
1. Fördert ein flexibles Design, das für zukünftige Änderungen gewappnet ist, ohne die Lösung an UI oder Datenbank zu binden.
213-
2. Bietet frühzeitig Feedback zum Erreichen der Projektziele.
214-
3. Ermöglicht dem Product Owner, Akzeptanzkriterien zu prüfen und zu validieren, wodurch das Vertrauen in das Entwicklungsteam steigt.
52+
### BDD und ATDD
21553

216-
- **Vorgehensweise**: Basierend auf der Definition von Akzeptanztests, die das gewünschte Systemverhalten in verständlicher Form für alle Beteiligten beschreiben. Nach deren Validierung implementiert das Entwicklungsteam die Funktionalität iterativ und stellt sicher, dass diese Tests bestanden werden, bevor neue Aufgaben begonnen werden.
54+
BDD (Verhaltensorientierte Entwicklung) und ATDD (Akzeptanztestgetriebene Entwicklung) zielen darauf ab, Entwickler, Tester und Fachbereiche durch klar definierte Verhaltensbeschreibungen zu vereinen. Sie verwenden strukturierte Sprachen wie Gherkin, um Szenarien zu formulieren, die für alle Beteiligten verständlich sind.
21755

21856
<!-- ------------------------------------------------------------------------------------------- -->
21957

0 commit comments

Comments
 (0)