SlideShare ist ein Scribd-Unternehmen logo
1 von 94
Interfaces und Factories für
Testdriven Development


             Notwendige
        Perl6 Erweiterungen
     für die Entwicklung großer
            Applikationen.




   14. Deutscher Perlworkshop

             Ralf Peine
                     Interfaces und Factories für Testdriven Development
Ralf Peine                    14. Deutscher Perlworkshop 2012
Überblick



 Eine reale Fabrik
 Vom Code zum testbaren Code
 Erweiterungsvorschläge für Perl6




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Ein reale
Fabrik




 Gigaset
 in Bocholt

              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Aufgabe
   Verpackung für das neue Supertelefon SL910A
            entwickeln und produzieren




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Paketinhalt




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Im Einsatz



                  Software
                                   ▼

                         Paket
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Herstellung

               new Paket();
                                      ▼

              Paket herstellen
             an Gigaset liefern
                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
Packen

           zip(paket);
               ▼
    Paket falten und füllen
       Paket auf Palette
 Palette in Container auf LKW
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Transport

     upload_http(„www/paket.zip“);
                  ▼
      Container zu Hafen fahren
          Container auf Schiff
         Schiff nach Singapur

             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Transport (2)

      get_http(„www/paket.zip“);
                  ▼
           Schiff in Hafen
         Container auf LKW
        LKW zu Großhändler
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
auspacken

          unzip(„paket.zip“);
                  ▼
        Palette aus Container
  Einige Pakete aus Palette nehmen
   Pakete an Einzelhändler senden
        Pakete in Regal stellen
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Software entwickeln
                     ▼
              Paket entwickeln


               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
Paket-Entwicklung


             Paketdesigner ruft bei

                     Gigaset an:


                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Paket-Entwicklung



  „Bitte einmal den kompletten
   Inhalt des SL910-Pakets!“



             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Paket-Entwicklung


                        Gigaset:

         „Den gibt es noch nicht!“


              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Paket-Entwicklung



             „Wir entwickeln ja selbst
                      noch!“



                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Paket-Entwicklung

                    Designer:

  „Wie soll ich dann das Paket
          entwickeln?“


             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Paket-Entwicklung

                       Gigaset:

             „Wir haben eine
              Beschreibung!“


             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Paket-Entwicklung



             „Ihrem Kollegen hat das
                  ausgereicht!“



                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Beschreibung ?

               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
Fabrik                                         Software
      ▼                                               ▼
 Beschreibung                                      Interface



             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Definition SW-Schnittstelle
                      (Interface)
                            Wikipedia:

         „Eine Schnittstelle gibt an,
      welche Methoden vorhanden sind
      oder vorhanden sein müssen ...“

                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Interfaces

             Fabrik                                    Software
             Handset                                   IHandset:
                                              { IGeometrie; IGewicht }

          Basis                                       IBasis
        Ladeschale                                 ILadeschale
                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Interfaces (2)
             Paket                                           IPaket
 Geometrie                       IGeometrie                     Außenmaße;
 Gewicht                         IGewicht                           Gewicht;
 Barcode                         IBarcode                           Barcode;


 falten                          IPaket                         Falten();
 öffnen                          IPaket                         Oeffnen();
 Basis einlegen                  Bool                           Add(IBasis basis);
 schließen                       IPaket                         Schliessen();
 versiegeln                      IPaket                         Versiegeln();
 auspacken                       Object[] objs                  Auspacken();
                     Interfaces und Factories für Testdriven Development
Ralf Peine                    14. Deutscher Perlworkshop 2012
Gigaset-Fabrik




                                                                  !!
 Produziere Telefon SL910A (INation fuerLand)




                                                              ()
                                                              w
     {
             IPaket paket = lager.HolePaket(fuerLand).Falten();




                                                    ne
      bool ok = true;
        ok &&= paket.Add(Lager.HoleBasis(fuerLand));




                                            n
        ok &&= paket.Add(Lager.HoleHandset(fuerLand));




                                         vo
        ok &&= paket.Add(Lager.HoleLadeschale(fuerLand));
        ok &&= paket.Add(Lager.HoleNetzteilBasis(fuerLand));



                                     f
        ok &&= paket.Add(Lager.HoleNetzteilHS(fuerLand));
        # …                    ru
                         uf
      if (ok) {
                        A

           IGewicht gewicht =
              paket.Schließen().Versiegeln().Gewicht;
                   n



           paket = pruefer.Check(paket) if !
                 ei




     IsKorrekt(gewicht);
           palette.Add(paket) if paket != null;
                K




        }
     }            Interfaces und Factories für Testdriven Development
Ralf Peine                  14. Deutscher Perlworkshop 2012
Gigaset unterwegs
 VersendeTelefone(IHafen nachHafen)
     {
      IContainer containerMitTelefonen =
           GigasetFactory
              .GetContainer(nachHafen); # Nicht etwa
     new()
         ILkw lkw = Spedition.LkwAnfordern(); # Nicht new()
         lkw.aufladen(containerMitTelefonen);
           lkw.fahrenZu(nachHafen);
         # …
     }
 # Was sich im Container befindet,
   # ist dem Fahrer egal,
 # aber nicht dem Empfänger!
                   Interfaces und Factories für Testdriven Development
Ralf Peine                  14. Deutscher Perlworkshop 2012
Gigaset
             Unit-Test

             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Implementiert
                 dieselbe                                                 Das Fixture baut
               Schnittstelle
                    wie
                                     Unit-Test                           die Testumgebung
                                                                           auf und erzeugt
               das Original                                             auch die Testdoubles.




                                                                           Die Objekte aus der
 Wird im                                                System             Umgebung des SUT
Folgenden                                                Under                werden durch
verwendet                                                 Test             Testdoubles ersetzt

      Eine Einführung in testgetriebene Entwicklung liefert
      Martin Fowler:
      http://martinfowler.com/bliki/TestDrivenDevelopment.html
      http://www.martinfowler.com/bliki/TestDouble.html
                         Interfaces und Factories für Testdriven Development
 Ralf Peine                       14. Deutscher Perlworkshop 2012
Gigaset Unit-Test (2)
 TestFalten()
   {
      IPaket testObject = testFixture.CreatePaket();
       IPaket gefaltetesPaket = testObject.Falten();
       testFixture.Validate(gefaltetesPaket.Geometrie);
 }           # fertig ist der Test!


 TestÖffnen() …
 TestSchließen() …
 TestVersiegeln() …


                     Interfaces und Factories für Testdriven Development
Ralf Peine                    14. Deutscher Perlworkshop 2012
Gigaset Unit-Test (3)
                                                     Weil Add nur das Interface
 TestAdd()     # Teil einlegen                        IBasis als Parameter
   {                                                   verlangt, kann hier ein
                                                    TestDouble statt einer
       # Testvorbereitung                           Basis übergeben werden!
         IPaket testObject
           = testFixture.CreatePaket().Falten();
       IBasis basisTestDouble
           = testFixture.CreateBasisTestDouble();
       # Test
         testObject.Add(basisTestDouble);
       # Validierung
         testObject.Schließen(); # Geht zu !!
                                 # Keine Exceptions !!
 } # Fertig!
                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Gigaset Unit-Test (4)

                 Aber wie
               schreibt man
             testbaren Code?


              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Überleitung

                  Das wird
              im nächsten Teil
             des Vortrags erklärt


               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
2. Teil

               Vom Code
                  zum
             testbaren Code


             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Vom Code zum testbaren Code

                        Aufgabe

 Wörter aus einer Webseite zählen und
  der Anzahl nach auflisten.
 Dazu wird der folgende Code
  verwendet, der keinesfalls verändert
  werden darf:
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Vom Code zum testbaren Code (2)
 my $wordCounter = new WordCounter();


 $wordCounter->
         CountWordsOfWebFile
             ($remote_file,
              $minimalCount);


                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
Vom Code zum testbaren Code (3)



             Denn dieses Codestück

             wird überall verwendet.


                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Vom Code zum testbaren Code (4)



             !!! 27 000 mal !!

             !!! Mindestens !!!


              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Initiale Implementierung



  Alles wurde in einer Sub realisiert.

  Für ein schnelles Script ist das ok,

  aber in einem großen System nicht
  testbar.

              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Initiale Implementierung (2)
                                                                      Das ist der
                                                                      kritische Teil




                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
Initiale Implementierung (3)
Hier ist das Codestück.                                 Selbst aus dem Web lesen,
Aber wo ist das Problem ?                               das ist schwer zu testen




                    Interfaces und Factories für Testdriven Development
Ralf Peine                   14. Deutscher Perlworkshop 2012
2. Implementierung



  Der WordCounter liest selbst aus dem Web

  und analysiert in zweiter Methode




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
2. Implementierung (2)
     Der kritische Code besteht
           nur noch aus 3
            Anweisungen




       Analyse wurde
     in zweite Methode
         verschoben

                       Interfaces und Factories für Testdriven Development
Ralf Peine                      14. Deutscher Perlworkshop 2012
3. Implementierung



  Der WordCounter liest selbst aus dem Web

  mit einer dritten Methode

  und analysiert in zweiter Methode



              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
3. Implementierung (2)

                                                          Web-Datei lesen
                                                          wurde in eigene
                                                        Methode verschoben




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
3. Implementierung (3)                                  Web-Datei lesen
                                                                     wurde in eigene
                                                                   Methode verschoben


                                                            Selbst aus dem Web lesen,
                                                                das ist immer noch
                                                                 schwer zu testen




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
4. Implementierung

  Der WordCounter lässt

  einen WebReader aus dem Web lesen,

  den er aber selbst mit new erzeugt.

  Die Analyse führt er dann selbst in einer
  eigenen Methode durch.

             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
4. Implementierung (2)

             Das „new“ verhindert
                                                                            Jetzt liest
             automatisiertes Testen
                                                                         der WebReader
             ohne Web-Zugriff.
                                                                           den Inhalt
                                                                        der Webseite ein




                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
5. Implementierung


  Der WordCounter lässt

  einen WebReader aus dem Web lesen,

  den er von einer Factory erzeugen lässt.

  Die Factory erzeugt er noch selbst.


              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
5. Implementierung
                                               Die Factory muss
         Das „new“ verhindert
                                               außerhalb
         automatisiertes Testen.
                                               erzeugt werden.


                                                                             Die Factory
                                                                             erstellt den
                                                                             WebReader




                       Interfaces und Factories für Testdriven Development
Ralf Peine                      14. Deutscher Perlworkshop 2012
6. Implementierung


  Der WordCounter lässt einen WebReader aus
  dem Web lesen,

  den er von einer Factory erzeugen lässt.

  Die Factory erzeugt er nicht mehr selbst, er
  verwendet die globale Factory.



              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
6. Implementierung (3)
    Code des
   Testrahmens
     (außen)



                                                                           Factory
                                                                        erstellen und
                                                                          zuweisen

    Normaler
Programmablauf,
 kein Testcode!




                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
6. Implementierung (3)
      Code der
       Klasse
       (innen)




                                                                         Kein Aufruf
                                                                         von „new()“
                                                                       mehr notwendig!




                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
7. Test-Implementierung

  Es muss keine neue Reader-Klasse erstellt werden,

  WordCounter ist testbar implementiert.

  Im Testrahmen muss nur die Factory angepasst
  werden.

  Der WordCounter lässt einen Web-Reader aus dem
  Web lesen (denkt er !),

  den er von einer Factory erzeugen lässt.

               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
7. Test-Implementierung (2)

  Er verwendet die globale Factory, wie in der
  vorherigen Implementierung.

  Er erhält einen Stub statt der Original-Klasse.

                                       Der Stub liefert nämlich einfach einen
              Das ist
                                     festen Text, ohne aus dem Web zu lesen!
             der Trick!

  Die Analyse führt er dann wie immer selbst in
  einer eigenen Methode durch.


                          Interfaces und Factories für Testdriven Development
Ralf Peine                         14. Deutscher Perlworkshop 2012
7. Test-Implementierung (3)

               Der Test ist jetzt
             unabhängig vom Web,
              und der Code bleibt
                    unverändert!

                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
7. Test-Implementierung (4)
         Fertig sind der WebReader oder Test-Stub,                            Als Klassenvariable
         welcher es gerade ist, kann man nie wissen!




                                                                              Die Factory erzeugt
                                                                                den WebReader




                        Interfaces und Factories für Testdriven Development
Ralf Peine                       14. Deutscher Perlworkshop 2012
7. Test-Implementierung (5)

             Aber jedesmal eine
             neue Factory-Klasse
                 zu schreiben,
              ist zu aufwendig...
                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
8. Implementierung

             Einfacher geht es

             mit DI-Containern

              statt Factories.

              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Dependency Injection
                  Container                                Aha !




      ?!? DI-Container ?!?
        Etwas ähnliches wie ein Postfach/
       Schlüsselboard an der Hotelrezeption

                                       Man fragt einfach nach, ob etwas für
                                        die Instanz/die Klasse hinterlegt
                                                      wurde.


                         Interfaces und Factories für Testdriven Development
Ralf Peine                        14. Deutscher Perlworkshop 2012
Ein DI-Container


                                                              Fächer, in denen etwas
 Fach mit                                                     abgelegt werden kann
 WebReaderStub




                                                                             Fach mit
                                                                            WebReader
    Leeres
     Fach


                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
8. Implementierung (2)

             Der WordCounter muss
             für die Verwendung von
                   DI-Containern
                   ein letztes Mal
               angepasst werden.
               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
8. Implementierung (3)
                                              Den globalen DiContainer
                                           in Klassenvariablen speichern




             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
8. Implementierung (4)
Code der
 Klasse                 Fertig sind der
 (innen)          WebReader oder Test-Stub,
              welcher genau, kann man nie wissen!                       Statt „new ()“



                                                                         Schnittstelle des
                                                                        gesuchten Objekts



  Für wen                                                                         Falls
 hinterlegt                                                                      nichts
                                                                               hinterlegt
                                                                                 wurde




                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
9. Test-Implementierung

  Und jetzt einfach über ein Closure etwas
  anderes als einen WebReader
  hinterlegen

  durch
  $DiContainer->DepositForCreate(...).




              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
9. Test-Implementierung (2)
                    Für welche
  Code des                                                                    Eine Closure
                     Instanz /
Testrahmens                                                                für die Erzeugung
                      Klasse
   (außen)                                                                     hinterlegen
                     hinterlegt


                                                                            Schnittstelle des
                                                                           hinterlegten Objekts




   Für den Nachfrager                                      Aber nur, falls der
  eine Instanz erzeugen                                   WordCounter keinen
                                                        WebReader verwenden soll.


                     Interfaces und Factories für Testdriven Development
Ralf Peine                    14. Deutscher Perlworkshop 2012
9. Test-Implementierung (3)
             Die Implementierung
              bleibt unverändert




                                                                              Diesmal ist es
                                                                                  ein Stub,
                                                                                  der einen
                                                                                festen Text
                                                                                 liefert und
                                                                              nicht aus dem
                                                                                 Web liest.




                        Interfaces und Factories für Testdriven Development
Ralf Peine                       14. Deutscher Perlworkshop 2012
Ziel erreicht!
               Der Produktcode
               kann unverändert
               getestet werden.

             Die Änderungen werden
                nur im Testrahmen
                 vorgenommen.
                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
Ziel erreicht (2)!
       Es gibt zwei Lösungen:
                                                                         Diese 2
                                                                         Beide
                                                                       Lösungen
                                                                      Lösungen
                                                                       decken alle
       6. + 7. mit Factories                                          Haben ihre
                                                                     Einsatzgebiete
                                                                    Einsatzgebiete
                                                                           ab.



       8. + 9. mit DIContainern

              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Überleitung

                Aber wann
             soll man welche
             Lösung wählen ?


              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
Überleitung

             Damit befasst
                sich der
               letzte Teil
             des Vortrags

             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Ende Teil 2

              Interfaces und Factories für Testdriven Development
Ralf Peine             14. Deutscher Perlworkshop 2012
3. Teil


   Erweiterungs-
    Vorschläge
     für Perl6

             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Interfaces


              Ein Interface ist
             eine abstrakte Role,
      in der alle Methoden = undef
               gesetzt sind.
               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
Interfaces (2)
             Mit einem Unterschied:

               In der Role muss
               man nachsehen,
                                   ob
                    noch etwas
                   implementiert
                   werden muss.
               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
Interfaces (3)

                Ein Interface
             muss dagegen
                          immer
              implementiert
                 werden
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Interfaces (4)
                                            Dieser Teil wird mit
                                            Interfaces überflüssig

 role WebReaderRole
   {
     method ReadWebFile = { … };
   }
                                        Huch!
                                        Versehentlich leer definiert!
                                        Damit muss die Methode
                                        in der Ableitung nicht mehr
                                         definiert werden...
 role WebReaderRole
   {
     method ReadWebFile { };
   }
             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Interfaces (5)
      Neues                   Konvention:
  Schlüsselwort:          Interfaces beginnen
   „interface“                   mit „I“




 interface IWebReader
   {
     method ReadWebFile;
   }

                      Keine ungewollte,
                    leere Implementierung
                         mehr möglich

               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
Interfaces (6)

            Schlüsselwort                                    Der Name des zu
       „impl“ für „implements“,                             implementierenden
       danach folgt ein Interface                               Interfaces



 class WebReader impl IWebReader
   {
     method ReadWebFile
     {                     Andere Vorschläge für
                           das neue KeyWord ?
       # … … …
     }
   }
                    Interfaces und Factories für Testdriven Development
Ralf Peine                   14. Deutscher Perlworkshop 2012
Interfaces (7)

         Das war schon alles!

              Keine weiteren
             Syntaxänderungen
                notwendig!
               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
Factory oder DI-Container ?
                      DI-Container

                   verwendet man immer
                     dann, wenn man nur

                        Testdoubles

                 zum Testen erzeugen muss.

                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Factory oder DI-Container ? (2)
                       Eine        Factory
                      verwendet man immer
                          dann, wenn man

              aus mehreren Implementierungs-
                   Varianten einer Klasse

     (zur Laufzeit) eine für den Produktivcode auswählen
                              möchte.

                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Factories für UI und GUI
                                                                 Ein Interface
 interface IUiFactory {                                        für eine Factory !
       method CreateForm;
       method CreateCloseButton;
   }
 interface IForm impl IWidget {
       method Add (IWidget widget);
       method Run;
   }
 interface IButton impl IWidget {
       method Push;
   }

                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
Factories für UI und GUI (2)
             Diese Variable sollte
                    zum                                  Hier wird die UiFactory
              Standard werden.                          für alle zentral eingestellt
 Sub HelloWorld {
          my $uiFactory =
     $FactoryService.UiFactory;
             my $form = $uiFactory.CreateForm();
             my $button
               = $uiFactory.CreateCloseButton();
             $form.Add($button);                                   Irgendeine UI-Factory
                                                                   aus der reichhaltigen
             $form.Run();
                                                                         Auswahl
     }
                      Interfaces und Factories für Testdriven Development
Ralf Peine                     14. Deutscher Perlworkshop 2012
TextUiFactory
AutomaticTestUiFactory

                                 IUiFactory
      Ein Gui-Test-
       Framework,

         ?!?
      mit dem man
      Eingaben und
        Ausgaben
    aus Dateien lesen          IGuiFactory
   und schreiben kann.

TkGuiFactory                                            WinForms-
       GtkGuiFactory                                    Factory

                  WxGuiFactory
                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Factories für UI und GUI (4)
                   Damit das möglich ist,
                    müssten alle diese Guis
                  dieselben Schnittstellen für

                              IButton
                               IForm
                                          ...
                              unterstützen.

                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Factories für UI und GUI (5)



                Vielleicht erleben
                wir das ja noch...


                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Testdriven Development

                       Damit sind
                   in der Perl Syntax
                alle Voraussetzungen
             für Testdriven-Development
                         erfüllt.

                 Interfaces und Factories für Testdriven Development
Ralf Peine                14. Deutscher Perlworkshop 2012
Testdriven Development (2)

              Der Code und der Test
               können       können
             gleichzeitig gleichzeitig
              entwickelt   entwickelt
               werden       werden

                  Interfaces und Factories für Testdriven Development
Ralf Peine                 14. Deutscher Perlworkshop 2012
Testdriven Development (3)
    Zur Entwicklung großer Applikationen
              fehlen aber noch
           Unit-Test-Frameworks
                                      P-Unit
                     und        (Perl-Unit-Tester)
                               siehe N-Unit, J-Unit

                  Mocking-Frameworks
       Leichte Erstellung von TestDoubles wie Stubs, Spys und
        ?!?                    Mocks,
              ohne eigene Klassen schreiben zu müssen
                    Interfaces und Factories für Testdriven Development
Ralf Peine                   14. Deutscher Perlworkshop 2012
Zusammenfassung
             Beispie                                                                Vertrag
                                                                                   Vertrag
                l                                                                  zwischen
                                                                                  zwischen
              Code
                                                                                  Vertrag
                                                                                  Entwickler
                                                                                 Entwickler
                                                                                  und Nutzer
                                                                                 und Nutzer
                               Test-Lib                                                              Produkt-Lib
Test 2
     Push-              TestCode                  IPushButton
                                                                                         ProductCode
   Button-
     Test-
    Double                                                                                Optional
                                                     ITest-
                   TestFixture                     PushButton


                                                                                                       Nur
    Test-              Implementierun            PBImpl1              PB2                PB3          Diese
   Fixture                  gs-                                                                      Klassen
                         anweisung                                                                    Sollten
    eines                                                     new()              new()               PB.new()
   anderen                                                                                           aufrufen
                                               Factory1                 F2                F3
    Tests


                                                          IUIFactory
                                                                                     DIContainer

                           Interfaces und Factories für Testdriven Development
Ralf Peine                          14. Deutscher Perlworkshop 2012
Abschluss



  Gibt es denn überhaupt
 große Perl-Applikationen?


             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012
Abschluss (2)



             Ja, und sogar eine,
             die hier jeder kennt!


                Interfaces und Factories für Testdriven Development
Ralf Peine               14. Deutscher Perlworkshop 2012
Abschluss (3)


                    Eine,
              die davon sehr
             profitieren würde.

               Interfaces und Factories für Testdriven Development
Ralf Peine              14. Deutscher Perlworkshop 2012
CPAN!!


             Interfaces und Factories für Testdriven Development
Ralf Peine            14. Deutscher Perlworkshop 2012

Weitere ähnliche Inhalte

Andere mochten auch

123458_Atlas_de_Bolsillo_de_fisiologia
123458_Atlas_de_Bolsillo_de_fisiologia123458_Atlas_de_Bolsillo_de_fisiologia
123458_Atlas_de_Bolsillo_de_fisiologiaAdlem Dutra
 
Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...
Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...
Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...Carmen Urbano
 
Filosofia de la historia de max weber.
Filosofia de la historia de max weber.Filosofia de la historia de max weber.
Filosofia de la historia de max weber.deretv1
 
Global Internet TV Industry
Global Internet TV IndustryGlobal Internet TV Industry
Global Internet TV IndustryReportLinker.com
 
Clean room system tarkett
Clean room system tarkettClean room system tarkett
Clean room system tarkettCutting Corners
 
iData Insights Report Store
iData Insights Report StoreiData Insights Report Store
iData Insights Report StoreiData Insights
 
Owasp top 10_-_2013_final_-_español
Owasp top 10_-_2013_final_-_españolOwasp top 10_-_2013_final_-_español
Owasp top 10_-_2013_final_-_españolfosoSSS
 
Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...
Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...
Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...Andesco
 
Guia del docente_religion_5_basico_edebe
Guia del docente_religion_5_basico_edebeGuia del docente_religion_5_basico_edebe
Guia del docente_religion_5_basico_edebeMireya Burgos Peredo
 
Orientación por competencias desde un enfoque de género
Orientación por competencias desde un enfoque de géneroOrientación por competencias desde un enfoque de género
Orientación por competencias desde un enfoque de géneroAlfredo Vela Zancada
 
Whatsapp para Empresas y WhatsApp en Marketing y atención al cliente
Whatsapp para Empresas y WhatsApp en Marketing y atención al clienteWhatsapp para Empresas y WhatsApp en Marketing y atención al cliente
Whatsapp para Empresas y WhatsApp en Marketing y atención al clienteJavier Merchán Correa
 
Cadena de Productividad Competividad Rentabilidad
Cadena de Productividad Competividad RentabilidadCadena de Productividad Competividad Rentabilidad
Cadena de Productividad Competividad RentabilidadJuan Carlos Fernandez
 
Protecciones eléctricas residenciales.
Protecciones eléctricas residenciales.Protecciones eléctricas residenciales.
Protecciones eléctricas residenciales.Sodimac-Constructor
 
Transportes e Telecomunicações
Transportes e TelecomunicaçõesTransportes e Telecomunicações
Transportes e TelecomunicaçõesGeografia .
 

Andere mochten auch (19)

FXDaily.pdf
FXDaily.pdfFXDaily.pdf
FXDaily.pdf
 
123458_Atlas_de_Bolsillo_de_fisiologia
123458_Atlas_de_Bolsillo_de_fisiologia123458_Atlas_de_Bolsillo_de_fisiologia
123458_Atlas_de_Bolsillo_de_fisiologia
 
Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...
Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...
Invitación a la feria IMEX Madrid (24 y 25 de abril). País invitado USA. LIFI...
 
Filosofia de la historia de max weber.
Filosofia de la historia de max weber.Filosofia de la historia de max weber.
Filosofia de la historia de max weber.
 
Global Internet TV Industry
Global Internet TV IndustryGlobal Internet TV Industry
Global Internet TV Industry
 
Clean room system tarkett
Clean room system tarkettClean room system tarkett
Clean room system tarkett
 
iData Insights Report Store
iData Insights Report StoreiData Insights Report Store
iData Insights Report Store
 
Owasp top 10_-_2013_final_-_español
Owasp top 10_-_2013_final_-_españolOwasp top 10_-_2013_final_-_español
Owasp top 10_-_2013_final_-_español
 
Accesorios para vacio kf
Accesorios para vacio kfAccesorios para vacio kf
Accesorios para vacio kf
 
Oportunidades JUNIO - JAFRA 2015
Oportunidades JUNIO - JAFRA 2015Oportunidades JUNIO - JAFRA 2015
Oportunidades JUNIO - JAFRA 2015
 
Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...
Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...
Tecnología sin zanja para la instalación y rehabilitación de redes de acueduc...
 
Guia del docente_religion_5_basico_edebe
Guia del docente_religion_5_basico_edebeGuia del docente_religion_5_basico_edebe
Guia del docente_religion_5_basico_edebe
 
Orientación por competencias desde un enfoque de género
Orientación por competencias desde un enfoque de géneroOrientación por competencias desde un enfoque de género
Orientación por competencias desde un enfoque de género
 
Whatsapp para Empresas y WhatsApp en Marketing y atención al cliente
Whatsapp para Empresas y WhatsApp en Marketing y atención al clienteWhatsapp para Empresas y WhatsApp en Marketing y atención al cliente
Whatsapp para Empresas y WhatsApp en Marketing y atención al cliente
 
Cadena de Productividad Competividad Rentabilidad
Cadena de Productividad Competividad RentabilidadCadena de Productividad Competividad Rentabilidad
Cadena de Productividad Competividad Rentabilidad
 
Effective Tax Rates in Ethiopia by Giulia Mascagni
Effective Tax Rates in Ethiopia by Giulia MascagniEffective Tax Rates in Ethiopia by Giulia Mascagni
Effective Tax Rates in Ethiopia by Giulia Mascagni
 
Protecciones eléctricas residenciales.
Protecciones eléctricas residenciales.Protecciones eléctricas residenciales.
Protecciones eléctricas residenciales.
 
Joyce Travelbee
Joyce TravelbeeJoyce Travelbee
Joyce Travelbee
 
Transportes e Telecomunicações
Transportes e TelecomunicaçõesTransportes e Telecomunicações
Transportes e Telecomunicações
 

Perl6: Interfaces und Factories für Testdriven Development

  • 1. Interfaces und Factories für Testdriven Development Notwendige Perl6 Erweiterungen für die Entwicklung großer Applikationen. 14. Deutscher Perlworkshop Ralf Peine Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 2. Überblick Eine reale Fabrik Vom Code zum testbaren Code Erweiterungsvorschläge für Perl6 Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 3. Ein reale Fabrik Gigaset in Bocholt Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 4. Aufgabe Verpackung für das neue Supertelefon SL910A entwickeln und produzieren Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 5. Paketinhalt Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 6. Im Einsatz Software ▼ Paket Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 7. Herstellung new Paket(); ▼ Paket herstellen an Gigaset liefern Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 8. Packen zip(paket); ▼ Paket falten und füllen Paket auf Palette Palette in Container auf LKW Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 9. Transport upload_http(„www/paket.zip“); ▼ Container zu Hafen fahren Container auf Schiff Schiff nach Singapur Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 10. Transport (2) get_http(„www/paket.zip“); ▼ Schiff in Hafen Container auf LKW LKW zu Großhändler Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 11. auspacken unzip(„paket.zip“); ▼ Palette aus Container Einige Pakete aus Palette nehmen Pakete an Einzelhändler senden Pakete in Regal stellen Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 12. Software entwickeln ▼ Paket entwickeln Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 13. Paket-Entwicklung Paketdesigner ruft bei Gigaset an: Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 14. Paket-Entwicklung „Bitte einmal den kompletten Inhalt des SL910-Pakets!“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 15. Paket-Entwicklung Gigaset: „Den gibt es noch nicht!“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 16. Paket-Entwicklung „Wir entwickeln ja selbst noch!“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 17. Paket-Entwicklung Designer: „Wie soll ich dann das Paket entwickeln?“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 18. Paket-Entwicklung Gigaset: „Wir haben eine Beschreibung!“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 19. Paket-Entwicklung „Ihrem Kollegen hat das ausgereicht!“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 20. Beschreibung ? Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 21. Fabrik Software ▼ ▼ Beschreibung Interface Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 22. Definition SW-Schnittstelle (Interface) Wikipedia: „Eine Schnittstelle gibt an, welche Methoden vorhanden sind oder vorhanden sein müssen ...“ Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 23. Interfaces Fabrik Software Handset IHandset: { IGeometrie; IGewicht } Basis IBasis Ladeschale ILadeschale Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 24. Interfaces (2) Paket IPaket Geometrie IGeometrie Außenmaße; Gewicht IGewicht Gewicht; Barcode IBarcode Barcode; falten IPaket Falten(); öffnen IPaket Oeffnen(); Basis einlegen Bool Add(IBasis basis); schließen IPaket Schliessen(); versiegeln IPaket Versiegeln(); auspacken Object[] objs Auspacken(); Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 25. Gigaset-Fabrik !! Produziere Telefon SL910A (INation fuerLand) () w { IPaket paket = lager.HolePaket(fuerLand).Falten(); ne bool ok = true; ok &&= paket.Add(Lager.HoleBasis(fuerLand)); n ok &&= paket.Add(Lager.HoleHandset(fuerLand)); vo ok &&= paket.Add(Lager.HoleLadeschale(fuerLand)); ok &&= paket.Add(Lager.HoleNetzteilBasis(fuerLand)); f ok &&= paket.Add(Lager.HoleNetzteilHS(fuerLand)); # … ru uf if (ok) { A IGewicht gewicht = paket.Schließen().Versiegeln().Gewicht; n paket = pruefer.Check(paket) if ! ei IsKorrekt(gewicht); palette.Add(paket) if paket != null; K } } Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 26. Gigaset unterwegs VersendeTelefone(IHafen nachHafen) { IContainer containerMitTelefonen = GigasetFactory .GetContainer(nachHafen); # Nicht etwa new() ILkw lkw = Spedition.LkwAnfordern(); # Nicht new() lkw.aufladen(containerMitTelefonen); lkw.fahrenZu(nachHafen); # … } # Was sich im Container befindet, # ist dem Fahrer egal, # aber nicht dem Empfänger! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 27. Gigaset Unit-Test Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 28. Implementiert dieselbe Das Fixture baut Schnittstelle wie Unit-Test die Testumgebung auf und erzeugt das Original auch die Testdoubles. Die Objekte aus der Wird im System Umgebung des SUT Folgenden Under werden durch verwendet Test Testdoubles ersetzt Eine Einführung in testgetriebene Entwicklung liefert Martin Fowler: http://martinfowler.com/bliki/TestDrivenDevelopment.html http://www.martinfowler.com/bliki/TestDouble.html Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 29. Gigaset Unit-Test (2) TestFalten() { IPaket testObject = testFixture.CreatePaket(); IPaket gefaltetesPaket = testObject.Falten(); testFixture.Validate(gefaltetesPaket.Geometrie); } # fertig ist der Test! TestÖffnen() … TestSchließen() … TestVersiegeln() … Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 30. Gigaset Unit-Test (3) Weil Add nur das Interface TestAdd() # Teil einlegen IBasis als Parameter { verlangt, kann hier ein TestDouble statt einer # Testvorbereitung Basis übergeben werden! IPaket testObject = testFixture.CreatePaket().Falten(); IBasis basisTestDouble = testFixture.CreateBasisTestDouble(); # Test testObject.Add(basisTestDouble); # Validierung testObject.Schließen(); # Geht zu !! # Keine Exceptions !! } # Fertig! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 31. Gigaset Unit-Test (4) Aber wie schreibt man testbaren Code? Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 32. Überleitung Das wird im nächsten Teil des Vortrags erklärt Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 33. 2. Teil Vom Code zum testbaren Code Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 34. Vom Code zum testbaren Code Aufgabe Wörter aus einer Webseite zählen und der Anzahl nach auflisten. Dazu wird der folgende Code verwendet, der keinesfalls verändert werden darf: Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 35. Vom Code zum testbaren Code (2) my $wordCounter = new WordCounter(); $wordCounter-> CountWordsOfWebFile ($remote_file, $minimalCount); Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 36. Vom Code zum testbaren Code (3) Denn dieses Codestück wird überall verwendet. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 37. Vom Code zum testbaren Code (4) !!! 27 000 mal !! !!! Mindestens !!! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 38. Initiale Implementierung Alles wurde in einer Sub realisiert. Für ein schnelles Script ist das ok, aber in einem großen System nicht testbar. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 39. Initiale Implementierung (2) Das ist der kritische Teil Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 40. Initiale Implementierung (3) Hier ist das Codestück. Selbst aus dem Web lesen, Aber wo ist das Problem ? das ist schwer zu testen Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 41. 2. Implementierung Der WordCounter liest selbst aus dem Web und analysiert in zweiter Methode Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 42. 2. Implementierung (2) Der kritische Code besteht nur noch aus 3 Anweisungen Analyse wurde in zweite Methode verschoben Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 43. 3. Implementierung Der WordCounter liest selbst aus dem Web mit einer dritten Methode und analysiert in zweiter Methode Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 44. 3. Implementierung (2) Web-Datei lesen wurde in eigene Methode verschoben Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 45. 3. Implementierung (3) Web-Datei lesen wurde in eigene Methode verschoben Selbst aus dem Web lesen, das ist immer noch schwer zu testen Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 46. 4. Implementierung Der WordCounter lässt einen WebReader aus dem Web lesen, den er aber selbst mit new erzeugt. Die Analyse führt er dann selbst in einer eigenen Methode durch. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 47. 4. Implementierung (2) Das „new“ verhindert Jetzt liest automatisiertes Testen der WebReader ohne Web-Zugriff. den Inhalt der Webseite ein Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 48. 5. Implementierung Der WordCounter lässt einen WebReader aus dem Web lesen, den er von einer Factory erzeugen lässt. Die Factory erzeugt er noch selbst. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 49. 5. Implementierung Die Factory muss Das „new“ verhindert außerhalb automatisiertes Testen. erzeugt werden. Die Factory erstellt den WebReader Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 50. 6. Implementierung Der WordCounter lässt einen WebReader aus dem Web lesen, den er von einer Factory erzeugen lässt. Die Factory erzeugt er nicht mehr selbst, er verwendet die globale Factory. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 51. 6. Implementierung (3) Code des Testrahmens (außen) Factory erstellen und zuweisen Normaler Programmablauf, kein Testcode! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 52. 6. Implementierung (3) Code der Klasse (innen) Kein Aufruf von „new()“ mehr notwendig! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 53. 7. Test-Implementierung Es muss keine neue Reader-Klasse erstellt werden, WordCounter ist testbar implementiert. Im Testrahmen muss nur die Factory angepasst werden. Der WordCounter lässt einen Web-Reader aus dem Web lesen (denkt er !), den er von einer Factory erzeugen lässt. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 54. 7. Test-Implementierung (2) Er verwendet die globale Factory, wie in der vorherigen Implementierung. Er erhält einen Stub statt der Original-Klasse. Der Stub liefert nämlich einfach einen Das ist festen Text, ohne aus dem Web zu lesen! der Trick! Die Analyse führt er dann wie immer selbst in einer eigenen Methode durch. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 55. 7. Test-Implementierung (3) Der Test ist jetzt unabhängig vom Web, und der Code bleibt unverändert! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 56. 7. Test-Implementierung (4) Fertig sind der WebReader oder Test-Stub, Als Klassenvariable welcher es gerade ist, kann man nie wissen! Die Factory erzeugt den WebReader Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 57. 7. Test-Implementierung (5) Aber jedesmal eine neue Factory-Klasse zu schreiben, ist zu aufwendig... Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 58. 8. Implementierung Einfacher geht es mit DI-Containern statt Factories. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 59. Dependency Injection Container Aha ! ?!? DI-Container ?!? Etwas ähnliches wie ein Postfach/ Schlüsselboard an der Hotelrezeption Man fragt einfach nach, ob etwas für die Instanz/die Klasse hinterlegt wurde. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 60. Ein DI-Container Fächer, in denen etwas Fach mit abgelegt werden kann WebReaderStub Fach mit WebReader Leeres Fach Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 61. 8. Implementierung (2) Der WordCounter muss für die Verwendung von DI-Containern ein letztes Mal angepasst werden. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 62. 8. Implementierung (3) Den globalen DiContainer in Klassenvariablen speichern Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 63. 8. Implementierung (4) Code der Klasse Fertig sind der (innen) WebReader oder Test-Stub, welcher genau, kann man nie wissen! Statt „new ()“ Schnittstelle des gesuchten Objekts Für wen Falls hinterlegt nichts hinterlegt wurde Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 64. 9. Test-Implementierung Und jetzt einfach über ein Closure etwas anderes als einen WebReader hinterlegen durch $DiContainer->DepositForCreate(...). Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 65. 9. Test-Implementierung (2) Für welche Code des Eine Closure Instanz / Testrahmens für die Erzeugung Klasse (außen) hinterlegen hinterlegt Schnittstelle des hinterlegten Objekts Für den Nachfrager Aber nur, falls der eine Instanz erzeugen WordCounter keinen WebReader verwenden soll. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 66. 9. Test-Implementierung (3) Die Implementierung bleibt unverändert Diesmal ist es ein Stub, der einen festen Text liefert und nicht aus dem Web liest. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 67. Ziel erreicht! Der Produktcode kann unverändert getestet werden. Die Änderungen werden nur im Testrahmen vorgenommen. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 68. Ziel erreicht (2)! Es gibt zwei Lösungen: Diese 2 Beide Lösungen Lösungen decken alle 6. + 7. mit Factories Haben ihre Einsatzgebiete Einsatzgebiete ab. 8. + 9. mit DIContainern Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 69. Überleitung Aber wann soll man welche Lösung wählen ? Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 70. Überleitung Damit befasst sich der letzte Teil des Vortrags Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 71. Ende Teil 2 Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 72. 3. Teil Erweiterungs- Vorschläge für Perl6 Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 73. Interfaces Ein Interface ist eine abstrakte Role, in der alle Methoden = undef gesetzt sind. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 74. Interfaces (2) Mit einem Unterschied: In der Role muss man nachsehen, ob noch etwas implementiert werden muss. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 75. Interfaces (3) Ein Interface muss dagegen immer implementiert werden Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 76. Interfaces (4) Dieser Teil wird mit Interfaces überflüssig role WebReaderRole { method ReadWebFile = { … }; } Huch! Versehentlich leer definiert! Damit muss die Methode in der Ableitung nicht mehr definiert werden... role WebReaderRole { method ReadWebFile { }; } Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 77. Interfaces (5) Neues Konvention: Schlüsselwort: Interfaces beginnen „interface“ mit „I“ interface IWebReader { method ReadWebFile; } Keine ungewollte, leere Implementierung mehr möglich Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 78. Interfaces (6) Schlüsselwort Der Name des zu „impl“ für „implements“, implementierenden danach folgt ein Interface Interfaces class WebReader impl IWebReader { method ReadWebFile { Andere Vorschläge für das neue KeyWord ? # … … … } } Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 79. Interfaces (7) Das war schon alles! Keine weiteren Syntaxänderungen notwendig! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 80. Factory oder DI-Container ? DI-Container verwendet man immer dann, wenn man nur Testdoubles zum Testen erzeugen muss. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 81. Factory oder DI-Container ? (2) Eine Factory verwendet man immer dann, wenn man aus mehreren Implementierungs- Varianten einer Klasse (zur Laufzeit) eine für den Produktivcode auswählen möchte. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 82. Factories für UI und GUI Ein Interface interface IUiFactory { für eine Factory ! method CreateForm; method CreateCloseButton; } interface IForm impl IWidget { method Add (IWidget widget); method Run; } interface IButton impl IWidget { method Push; } Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 83. Factories für UI und GUI (2) Diese Variable sollte zum Hier wird die UiFactory Standard werden. für alle zentral eingestellt Sub HelloWorld { my $uiFactory = $FactoryService.UiFactory; my $form = $uiFactory.CreateForm(); my $button = $uiFactory.CreateCloseButton(); $form.Add($button); Irgendeine UI-Factory aus der reichhaltigen $form.Run(); Auswahl } Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 84. TextUiFactory AutomaticTestUiFactory IUiFactory Ein Gui-Test- Framework, ?!? mit dem man Eingaben und Ausgaben aus Dateien lesen IGuiFactory und schreiben kann. TkGuiFactory WinForms- GtkGuiFactory Factory WxGuiFactory Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 85. Factories für UI und GUI (4) Damit das möglich ist, müssten alle diese Guis dieselben Schnittstellen für IButton IForm ... unterstützen. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 86. Factories für UI und GUI (5) Vielleicht erleben wir das ja noch... Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 87. Testdriven Development Damit sind in der Perl Syntax alle Voraussetzungen für Testdriven-Development erfüllt. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 88. Testdriven Development (2) Der Code und der Test können können gleichzeitig gleichzeitig entwickelt entwickelt werden werden Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 89. Testdriven Development (3) Zur Entwicklung großer Applikationen fehlen aber noch Unit-Test-Frameworks P-Unit und (Perl-Unit-Tester) siehe N-Unit, J-Unit Mocking-Frameworks Leichte Erstellung von TestDoubles wie Stubs, Spys und ?!? Mocks, ohne eigene Klassen schreiben zu müssen Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 90. Zusammenfassung Beispie Vertrag Vertrag l zwischen zwischen Code Vertrag Entwickler Entwickler und Nutzer und Nutzer Test-Lib Produkt-Lib Test 2 Push- TestCode IPushButton ProductCode Button- Test- Double Optional ITest- TestFixture PushButton Nur Test- Implementierun PBImpl1 PB2 PB3 Diese Fixture gs- Klassen anweisung Sollten eines new() new() PB.new() anderen aufrufen Factory1 F2 F3 Tests IUIFactory DIContainer Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 91. Abschluss Gibt es denn überhaupt große Perl-Applikationen? Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 92. Abschluss (2) Ja, und sogar eine, die hier jeder kennt! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 93. Abschluss (3) Eine, die davon sehr profitieren würde. Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012
  • 94. CPAN!! Interfaces und Factories für Testdriven Development Ralf Peine 14. Deutscher Perlworkshop 2012

Hinweis der Redaktion

  1. Bevor ich Factories in der SW-Entwicklung vorstelle, möchte ich zunächst in eine reale Fabrik schauen. Denn hier sind die für die SW neuen Komponenten schon länger im Einsatz.
  2. Hier werden Telefone entwickelt, gefertigt und verpackt.
  3. Jetzt drehen wir das Ganze mal um Und Lernen von der Paketentwicklung für die SW-Entwicklung.
  4. Hier noch im SourceCode-Beispiel WordReader durch WordCounter ersetzen.