Testing untestable code - PHPUGFFM 01/11
Upcoming SlideShare
Loading in...5
×
 

Testing untestable code - PHPUGFFM 01/11

on

  • 1,992 views

 

Statistics

Views

Total Views
1,992
Views on SlideShare
1,990
Embed Views
2

Actions

Likes
0
Downloads
3
Comments
0

1 Embed 2

http://lanyrd.com 2

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • 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 Testing untestable code - PHPUGFFM 01/11 Presentation Transcript

  • 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
  • Agenda
    • Über mich
    • Theorie
    • Wie man untestbaren PHP Code testet
    • Testbaren Code generieren
    • Fazit
    • Fragen?
  • Über mich
      • Stephan Hochdörfer, bitExpert AG
      • Department Manager Research Labs
      • PHP Fanboy seit 1999
      • [email_address]
      • @shochdoerfer
  • Keine Entschuldigung für schlechten Code!
  • Nutzung auf eigene Gefahr...
  • Theorie "There is no secret to writing tests, there are only secrets to write testable code!" Miško Hevery
  • Theorie Was ist untestbarer Code?
  • Theorie Was ist untestbarer Code?
  • Theorie Was ist untestbarer Code?
  • Theorie "...our test strategy requires us to have more control or visibility of the internal behavior of the system under test." Gerard Meszaros, xUnit Test Patterns: Refactoring Test Code
  • 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 "Before you start refactoring, check that you have a solid suite of tests." 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?
      • __autoload verwenden
  • „ untestbaren“ PHP Code testen | __autoload
  • „ untestbaren“ PHP Code testen | include_path
  • „ untestbaren“ PHP Code testen | include_path Wie die Abhängigkeit auflösen?
      • include_path manipulieren
  • „ 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?
      • __autoload oder include_path manipulieren
  • „ untestbaren“ PHP Code testen | vfsStream
  • „ untestbaren“ PHP Code testen | vfsStream Wie die Abhängigkeit auflösen?
      • VfsStream verwenden - http://code.google.com/p/bovigo/
  • „ 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 instantiate a piece of my application in isolation.“ Miško Hevery
  • „ untestbaren“ PHP Code testen | Funktionen testen
  • „ untestbaren“ PHP Code testen | Funktionen testen Wie testen?
      • PHPUnit kann Funktionsaufrufe testen
      • PHPUnit kann den globalen Zustand speichern/wiederherstellen
  • „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben
  • „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben Wie testen?
      • mysql extension nicht laden. Eigene Implementierung bereitstellen
      • Problem: mail() ist Teil des PHP Kerns
  • „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben Wie testen?
      • Classkit Extension zum Überladen interner Funktionen verwenden
  • „ untestbaren“ PHP Code testen | Interne Funktionen überschreiben
  • „ untestbaren“ PHP Code testen
  • Generative Programmierung
  • Generative Programmierung 1 ... n Konfiguration Implementierungs- Komponenten Generator- System Produkte Generator
  • Generative Programmierung Konfiguration Implementierungs- Komponenten Generator- System Anwendung Generator Testfälle
  • Vorgehensweise Extraktion
      • „ Ausblenden“ von Programmcode
    Individualisierung
      • Globale Variablen mit anderen Inhalten belegen
      • Pre/Postfixes für Funktionen, Methoden, Klassen
    Rekombination
      • Teile des Programmcodes neu anordnen
  •  
  • 1. Beispiel Prefix: test_
  • 1. Beispiel Prefix: test_ 2. Beispiel MailSlot: mail('order@domain.org', 'New sale', '....');
  • Fazit Wie weit soll man gehen?
  • Fazit Fazit
      • Denkweise ändern
        • Programmcode auf Testbarkeit hin optimieren
        • Dependency Injection
      • Über den Tellerrand hinaus
        • Limitierungen von PHP umgehen
        • PHP ist flexibel
  • http://joind.in/2482