SlideShare une entreprise Scribd logo
1  sur  71
Télécharger pour lire hors ligne
Testing untestable code
Testing untestable code

 Über mich

  Stephan Hochdörfer, bitExpert AG
  Department Manager Research Labs
  S.Hochdoerfer@bitExpert.de
  @shochdoerfer
Testing untestable code

 Keine Entschuldigung für schlechten Code!
Testing untestable code




 Nicht ausflippen!
Testing untestable code




 Kreativität zählt!
Testing untestable code




     "There is no secret to writing tests,
       there are only secrets to write
               testable code!"
                          Miško Hevery
Testing untestable code

 Was ist „untestbarer Code“?
Testing untestable code




 1. Falsche Instantiierung

         “new” is evil!
                          s
Testing untestable code



 2. Starke Kopplung
Testing untestable code




 Keine Wiederverwendbarkeit
Testing untestable code




 Nicht isolierbar, nicht testbar!
Testing untestable code




 3. Ungewissheit
Testing untestable code




       "...our test strategy requires us to
       have more control [...] of the sut."
      Gerard Meszaros, xUnit Test Patterns: Refactoring Test
                              Code
Testing untestable code

 In einer perfekten Welt..




                  Unittest
                   Unittest   SUT
                               SUT
Testing untestable code

 Legacy code ist nicht perfekt...


                                    Abhängige
                                     Abhängige
                                      Klasse
                                       Klasse
       Unittest
        Unittest          SUT
                           SUT

                                    Abhängige
                                     Abhängige
                                      Klasse
                                       Klasse
Testing untestable code
                                    ...
 Legacy code ist nicht perfekt...


                                     Abhängige
                                      Abhängige
                                       Klasse
                                        Klasse
       Unittest
        Unittest          SUT
                           SUT

                                     Abhängige
                                      Abhängige
                                       Klasse
                                        Klasse




                                     ...
Testing untestable code
                                    ...
 Legacy code ist nicht perfekt...


                                     Abhängige
                                      Abhängige
                                       Klasse
                                        Klasse
       Unittest
        Unittest          SUT
                           SUT

                                     Abhängige
                                      Abhängige
                                       Klasse
                                        Klasse




                                     ...
Testing untestable code

 Wie erzeugt man „testbaren Code“?
Testing untestable code

 Wie erzeugt man „testbaren Code“?




                   Refactoring
Testing untestable code




     "Before you start refactoring, check
     that you have a solid suite of tests."
                    Martin Fowler, Refactoring
Testing untestable code




 Hoffnung? ...ist nicht genug
Testing untestable code

 Wohin führt die Reise?
Testing untestable code

 Wohin führt die Reise?




           Vorhandenen Code nicht
                  ändern!
Testing untestable code

 Beispiele




 Objekterzeugung      Externe Ressourcen   Sprachbarrieren
Testing untestable code

 Objekterzeugung
 public class Car {
    private Engine engine;

     public Car(String engine) {
        this.engine = EngineFactory.getByType(engine);
     }
 }
Testing untestable code

 Objekterzeugung - Autoload
 public class MyLoader extends ClassLoader {
    protected Class findClass(String name)
       throws ClassNotFoundException
    {
       try {
          String path = name.replace('.', '/');
          // @TODO: change path and read file,
          // @TODO: define package
          // @TODO: define class
       }
       catch(Exception e){
          throw new ClassNotFoundException(name);
       }
    }
 }
Testing untestable code

 Objekterzeugung – Stream Wrapper
 <?php
 class CustomWrapper {
   private $_handler;

   function stream_open($path, $mode, $options,
 &$opened_path) {

         stream_wrapper_restore('file');
         // @TODO: modify $path before fopen
         $this->_handler = fopen($path, $mode);
         stream_wrapper_unregister('file');
         stream_wrapper_register('file', 'CustomWrapper');
         return true;
     }
 }
Testing untestable code

 Objekterzeugung – Stream Wrapper
 <?php
 class CustomWrapper {
    private $_handler ;

     function stream_read( $count ) {
        $content = fread($this->_handler, $count );
        $content = str_replace ('Engine::getByType' ,
         ' Abstract Engine::get' , $content );
        return $content ;
     }
 }
Testing untestable code

 Externe Ressourcen
Testing untestable code

 Externe Ressourcen



            Datenbank     Webservice



           Dateisystem    Mailserver
Testing untestable code

 Externe Ressourcen – Datenbank mocken
Testing untestable code

 Externe Ressourcen – Datenbank mocken




      Eigene Implementierung anbieten
Testing untestable code

 Externe Ressourcen – Datenbank mocken




                     junit + dbunit
Testing untestable code

 Externe Ressourcen – Datenbank mocken




 PHPUnit_Extensions_Database_TestCase
Testing untestable code

 Externe Ressourcen – Datenbank mocken




             Proxy für den SQL Server
Testing untestable code

 Externe Ressourcen – Webservice mocken
Testing untestable code

 Externe Ressourcen – Webservice mocken




      Eigene Implementierung anbieten
Testing untestable code

 Externe Ressourcen – Webservice mocken




              Host Alias via /etc/hosts
Testing untestable code

 Externe Ressourcen – Dateisytem mocken
Testing untestable code

 Externe Ressourcen – Dateisytem mocken




                     Commons-VFS
Testing untestable code

 Externe Ressourcen – Dateisytem mocken




                          vfsStream
Testing untestable code

 Externe Ressourcen – Dateisystem mocken
 <?php

 // set up test environmemt
 vfsStream::setup('exampleDir');

 // create directory in test enviroment
 mkdir(vfsStream::url('exampleDir').'/sample/');

 // check if directory was created
 echo vfsStreamWrapper::getRoot()->hasChild('sample');
Testing untestable code

 Externe Ressourcen – Mailserver mocken
Testing untestable code

 Externe Ressourcen – Mailserver mocken




           fake mail server verwenden
Testing untestable code

 Sprachbarrieren
Testing untestable code

 Sprachbarrieren




          private Methoden testen?
Testing untestable code

 Sprachbarrieren
 final Method methods[] =
 o.getClass().getDeclaredMethods();
 for (int i = 0; i < methods.length; ++i) {
    if (methodName.equals(methods[i].getName())) {
       try {
          methods[i].setAccessible(true);
          return methods[i].invoke(o, params);
       }
       catch (IllegalAccessException ex) {
       }
       catch (InvocationTargetException ite) {
       }
    }
    return null;
 }
Testing untestable code

 Sprachbarrieren
 <?php
 class CustomWrapper {
    private $_handler;

     function stream_read($count) {
        $content = fread($this->_handler, $count);
        $content = str_replace(
           'private function',
           'public function',
           $content
        );
        return $content;
     }
Testing untestable code

 Sprachbarrieren




                Interne Funktionen
                  überschreiben?
Testing untestable code

 Sprachbarrieren - Runkit




              pecl install runkit-0.9
Testing untestable code

 Sprachbarrieren - Runkit
 <?php

 ini_set('runkit.internal_override', '1');

 runkit_function_redefine('mail','','return
 true;');

 ?>
Testing untestable code




 Spielraum?
Testing untestable code




 Abstrahieren du sollst!
Testing untestable code

 Was sonst?




        Generative Programmierung
Testing untestable code

 Generative Programmierung




                          Generator
                          Generator
Testing untestable code

 Generative Programmierung

                          Konfiguration
                           Konfiguration
                             (DSL)
                              (DSL)




                          Generator
                          Generator
Software generieren statt programmieren


 Generative Programmierung

                                          Konfiguration
                                           Konfiguration
                                             (DSL)
                                              (DSL)




   Implementierungs-
    Implementierungs-
     komponenten
                                          Generator
                                          Generator
      komponenten
Testing untestable code

 Generative Programmierung

                          Konfiguration
                           Konfiguration
                             (DSL)
                              (DSL)



                                           1..n
  Implementierungs-
   Implementierungs-
    komponenten
                          Generator
                          Generator          Produkt
     komponenten                              Produkt
Testing untestable code

 Generative Programmierung

                          Konfiguration
                           Konfiguration
                             (DSL)
                              (DSL)
                                             Tests
                                              Tests



  Implementierungs-
   Implementierungs-
    komponenten
                          Generator
                          Generator        Applikation
     komponenten                            Applikation
Testing untestable code

 Generative Programmierung




    Ein Frame ist eine Datenstruktur
        die Wissen repräsentiert.
Testing untestable code

 Eine Frame Instanz
 public class Car {
    private Engine engine;

     public Car(String engine) {
        this.engine = <!{Factory}!>.getByType(engine);
     }
 }
Testing untestable code

 Der Frame Controller

 public class MyFrameController extends
 SimpleFrameController {

    public void execute(Frame frame, FeatureConfig
 config) {
       if(config.hasFeature("unittest")) {
         frame.setSlot("Factory", "FactoryMock");
       }
       else {
         frame.setSlot("Factory", "EngineFactory");
       }
    }
 }
Testing untestable code

 Nach der Generierung - Testcase
 public class Car {
    private Engine engine;

     public Car(String engine) {
        this.engine = FactoryMock.getByType(engine);
     }
 }
Testing untestable code

 Nach der Generierung - Applikation
 public class Car {
    private Engine engine;

     public Car(String engine) {
        this.engine = EngineFactory.getByType(engine);
     }
 }
Testing untestable code

 Was ist möglich?
Testing untestable code

 Was ist möglich?




            Extraktion von Codezeilen
Testing untestable code

 Was ist möglich?




            Globale Inhalte verändern
Testing untestable code

 Was ist möglich?




       Pre- oder Postfixes für Methoden
Testing untestable code

 Wie weit sollte man gehen?
Vielen Dank!
Testing untestable code

 Bildquellen

 http://www.flickr.com/photos/andresrueda/3452940751/
 http://www.flickr.com/photos/andresrueda/3455410635/

Contenu connexe

Similaire à Testing untestable code - gearconf11

Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Oliver Klee
 
Funktionstests in SAP
Funktionstests in SAPFunktionstests in SAP
Funktionstests in SAPCadaxo GmbH
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTddjlink
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklungjlink
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungChristian Baranowski
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir seincodepitbull
 
Agiles Testing
Agiles TestingAgiles Testing
Agiles TestingNEOMO GmbH
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsGFU Cyrus AG
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Ralf Sigmund
 
Softwarequalität mit Visual Studio 2010
Softwarequalität mit Visual Studio 2010Softwarequalität mit Visual Studio 2010
Softwarequalität mit Visual Studio 2010mspgermany
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Torsten Kleiber
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeldgedoplan
 
Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!gedoplan
 
Advanced Refactoring Patterns
Advanced Refactoring PatternsAdvanced Refactoring Patterns
Advanced Refactoring PatternsHendrik Lösch
 
Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018Hendrik Lösch
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsgedoplan
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascriptjoergreichert
 
Die nächste Generation des Unit Testing
Die nächste Generation des Unit TestingDie nächste Generation des Unit Testing
Die nächste Generation des Unit TestingDaniel Lehner
 

Similaire à Testing untestable code - gearconf11 (20)

Test-driven Development mit TYPO3
Test-driven Development mit TYPO3Test-driven Development mit TYPO3
Test-driven Development mit TYPO3
 
Funktionstests in SAP
Funktionstests in SAPFunktionstests in SAP
Funktionstests in SAP
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir sein
 
Property Based Testing
Property Based TestingProperty Based Testing
Property Based Testing
 
Agiles Testing
Agiles TestingAgiles Testing
Agiles Testing
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
 
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
Wjax integrationsprojekte auf dem weg zur continuous delivery 2011 11-10
 
Softwarequalität mit Visual Studio 2010
Softwarequalität mit Visual Studio 2010Softwarequalität mit Visual Studio 2010
Softwarequalität mit Visual Studio 2010
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
 
Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!Testen im EE-Umfeld – Seien Sie feige!
Testen im EE-Umfeld – Seien Sie feige!
 
Advanced Refactoring Patterns
Advanced Refactoring PatternsAdvanced Refactoring Patterns
Advanced Refactoring Patterns
 
Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018Advanced Refactoring Patterns - Dev Day 2018
Advanced Refactoring Patterns - Dev Day 2018
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Die nächste Generation des Unit Testing
Die nächste Generation des Unit TestingDie nächste Generation des Unit Testing
Die nächste Generation des Unit Testing
 

Plus de Stephan Hochdörfer

Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...Stephan Hochdörfer
 
Phing for power users - frOSCon8
Phing for power users - frOSCon8Phing for power users - frOSCon8
Phing for power users - frOSCon8Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Stephan Hochdörfer
 
Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Stephan Hochdörfer
 
Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Stephan Hochdörfer
 
Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13Stephan Hochdörfer
 
Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Stephan Hochdörfer
 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Stephan Hochdörfer
 
Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Stephan Hochdörfer
 
Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Stephan Hochdörfer
 
Offline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaOffline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaStephan Hochdörfer
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Stephan Hochdörfer
 
Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13Stephan Hochdörfer
 
Testing untestable code - ConFoo13
Testing untestable code - ConFoo13Testing untestable code - ConFoo13
Testing untestable code - ConFoo13Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Stephan Hochdörfer
 
Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Stephan Hochdörfer
 
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Stephan Hochdörfer
 

Plus de Stephan Hochdörfer (20)

Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
Offline. Na und? Strategien für offlinefähige Applikationen in HTML5 - Herbst...
 
Phing for power users - frOSCon8
Phing for power users - frOSCon8Phing for power users - frOSCon8
Phing for power users - frOSCon8
 
Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8
 
Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13
 
Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13
 
Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13Dependency Injection in PHP - dwx13
Dependency Injection in PHP - dwx13
 
Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13
 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13
 
Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13
 
Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13
 
Offline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaOffline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmka
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13
 
Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13Real World Dependency Injection - phpugffm13
Real World Dependency Injection - phpugffm13
 
Testing untestable code - ConFoo13
Testing untestable code - ConFoo13Testing untestable code - ConFoo13
Testing untestable code - ConFoo13
 
A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13
 
Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13
 
Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12
 
Testing untestable code - IPC12
Testing untestable code - IPC12Testing untestable code - IPC12
Testing untestable code - IPC12
 
Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12
 
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
 

Testing untestable code - gearconf11