update
BIN
Writerside/images/image_591.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
Writerside/images/image_592.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Writerside/images/image_593.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
Writerside/images/image_594.png
Normal file
After Width: | Height: | Size: 167 KiB |
BIN
Writerside/images/image_595.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
Writerside/images/image_596.png
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
Writerside/images/image_597.png
Normal file
After Width: | Height: | Size: 60 KiB |
@ -42,15 +42,14 @@
|
|||||||
- Developer Tests:
|
- Developer Tests:
|
||||||
- Unit tests
|
- Unit tests
|
||||||
- Verifizieren Funktionalität eines kleinen Subsets des Systems
|
- Verifizieren Funktionalität eines kleinen Subsets des Systems
|
||||||
|
- Unit Tests sind die essenzielle Basis einer guten Test-Suite
|
||||||
|
- Verglichen mit anderen, sind sie einfach zu erstellen und warten
|
||||||
|
- Viele Unit-Tests :)
|
||||||
- Component-/Integration Tests:
|
- Component-/Integration Tests:
|
||||||
- Verifizieren Verhalten eines größeren Teils
|
- Verifizieren Verhalten eines größeren Teils
|
||||||
|
|
||||||
- Tests sind nicht für den Kunden
|
- Tests sind nicht für den Kunden
|
||||||
|
|
||||||
## Unit Testing
|
|
||||||
- Unit Tests sind die essenzielle Basis einer guten Test-Suite
|
|
||||||
- Verglichen mit anderen, sind sie einfach zu erstellen und warten
|
|
||||||
- Viele Unit-Tests :)
|
|
||||||
|
|
||||||
|
|
||||||
## Goals of Testing during Implementation
|
## Goals of Testing during Implementation
|
||||||
@ -194,3 +193,118 @@
|
|||||||
#### Wie testet man die 4 Typen?
|
#### Wie testet man die 4 Typen?
|
||||||

|

|
||||||
- trivialer Code muss nicht getestet werden
|
- trivialer Code muss nicht getestet werden
|
||||||
|
|
||||||
|
## Unit Testing
|
||||||
|
- Beim Unit Testing gehts nicht nur um den technischen Aspekt
|
||||||
|
- möglichst wenig Zeit Input
|
||||||
|
- möglichst viel Benefits
|
||||||
|
|
||||||
|
### Gute Test-Suite
|
||||||
|
1. integriert in [SDLC](00_Introduction.md#software-development-lifecycle-sdlc)
|
||||||
|
- Tests bringen nur was, wenn man sie ständig benutzt
|
||||||
|
- am besten alle automatisiert bei jeder Änderung
|
||||||
|
2. testet nur die wichtigsten Teile der Code-Base
|
||||||
|
- Business-Logik
|
||||||
|
- Systemkritische Teile
|
||||||
|
- auch Abhängigkeiten nach außen
|
||||||
|
- Rest nur indirekt / wenig testen
|
||||||
|
3. gibt maximalen Wert mit minimalem Wartungsaufwand
|
||||||
|
- Auch automatisierte Tests müssen ggf. nach Änderungen angepasst werden
|
||||||
|
- Nur Tests behalten, die wirklich sinnvoll sind
|
||||||
|
|
||||||
|
### Was ist ein Unit-Test
|
||||||
|
> 1. Verifiziert einen kleinen Teil des Codes (unit)
|
||||||
|
>
|
||||||
|
> 2. macht es schnell
|
||||||
|
>
|
||||||
|
> 3. macht es isoliert
|
||||||
|
|
||||||
|
#### London School Interpretation
|
||||||
|
- Isolation bedeutet, dass jede Klasse ihren eigenen Test bekommt
|
||||||
|
- Auch wenn sie von gleicher Klasse erben
|
||||||
|
|
||||||
|
##### Testing Doubles
|
||||||
|

|
||||||
|
- Objekt, dass gleiches Verhalten und Aussehen, wie Gegenstück hat
|
||||||
|
- Vereinfachte Version, die Komplexität verringert
|
||||||
|
|
||||||
|
##### Vorteile London School Interpretation
|
||||||
|
- Wenn ein Test fehlschlägt, ist klar, was kaputt ist
|
||||||
|
- Gibt Fähigkeit den Objektgraphen aufzusplitten
|
||||||
|
- Jede Klasse hat ihre eigenen Abhängigkeiten / Vererbungen
|
||||||
|
- Schwer zu testen ohne [Testing Doubles](#testing-doubles)
|
||||||
|
- Es müssen nicht die Abhängigkeiten von Abhängigkeiten beachtet werden
|
||||||
|
- haben ja eigene Tests
|
||||||
|
- Projektweite Guideline:
|
||||||
|
- Nur eine Klasse auf einmal
|
||||||
|
- 
|
||||||
|
|
||||||
|
|
||||||
|
#### Classic School Interpretation
|
||||||
|
- Isolation bedeutet, dass jeder Test in Isolation läuft
|
||||||
|
- Mehrere Klassen auf einmal ist okay
|
||||||
|
- Solange sie alle auf ihrem eigenen Speicher laufen
|
||||||
|
- kein geteilter Zustand
|
||||||
|
- Verhindert Kommunikation /Beeinflussung zwischen Tests
|
||||||
|
- Scheiß auf Reihenfolge oder Ergebnis von anderen Tests
|
||||||
|
##### Geteilte, private, Out-Of-Process Abhängigkeiten
|
||||||
|
- Geteilte Abhängigkeiten
|
||||||
|
- Können sich gegenseitig beeinflussen
|
||||||
|
- Müssen ersetzt werden
|
||||||
|
- _bspw. geteilte DB → neue/bearbeitete Daten können Tests beeinflussen_
|
||||||
|
- Private Abhängigkeiten → :)
|
||||||
|
- Out-Of-Process Abhängigkeiten
|
||||||
|
- Meistens ähnlich wie geteilte Abh.
|
||||||
|
- _DB = geteilt und out-of-process_
|
||||||
|
- _read-only-DB ist fine_
|
||||||
|
- also: kommt drauf an ob gut oder nicht
|
||||||
|

|
||||||
|
|
||||||
|
#### Beispiel Classic School
|
||||||
|

|
||||||
|
- _Enough inventory → purchase geht durch, inventory amount geht runter_
|
||||||
|
- _not enough product → kein purchase, keine änderungen_
|
||||||
|
|
||||||
|
- Typische AAA-Sequenz
|
||||||
|
- arrange, act, assert
|
||||||
|
- alle Abhängigkeiten und System vorbereiten
|
||||||
|
- Verhalten ausführen, das verifiziert werden soll
|
||||||
|
- Erwartete Ergebnisse überprüfen
|
||||||
|
|
||||||
|
- Outcome:
|
||||||
|
- `Customer` und `Store` werden verifiziert, nicht nur `Store`
|
||||||
|
- Jeder Bug in `Store` lässt die Tests fehlschlagen
|
||||||
|
- auch wenn `Customer` komplett richtig ist
|
||||||
|
|
||||||
|
#### Beispiel London School
|
||||||
|

|
||||||
|
|
||||||
|
- Gleiche Tests, aber Store wird mit test-doubles ersetzt
|
||||||
|
- "fake dependency" = "Mock"
|
||||||
|
|
||||||
|
- AAA Sequenz
|
||||||
|
- Arrange:
|
||||||
|
- Store nicht modifizieren, stattdessen festlegen, wie er auf `hasEnoughInventory()` reagieren soll
|
||||||
|
- Act
|
||||||
|
- Assert
|
||||||
|
- Interaktion zwischen `Store` und `Customer` wird genauer untersucht
|
||||||
|
|
||||||
|
#### Vergleich Classic / London
|
||||||
|
| | Isolation of | A unit is | Uses test doubles for |
|
||||||
|
|----------------|--------------|-----------------------------|--------------------------------|
|
||||||
|
| London School | Units | A class | All but immutable dependencies |
|
||||||
|
| Classic School | Unit tests | A class or a set of classes | shared dependencies |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Unit Tests - Good Practices
|
||||||
|
#### Good Practices - Structuring
|
||||||
|

|
||||||
|
- Offensichtliche Struktur ist wichtig
|
||||||
|
- Code wird häufiger gelesen als geschrieben
|
||||||
|
- AAA-Pattern splittet Tests in 3 Teile
|
||||||
|
- Alternative: Give-When-Then Pattern
|
||||||
|
- Einziger Unterschied: besser lesbar für nicht-Programmierer
|
||||||
|
|
||||||
|
- **Zu vermeidende Dinge:**
|
||||||
|
-
|