PhpUnit
Robert Deutz, Joomladay Germany 2013
Unit Tests in Joomla!
Einführung und Grundlegendes
Montag, 16. September 13
Die unvermeidlichen ..
Montag, 16. September 13
2002
Selbstständig
2005
Mamboday
2006
Joomladay
2008 2010
1.5
Beez
OSM
2012
2013
JWC
Robert Deutz
Montag, 16. September 13
• Alle Entwicklungen unter einem Dach
• Zentrale Anlaufstelle
• Updates
Montag, 16. September 13
Ziel?
Montag, 16. September 13
Interesse wecken!
Montag, 16. September 13
aber wie ......
Montag, 16. September 13
.. anfangen
Montag, 16. September 13
- einfach -
Montag, 16. September 13
DRINKS
coins
Beer Water
Montag, 16. September 13
Black Box
Montag, 16. September 13
Erwartungen
Montag, 16. September 13
Behauptungen
- assertion -
Montag, 16. September 13
Back to Drinks
Montag, 16. September 13
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
DEMO
1
Montag, 16. September 13
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
Assertions
• assert[Not]Equals()
• assert[Not]False()
• assert[Not]Null()
• assertArrayHasKey()
• assert[Not]Empty()
Montag, 16. September 13
DEMO
2
Montag, 16. September 13
Aha
• Jeder Test läuft isoliert mit, setup() und teardown()
initialisieren wir die Testumgebung
• Wie haben eindeutig zu wenig Bier ;-)
Montag, 16. September 13
DEMO
3
Montag, 16. September 13
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
Wie schreibe ich
Tests?
Montag, 16. September 13
Falsche Frage
oder
Falscher Zeitpunkt
Montag, 16. September 13
„Schlechter“ Code ist
schwer zu testen
Montag, 16. September 13
Perfekt:
Wenn Tests vor dem
eigentlichen Code
geschrieben werden
Montag, 16. September 13
Reality Check!
Montag, 16. September 13
Also, was beachten?
Montag, 16. September 13
Programmiere
einfach
Montag, 16. September 13
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
Cyclomatic
Complexity
Montag, 16. September 13
Anzahl der
Entscheidungspunkte
in einer Routine
Montag, 16. September 13
N-Path Complexity
Montag, 16. September 13
Anzahl der eindeutigen
Pfade durch eine
Routine
Montag, 16. September 13
DEMO
4
Montag, 16. September 13
Zusammenhang:
Cyclomatic und N-Path
Complexity
NP = 2 ^ (CC-1)
Montag, 16. September 13
<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
N-Path ist:
Die minimale Anzahl der
Tests die nötig sind eine
Routine komplett zu
testen
Montag, 16. September 13
Back to Drinks
Montag, 16. September 13
DEMO
5+6
Montag, 16. September 13
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
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
BÖSE
	 public function processInsertedCoins($coin)
	 {
	 	 $credits = CoinChecker::CalculateCredits($coin);
	 	 $this->countAcceptedCoins($credits);
	 }
Montag, 16. September 13
DEMO
7+8
Montag, 16. September 13
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
Joomla
Montag, 16. September 13
DANKE
Montag, 16. September 13
* https://github.com/sebastianbergmann/phpunit/
* http://blog.ircmaxell.com/2013/05/development-by-numbers-slides.html
Code examples die in diesem Vortrag verwendet worden sind:
* https://github.com/rdeutz/talk-jd13de-unittests
Links
Montag, 16. September 13

Phpunit