Unit Testing in PHP mit
PhpUnit und PhpStorm
I © NETFORMIC GmbH I 22.12.20162
Adrian Föder
Über mich
• Senior Software Developer
bei NETFORMIC
• Eine Frau, ein Kind,
eine Kaffeemaschine
• Twitter: @afoeder
I © NETFORMIC GmbH I 22.12.20165
Die Testing-Pyramide
• Konzept von Mike Cohn, Buch Succeeding with Agile
Unit
Service/Functional
UI
t $
I © NETFORMIC GmbH I 22.12.20166
Bank account
I © NETFORMIC GmbH I 22.12.20167
Bank Account Test
I © NETFORMIC GmbH I 22.12.20168
Grundgerüst eines PHPUnit-Tests
Extendet PHPUnit_Framework_TestCase
I © NETFORMIC GmbH I 22.12.20169
Grundgerüst eines PHPUnit-Tests
Test-Methode muss mit „test“ beginnen…
I © NETFORMIC GmbH I 22.12.201610
Grundgerüst eines PHPUnit-Tests
…oder mit @test annotatet sein
I © NETFORMIC GmbH I 22.12.201611
Grundgerüst eines PHPUnit-Tests
Test-Methoden enthalten sogenannte „Assertions“. Das testet!
I © NETFORMIC GmbH I 22.12.201612
Grundgerüst eines PHPUnit-Tests
Test-Methoden enthalten sogenannte „Assertions“. Das testet!
I © NETFORMIC GmbH I 22.12.201613
Grundgerüst eines PHPUnit-Tests
I © NETFORMIC GmbH I 22.12.201614
Grundgerüst eines PHPUnit-Tests
I © NETFORMIC GmbH I 22.12.201615
PHPUnit installieren
• https://phpunit.de: .phar-Archiv herunterladen
und an einen gut zugänglichen Ort verschieben,
auch bspw. in phpunit.phar umbenennen.
I © NETFORMIC GmbH I 22.12.201616
Test ausführen
I © NETFORMIC GmbH I 22.12.201617
XML-Konfiguration
I © NETFORMIC GmbH I 22.12.201618
PhpStorm einrichten
I © NETFORMIC GmbH I 22.12.201619
Ausführen via PhpStorm
I © NETFORMIC GmbH I 22.12.201620
HTTP Adapter testen
Mocks und Dependencies
• Macht der http-Adapter auch
wirklich einen POST-Request an
den richtigen Endpoint mit den
richtigen Daten im richtigen
Format?“
?
I © NETFORMIC GmbH I 22.12.2016
Mocks to the rescue
21
I © NETFORMIC GmbH I 22.12.201622
Mocks und Dependencies
• Mocks lassen sich von Klassen, aber
auch Interfaces und abstrakten
Klassen erstellen
• PHPUnit untersucht das Interface
und baut die passenden Methoden,
allerdings sind deren Bodies leer, sie
tun nichts.
I © NETFORMIC GmbH I 22.12.201623
Den Mock überwachen
Mocks und Dependencies
• Die erwartete Anzahl bestimmter
Methodenaufrufe lässt sich
einstellen
• Diese Konfiguration steuert die
Erwartung der implementierten
Klasse: die Methode „request“
muss ein mal (once) aufgerufen
werden.
I © NETFORMIC GmbH I 22.12.201624
Mocks und Dependencies
I © NETFORMIC GmbH I 22.12.2016
Mocks verwenden wir, wenn…
25
• Implementierung unbekannt • Es zu prüfen ist, ob der
Testkandidat eine bestimmte
Sache „weitergibt“.
Wir können Mocks aus dem Test
heraus beliebig formen und
gestalten, um unserem
Testanspruch gerecht zu werden.
• oder im Sinne des Tests irrelevant:
„Macht der http-Adapter auch
wirklich einen POST-Request…“
I © NETFORMIC GmbH I 22.12.2016
Mocks werden wir auch brauchen, um…
26
• Dependency Injection Hell entgegenzuwirken
 besonders anfällig bei Dependency Injection Container - Patterns
I © NETFORMIC GmbH I
Close Coupling schlägt sich direkt in die Testbarkeit des Codes nieder.
Schlecht zu testen ist auch schlecht zu warten ist (meistens) auch schlecht
programmiert.
Das Law of Demeter spiegelt sich hier auch wieder.
Deshalb helfen Unit Tests,
ordentlichen Code zu schreiben.
22.12.201627
I © NETFORMIC GmbH I 22.12.2016
Code Coverage
28
I © NETFORMIC GmbH I 22.12.201629
Code Coverage
„Als Testabdeckung bezeichnet man das Verhältnis
an tatsächlich getroffenen Aussagen eines Tests
gegenüber den theoretisch möglich treffbaren
Aussagen bzw. der Menge der gewünschten
treffbaren Aussagen.“
-Wikipeda
„Ist mein Code (ausreichend) gut getestet?“
I © NETFORMIC GmbH I 22.12.201630
Code Coverage
Beispielsweise Metriken
• Line Coverage: Wieviel Zeilen des vorhandenen Codes
wurden während eines Tests ausgeführt?
• Function and method coverage: Wurden alle
möglichen Funktionen/Methoden ausgeführt?
• Branch coverage: Wurde der Ausdruck jeder
Bedingung einmal true und einmal false evaluiert?
• Change Risk Anti-Patterns (CRAP) Index: stellt die
Komplexität eines Codes der Testabdeckung
gegenüber. Moderate Komplexität und ordentlicher
Testabdeckung: niedriger CRAP-Index.
Voraussetzungen
• Xdebug
I © NETFORMIC GmbH I 22.12.201631
Code Coverage
I © NETFORMIC GmbH I 22.12.2016
(Bild-) Quellen
32
• PHP-Logo: http://nl1.php.net/download-logos.php
• Rube Goldberg-Maschine: https://infoexplorerblog.wordpress.com/2015/05/23/rube-goldberg-machine/
• Test-Pyramide: http://martinfowler.com/bliki/TestPyramid.html
• DI-Container / IoC-Container, nice read: http://stackoverflow.com/q/871405/1388892
Kontakt
So erreichen Sie uns.
E-Mail
info@netformic.de
URL
www.netformic.de
Telefon 0711 761642 0
Fax 0711 761642 26
Standort Stuttgart (HQ) Berlin
Hermannstr. 5A Fanny-Zobel-Str. 11
70178 Stuttgart 12435 Berlin
Ansprechpartner
Funktion
Telefon
E-Mail
NETFORMIC GmbH
Adrian Föder
Senior Software Developer
@afoeder
adrian.foeder@netformic.de

Unit testing in php

  • 1.
    Unit Testing inPHP mit PhpUnit und PhpStorm
  • 2.
    I © NETFORMICGmbH I 22.12.20162 Adrian Föder Über mich • Senior Software Developer bei NETFORMIC • Eine Frau, ein Kind, eine Kaffeemaschine • Twitter: @afoeder
  • 5.
    I © NETFORMICGmbH I 22.12.20165 Die Testing-Pyramide • Konzept von Mike Cohn, Buch Succeeding with Agile Unit Service/Functional UI t $
  • 6.
    I © NETFORMICGmbH I 22.12.20166 Bank account
  • 7.
    I © NETFORMICGmbH I 22.12.20167 Bank Account Test
  • 8.
    I © NETFORMICGmbH I 22.12.20168 Grundgerüst eines PHPUnit-Tests Extendet PHPUnit_Framework_TestCase
  • 9.
    I © NETFORMICGmbH I 22.12.20169 Grundgerüst eines PHPUnit-Tests Test-Methode muss mit „test“ beginnen…
  • 10.
    I © NETFORMICGmbH I 22.12.201610 Grundgerüst eines PHPUnit-Tests …oder mit @test annotatet sein
  • 11.
    I © NETFORMICGmbH I 22.12.201611 Grundgerüst eines PHPUnit-Tests Test-Methoden enthalten sogenannte „Assertions“. Das testet!
  • 12.
    I © NETFORMICGmbH I 22.12.201612 Grundgerüst eines PHPUnit-Tests Test-Methoden enthalten sogenannte „Assertions“. Das testet!
  • 13.
    I © NETFORMICGmbH I 22.12.201613 Grundgerüst eines PHPUnit-Tests
  • 14.
    I © NETFORMICGmbH I 22.12.201614 Grundgerüst eines PHPUnit-Tests
  • 15.
    I © NETFORMICGmbH I 22.12.201615 PHPUnit installieren • https://phpunit.de: .phar-Archiv herunterladen und an einen gut zugänglichen Ort verschieben, auch bspw. in phpunit.phar umbenennen.
  • 16.
    I © NETFORMICGmbH I 22.12.201616 Test ausführen
  • 17.
    I © NETFORMICGmbH I 22.12.201617 XML-Konfiguration
  • 18.
    I © NETFORMICGmbH I 22.12.201618 PhpStorm einrichten
  • 19.
    I © NETFORMICGmbH I 22.12.201619 Ausführen via PhpStorm
  • 20.
    I © NETFORMICGmbH I 22.12.201620 HTTP Adapter testen Mocks und Dependencies • Macht der http-Adapter auch wirklich einen POST-Request an den richtigen Endpoint mit den richtigen Daten im richtigen Format?“ ?
  • 21.
    I © NETFORMICGmbH I 22.12.2016 Mocks to the rescue 21
  • 22.
    I © NETFORMICGmbH I 22.12.201622 Mocks und Dependencies • Mocks lassen sich von Klassen, aber auch Interfaces und abstrakten Klassen erstellen • PHPUnit untersucht das Interface und baut die passenden Methoden, allerdings sind deren Bodies leer, sie tun nichts.
  • 23.
    I © NETFORMICGmbH I 22.12.201623 Den Mock überwachen Mocks und Dependencies • Die erwartete Anzahl bestimmter Methodenaufrufe lässt sich einstellen • Diese Konfiguration steuert die Erwartung der implementierten Klasse: die Methode „request“ muss ein mal (once) aufgerufen werden.
  • 24.
    I © NETFORMICGmbH I 22.12.201624 Mocks und Dependencies
  • 25.
    I © NETFORMICGmbH I 22.12.2016 Mocks verwenden wir, wenn… 25 • Implementierung unbekannt • Es zu prüfen ist, ob der Testkandidat eine bestimmte Sache „weitergibt“. Wir können Mocks aus dem Test heraus beliebig formen und gestalten, um unserem Testanspruch gerecht zu werden. • oder im Sinne des Tests irrelevant: „Macht der http-Adapter auch wirklich einen POST-Request…“
  • 26.
    I © NETFORMICGmbH I 22.12.2016 Mocks werden wir auch brauchen, um… 26 • Dependency Injection Hell entgegenzuwirken  besonders anfällig bei Dependency Injection Container - Patterns
  • 27.
    I © NETFORMICGmbH I Close Coupling schlägt sich direkt in die Testbarkeit des Codes nieder. Schlecht zu testen ist auch schlecht zu warten ist (meistens) auch schlecht programmiert. Das Law of Demeter spiegelt sich hier auch wieder. Deshalb helfen Unit Tests, ordentlichen Code zu schreiben. 22.12.201627
  • 28.
    I © NETFORMICGmbH I 22.12.2016 Code Coverage 28
  • 29.
    I © NETFORMICGmbH I 22.12.201629 Code Coverage „Als Testabdeckung bezeichnet man das Verhältnis an tatsächlich getroffenen Aussagen eines Tests gegenüber den theoretisch möglich treffbaren Aussagen bzw. der Menge der gewünschten treffbaren Aussagen.“ -Wikipeda „Ist mein Code (ausreichend) gut getestet?“
  • 30.
    I © NETFORMICGmbH I 22.12.201630 Code Coverage Beispielsweise Metriken • Line Coverage: Wieviel Zeilen des vorhandenen Codes wurden während eines Tests ausgeführt? • Function and method coverage: Wurden alle möglichen Funktionen/Methoden ausgeführt? • Branch coverage: Wurde der Ausdruck jeder Bedingung einmal true und einmal false evaluiert? • Change Risk Anti-Patterns (CRAP) Index: stellt die Komplexität eines Codes der Testabdeckung gegenüber. Moderate Komplexität und ordentlicher Testabdeckung: niedriger CRAP-Index. Voraussetzungen • Xdebug
  • 31.
    I © NETFORMICGmbH I 22.12.201631 Code Coverage
  • 32.
    I © NETFORMICGmbH I 22.12.2016 (Bild-) Quellen 32 • PHP-Logo: http://nl1.php.net/download-logos.php • Rube Goldberg-Maschine: https://infoexplorerblog.wordpress.com/2015/05/23/rube-goldberg-machine/ • Test-Pyramide: http://martinfowler.com/bliki/TestPyramid.html • DI-Container / IoC-Container, nice read: http://stackoverflow.com/q/871405/1388892
  • 33.
    Kontakt So erreichen Sieuns. E-Mail info@netformic.de URL www.netformic.de Telefon 0711 761642 0 Fax 0711 761642 26 Standort Stuttgart (HQ) Berlin Hermannstr. 5A Fanny-Zobel-Str. 11 70178 Stuttgart 12435 Berlin Ansprechpartner Funktion Telefon E-Mail NETFORMIC GmbH Adrian Föder Senior Software Developer @afoeder adrian.foeder@netformic.de