PhpUnit am Beispiel eines Getränkeautomat erklärt. Bietet einen Einstieg in die Thematik und soll jemanden der an dem Thema interessiert über die ersten Hürden helfen.
15. DRINKS
coins
Beer Water
Erwartung:
Wenn ich Geld einwerfe und
auf die Taste „Beer“ drücke, dann
kommt unten ein Bier raus
Test:
Geld einwerfen und auf die
Taste Beer drücken.
Ergebnis:
Bier
Montag, 16. September 13
17. Aha
• Code Coverage zeigt welche Programmteile
durchlaufen wurden
• Obwohl alles durchlaufen wurde, bedeutet das nicht
das alles getestet wurde
• Nicht vergessen die Ursprungsklasse einzubinden
Montag, 16. September 13
20. Aha
• Jeder Test läuft isoliert mit, setup() und teardown()
initialisieren wir die Testumgebung
• Wie haben eindeutig zu wenig Bier ;-)
Montag, 16. September 13
22. Aha
• Jeder Test der einen Dataprovider verwendet läuft
AUCH isoliert, setup() und teardown() werden für jedes
Datum aufgerufen und initialisieren die Testumgebung
• Das Problem mit dem zu wenig Bier ist gelöst ;-)
Montag, 16. September 13
30. einfach?
• Kleine Funktionen mit EINER Aufgabe
• Klassen die eine Problemstellung lösen
• Probleme und Aufgaben soweit unterteilen wir irgend
möglich
• Überschaubarer Programmcode.
Montag, 16. September 13
37. <16 Geringe Komplexität
17-128 Mittlere Komplexität
129-1024 Hohe Komplexität
>1025 Sehr hohe Komplexität
N-Path Complexity
Montag, 16. September 13
38. N-Path ist:
Die minimale Anzahl der
Tests die nötig sind eine
Routine komplett zu
testen
Montag, 16. September 13
41. Aha
• Durch die Tests ist aufgefallen, das wir die Schnittstelle
geändert haben.
• Mit „Unit Tests“ testen wir die öffentlichen Schnittstellen
einer Klasse
Montag, 16. September 13
42. Ups
• Wir testen nun auch die Klasse „CoinChecker“, damit ist
der Erfolg unserer Tests von einer anderen Klasse
abhängig
• Unsere Klasse hat neudeutsch eine Dependency und
kann nicht mehr isoliert getestet werden.
• Die Klasse ist auch noch hardcoded in unserer Klasse
eingebunden
Montag, 16. September 13
43. BÖSE
public function processInsertedCoins($coin)
{
$credits = CoinChecker::CalculateCredits($coin);
$this->countAcceptedCoins($credits);
}
Montag, 16. September 13
45. Aha
• Abhängigkeiten sollten vermieden werden.
• Sind andere Klassen notwendig können diese ggf.
durch Mock-Klassen ersetzt werden
• Mock Objekte können auch onTheFly erzeugt werden.
• Am besten so programmieren, als ob es statische
Klassenaufrufe nicht geben würde.
Montag, 16. September 13