SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ähnlich wie Unit testing in php

Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11Stephan Hochdörfer
 
Continuous Integration / Deployment mit Jenkins CI
Continuous Integration / Deployment mit Jenkins CI Continuous Integration / Deployment mit Jenkins CI
Continuous Integration / Deployment mit Jenkins CI Florian Bosselmann
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Markus Unterauer
 
Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Adam Sandman
 
Next Level Unit Testing
Next Level Unit TestingNext Level Unit Testing
Next Level Unit TestingDaniel Lehner
 
Unit Testing einer Zend-Framework 2 Anwendung
Unit Testing einer Zend-Framework 2 AnwendungUnit Testing einer Zend-Framework 2 Anwendung
Unit Testing einer Zend-Framework 2 AnwendungRalf Eggert
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deHolger Hammel
 
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschafteneCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschaftenChristoph Menke
 
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...Nico Orschel
 
Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...
Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...
Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...Virtual Forge
 
How to speed up Spring Integration Tests
How to speed up Spring Integration TestsHow to speed up Spring Integration Tests
How to speed up Spring Integration TestsQAware GmbH
 
UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...
UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...
UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...Nico Orschel
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesChristian Güdemann
 
Consumer- Driven Contract Testing - ein Überblick
Consumer- Driven Contract Testing - ein ÜberblickConsumer- Driven Contract Testing - ein Überblick
Consumer- Driven Contract Testing - ein Überblicktobiasflohre
 
Ich will agil testen! was muss ich können iqnite 2014 - verison 2.0
Ich will agil testen! was muss ich können   iqnite 2014 - verison 2.0Ich will agil testen! was muss ich können   iqnite 2014 - verison 2.0
Ich will agil testen! was muss ich können iqnite 2014 - verison 2.0Michael Fischlein
 
Präsentation plug in development
Präsentation plug in developmentPräsentation plug in development
Präsentation plug in developmentxxtesaxx
 
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software EntwicklungDevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software EntwicklungMarc Müller
 
DevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigenDevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigenFotiosKaramitsos
 

Ähnlich wie Unit testing in php (20)

Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11
 
Continuous Integration / Deployment mit Jenkins CI
Continuous Integration / Deployment mit Jenkins CI Continuous Integration / Deployment mit Jenkins CI
Continuous Integration / Deployment mit Jenkins CI
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
 
Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)Intersys - Integration mit Spirateam (Zurich 2017)
Intersys - Integration mit Spirateam (Zurich 2017)
 
Next Level Unit Testing
Next Level Unit TestingNext Level Unit Testing
Next Level Unit Testing
 
Unit Testing einer Zend-Framework 2 Anwendung
Unit Testing einer Zend-Framework 2 AnwendungUnit Testing einer Zend-Framework 2 Anwendung
Unit Testing einer Zend-Framework 2 Anwendung
 
iOS Testautomation bei mobile.de
iOS Testautomation bei mobile.deiOS Testautomation bei mobile.de
iOS Testautomation bei mobile.de
 
CDI
CDICDI
CDI
 
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschafteneCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
 
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
Testmanagement mit Visual Studio 2013 / CodedUI / Neues aus der Produktgruppe...
 
Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...
Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...
Case Study: Automatisierte Code Reviews in einer gewachsenen SAP-Applikations...
 
How to speed up Spring Integration Tests
How to speed up Spring Integration TestsHow to speed up Spring Integration Tests
How to speed up Spring Integration Tests
 
UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...
UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...
UI Testautomation in der Praxis ... von Lokalisierung bis Nachhaltigkeit (Cod...
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
 
Consumer- Driven Contract Testing - ein Überblick
Consumer- Driven Contract Testing - ein ÜberblickConsumer- Driven Contract Testing - ein Überblick
Consumer- Driven Contract Testing - ein Überblick
 
Advanced Continuous Integration
Advanced Continuous IntegrationAdvanced Continuous Integration
Advanced Continuous Integration
 
Ich will agil testen! was muss ich können iqnite 2014 - verison 2.0
Ich will agil testen! was muss ich können   iqnite 2014 - verison 2.0Ich will agil testen! was muss ich können   iqnite 2014 - verison 2.0
Ich will agil testen! was muss ich können iqnite 2014 - verison 2.0
 
Präsentation plug in development
Präsentation plug in developmentPräsentation plug in development
Präsentation plug in development
 
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software EntwicklungDevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
DevDay 2016 Keynote - Die Evolution agiler Software Entwicklung
 
DevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigenDevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigen
 

Unit testing in php

  • 1. Unit Testing in PHP mit PhpUnit und PhpStorm
  • 2. 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
  • 3.
  • 4.
  • 5. I © NETFORMIC GmbH I 22.12.20165 Die Testing-Pyramide • Konzept von Mike Cohn, Buch Succeeding with Agile Unit Service/Functional UI t $
  • 6. I © NETFORMIC GmbH I 22.12.20166 Bank account
  • 7. I © NETFORMIC GmbH I 22.12.20167 Bank Account Test
  • 8. I © NETFORMIC GmbH I 22.12.20168 Grundgerüst eines PHPUnit-Tests Extendet PHPUnit_Framework_TestCase
  • 9. I © NETFORMIC GmbH I 22.12.20169 Grundgerüst eines PHPUnit-Tests Test-Methode muss mit „test“ beginnen…
  • 10. I © NETFORMIC GmbH I 22.12.201610 Grundgerüst eines PHPUnit-Tests …oder mit @test annotatet sein
  • 11. I © NETFORMIC GmbH I 22.12.201611 Grundgerüst eines PHPUnit-Tests Test-Methoden enthalten sogenannte „Assertions“. Das testet!
  • 12. I © NETFORMIC GmbH I 22.12.201612 Grundgerüst eines PHPUnit-Tests Test-Methoden enthalten sogenannte „Assertions“. Das testet!
  • 13. I © NETFORMIC GmbH I 22.12.201613 Grundgerüst eines PHPUnit-Tests
  • 14. I © NETFORMIC GmbH I 22.12.201614 Grundgerüst eines PHPUnit-Tests
  • 15. 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.
  • 16. I © NETFORMIC GmbH I 22.12.201616 Test ausführen
  • 17. I © NETFORMIC GmbH I 22.12.201617 XML-Konfiguration
  • 18. I © NETFORMIC GmbH I 22.12.201618 PhpStorm einrichten
  • 19. I © NETFORMIC GmbH I 22.12.201619 Ausführen via PhpStorm
  • 20. 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?“ ?
  • 21. I © NETFORMIC GmbH I 22.12.2016 Mocks to the rescue 21
  • 22. 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.
  • 23. 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.
  • 24. I © NETFORMIC GmbH I 22.12.201624 Mocks und Dependencies
  • 25. 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…“
  • 26. 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
  • 27. 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
  • 28. I © NETFORMIC GmbH I 22.12.2016 Code Coverage 28
  • 29. 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?“
  • 30. 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
  • 31. I © NETFORMIC GmbH I 22.12.201631 Code Coverage
  • 32. 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
  • 33. 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