Testing untestable code Stephan Hochdörfer, bitExpert AG "Quality is a function of thought and reflection -  precise ...
Agenda <ul><li>Über mich
Theorie
Wie man untestbaren PHP Code testet
Testbaren Code generieren
Fazit
Fragen? </li></ul>
Über mich <ul><ul><li>Stephan Hochdörfer, bitExpert AG
Department Manager Research Labs
PHP Fanboy seit 1999
[email_address]
@shochdoerfer </li></ul></ul>
Keine Entschuldigung für schlechten Code!
Nutzung auf eigene Gefahr...
Theorie &quot;There is no secret to writing tests, there  are only secrets to write testable code!&quot; Miško Hevery
Theorie Was ist untestbarer Code?
Theorie Was ist untestbarer Code?
Theorie Was ist untestbarer Code?
Theorie &quot;...our test strategy requires us to have more control or  visibility of the internal behavior of the system ...
Theorie Test Klasse Unittest abhäng. Klasse abhäng. Klasse
Theorie Test Klasse Unittest abhäng. Klasse abhäng. Klasse Datenbank ext. Ressource abhäng. Klasse abhäng. Klasse Webservice
Theorie Test Klasse Unittest abhäng. Klasse abhäng. Klasse Datenbank ext. Ressource abhäng. Klasse abhäng. Klasse Webservice
Theorie Wie bekomme ich testbaren Code?
Theorie Wie bekomme ich testbaren Code? Refactoring
Theorie &quot;Before you start refactoring, check that you  have a solid suite of tests.&quot; Martin Fowler, Refactoring
„ untestbaren“ PHP Code testen Ran an die Arbeit...
„ untestbaren“ PHP Code testen Sicherheitsanweisung Bestehenden Programmcode nicht  verändern!
„ untestbaren“ PHP Code testen | __autoload
„ untestbaren“ PHP Code testen | __autoload Wie die Abhängigkeit auflösen? <ul><ul><li>__autoload verwenden </li></ul></ul>
„ untestbaren“ PHP Code testen | __autoload
„ untestbaren“ PHP Code testen | include_path
„ untestbaren“ PHP Code testen | include_path Wie die Abhängigkeit auflösen? <ul><ul><li>include_path manipulieren </li></...
„ untestbaren“ PHP Code testen | include_path
„ untestbaren“ PHP Code testen | include_path Alternative Quelle: Alex Netkachov, http://www.alexatnet.com/node/203
„ untestbaren“ PHP Code testen | include_path Alternative
„ untestbaren“ PHP Code testen | Namespaces
„ untestbaren“ PHP Code testen | Namespaces Wie die Abhängigkeit auflösen? <ul><ul><li>__autoload oder include_path manipu...
„ untestbaren“ PHP Code testen | vfsStream
„ untestbaren“ PHP Code testen | vfsStream Wie die Abhängigkeit auflösen? <ul><ul><li>VfsStream verwenden - http://code.go...
„ untestbaren“ PHP Code testen | vfsStream
„ untestbaren“ PHP Code testen „ I have no idea how to unit-test procedural code. Unit-testing assumes that I can instanti...
„ untestbaren“ PHP Code testen | Funktionen testen
„ untestbaren“ PHP Code testen | Funktionen testen Wie testen? <ul><ul><li>PHPUnit kann Funktionsaufrufe testen
PHPUnit kann den globalen Zustand speichern/wiederherstellen </li></ul></ul>
„ untestbaren“ PHP Code testen | Interne Funktionen überschreiben
„ untestbaren“ PHP Code testen | Interne Funktionen überschreiben Wie testen? <ul><ul><li>mysql extension nicht laden. Eig...
Problem: mail() ist Teil des PHP Kerns </li></ul></ul>
„ untestbaren“ PHP Code testen | Interne Funktionen überschreiben Wie testen? <ul><ul><li>Classkit Extension zum Überladen...
„ untestbaren“ PHP Code testen | Interne Funktionen überschreiben
Upcoming SlideShare
Loading in...5
×

Testing untestable code - PHPUGFFM 01/11

1,852

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,852
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Wow so viele Leute hier. Gibt es so viel schlechten Code oder seid ihr nur zum Spass hier?
  • Wer seit ihr? Wer hat schon untestbaren Code geschrieben? Wer hat versucht solchen Code zu testen?
  • Zwei grundsätzliche Indikatoren
  • Starke Kopplung - Tight coupling Abhängigkeiten zu konkreten Implementierungen „new“ Zu viele Abhängigkeiten zu anderen Klassen, besser Interfaces Keine Möglichkeit der Kontrolle der Abhängigkeiten
  • Ungewissheit Globale Variablen, Singleton, Registry, Globaler Zustand Statische Methodenaufrufe Businesslogik im Konstruktor Ergebnis ist nicht vorhersehbar. Brauchen Kontrolle!
  • Prozess den Quellcode zu verändern ohne das externe Verhalten zu beeinflussen. Verbessert die nonfunctionalen Attributes der Software Verbessert die Lesbarkeit des Programmcodes Komplexität reduzieren, Wartbarkeit optimieren Durch stetiges Verbesseren des Designs erleichtern wir die tägliche Arbeit mit dem Code.
  • Henne ↔ Ei Problem – Zum Refactoren brauchen wir Tests die wir nicht bauen können ohne zu refactoren. Alternativen? UI Testing? - Nicht jeder Zustand der Applikation muss in der UI sichtbar sein.
  • ...denn jede Änderungen an vorhandenem Programmcode kann Fehler zur Folge haben. Das wollen wir vermeiden!
  • Traits in PHP5 – Include für Methoden :) Mehrfachvererbung, irgendwie
  • Funktionen die nicht den globalen Zustand verändern sind einfach und testbar.
  • Frames: Marvin Minski in 1970s In the field of Artificial Intelligence, a frame is a data structure for representing knowledge. ICs need to know to to build itself depending on configuration
  • Code transformations that can be done
  • „ Smarty on steriods“
  • Wie wichtig ist die Applikation für mich? Welcher Business value steckt dahinter? Wie kompliziert ist es Tests zu schreiben? Wie viele Fehler treten tatsächlich täglich auf?
  • This demo should inspire you to think about technoloy and other cool stuff. Your limit is the imagination.
  • Testing untestable code - PHPUGFFM 01/11

    1. 1. Testing untestable code Stephan Hochdörfer, bitExpert AG &quot;Quality is a function of thought and reflection - precise thought and reflection. That’s the magic.&quot; Michael Feathers
    2. 2. Agenda <ul><li>Über mich
    3. 3. Theorie
    4. 4. Wie man untestbaren PHP Code testet
    5. 5. Testbaren Code generieren
    6. 6. Fazit
    7. 7. Fragen? </li></ul>
    8. 8. Über mich <ul><ul><li>Stephan Hochdörfer, bitExpert AG
    9. 9. Department Manager Research Labs
    10. 10. PHP Fanboy seit 1999
    11. 11. [email_address]
    12. 12. @shochdoerfer </li></ul></ul>
    13. 13. Keine Entschuldigung für schlechten Code!
    14. 14. Nutzung auf eigene Gefahr...
    15. 15. Theorie &quot;There is no secret to writing tests, there are only secrets to write testable code!&quot; Miško Hevery
    16. 16. Theorie Was ist untestbarer Code?
    17. 17. Theorie Was ist untestbarer Code?
    18. 18. Theorie Was ist untestbarer Code?
    19. 19. Theorie &quot;...our test strategy requires us to have more control or visibility of the internal behavior of the system under test.&quot; Gerard Meszaros, xUnit Test Patterns: Refactoring Test Code
    20. 20. Theorie Test Klasse Unittest abhäng. Klasse abhäng. Klasse
    21. 21. Theorie Test Klasse Unittest abhäng. Klasse abhäng. Klasse Datenbank ext. Ressource abhäng. Klasse abhäng. Klasse Webservice
    22. 22. Theorie Test Klasse Unittest abhäng. Klasse abhäng. Klasse Datenbank ext. Ressource abhäng. Klasse abhäng. Klasse Webservice
    23. 23. Theorie Wie bekomme ich testbaren Code?
    24. 24. Theorie Wie bekomme ich testbaren Code? Refactoring
    25. 25. Theorie &quot;Before you start refactoring, check that you have a solid suite of tests.&quot; Martin Fowler, Refactoring
    26. 26. „ untestbaren“ PHP Code testen Ran an die Arbeit...
    27. 27. „ untestbaren“ PHP Code testen Sicherheitsanweisung Bestehenden Programmcode nicht verändern!
    28. 28. „ untestbaren“ PHP Code testen | __autoload
    29. 29. „ untestbaren“ PHP Code testen | __autoload Wie die Abhängigkeit auflösen? <ul><ul><li>__autoload verwenden </li></ul></ul>
    30. 30. „ untestbaren“ PHP Code testen | __autoload
    31. 31. „ untestbaren“ PHP Code testen | include_path
    32. 32. „ untestbaren“ PHP Code testen | include_path Wie die Abhängigkeit auflösen? <ul><ul><li>include_path manipulieren </li></ul></ul>
    33. 33. „ untestbaren“ PHP Code testen | include_path
    34. 34. „ untestbaren“ PHP Code testen | include_path Alternative Quelle: Alex Netkachov, http://www.alexatnet.com/node/203
    35. 35. „ untestbaren“ PHP Code testen | include_path Alternative
    36. 36. „ untestbaren“ PHP Code testen | Namespaces
    37. 37. „ untestbaren“ PHP Code testen | Namespaces Wie die Abhängigkeit auflösen? <ul><ul><li>__autoload oder include_path manipulieren </li></ul></ul>
    38. 38. „ untestbaren“ PHP Code testen | vfsStream
    39. 39. „ untestbaren“ PHP Code testen | vfsStream Wie die Abhängigkeit auflösen? <ul><ul><li>VfsStream verwenden - http://code.google.com/p/bovigo/ </li></ul></ul>
    40. 40. „ untestbaren“ PHP Code testen | vfsStream
    41. 41. „ untestbaren“ PHP Code testen „ I have no idea how to unit-test procedural code. Unit-testing assumes that I can instantiate a piece of my application in isolation.“ Miško Hevery
    42. 42. „ untestbaren“ PHP Code testen | Funktionen testen
    43. 43. „ untestbaren“ PHP Code testen | Funktionen testen Wie testen? <ul><ul><li>PHPUnit kann Funktionsaufrufe testen
    44. 44. PHPUnit kann den globalen Zustand speichern/wiederherstellen </li></ul></ul>
    45. 45. „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben
    46. 46. „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben Wie testen? <ul><ul><li>mysql extension nicht laden. Eigene Implementierung bereitstellen
    47. 47. Problem: mail() ist Teil des PHP Kerns </li></ul></ul>
    48. 48. „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben Wie testen? <ul><ul><li>Classkit Extension zum Überladen interner Funktionen verwenden </li></ul></ul>
    49. 49. „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben
    50. 50. „ untestbaren“ PHP Code testen
    51. 51. Generative Programmierung
    52. 52. Generative Programmierung 1 ... n Konfiguration Implementierungs- Komponenten Generator- System Produkte Generator
    53. 53. Generative Programmierung Konfiguration Implementierungs- Komponenten Generator- System Anwendung Generator Testfälle
    54. 54. Vorgehensweise Extraktion <ul><ul><li>„ Ausblenden“ von Programmcode </li></ul></ul>Individualisierung <ul><ul><li>Globale Variablen mit anderen Inhalten belegen
    55. 55. Pre/Postfixes für Funktionen, Methoden, Klassen </li></ul></ul>Rekombination <ul><ul><li>Teile des Programmcodes neu anordnen </li></ul></ul>
    56. 57. 1. Beispiel Prefix: test_
    57. 58. 1. Beispiel Prefix: test_ 2. Beispiel MailSlot: mail('order@domain.org', 'New sale', '....');
    58. 59. Fazit Wie weit soll man gehen?
    59. 60. Fazit Fazit <ul><ul><li>Denkweise ändern </li></ul></ul><ul><ul><ul><li>Programmcode auf Testbarkeit hin optimieren
    60. 61. Dependency Injection </li></ul></ul></ul><ul><ul><li>Über den Tellerrand hinaus </li></ul></ul><ul><ul><ul><li>Limitierungen von PHP umgehen
    61. 62. PHP ist flexibel </li></ul></ul></ul>
    62. 63. http://joind.in/2482
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×