Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Testing untestable code - PHPUGFFM 01/11

2,442 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Testing untestable code - PHPUGFFM 01/11

  1. 1. Testing untestable code Stephan Hochdörfer, bitExpert AG "Quality is a function of thought and reflection - precise thought and reflection. That’s the magic." 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

×