SlideShare a Scribd company logo
Agenda



La strada verso Unit Test
  Che problemi abbiamo ?
  Una possibile soluzione
Il Contesto


Integrazione
    DevA: “...la classe UserDAO funziona correttamente...”
    DevB: “...anche Registration...”
    Cliente: “...nella home page continua ad apparire questa
      Null qualcosa!...”
Il Contesto


Evoluzione dei requisiti => Evoluzione del SW
    Errori di regressione
    DevA: “...ho solo modificato un metodo di UserDAO”
L'archetipo
                                                          UserDAO
                                                        +findUsers():List

                                 <<depends>>

     Registration                         List findUsers( ) {
  +registerUser(User u)                         List users = new List();
                                                while(rs.next()){
                                                    users.add( new User() );
                                                }
                                                return users;
                                          }
registerUser( User u ) {
      if(dao.findUsers().isEmpty()){
          grantAdminPrivileges(u);
      }
      dao.registerUser(u);
}




   Il primo utente registrato
      è anche amministratore
Una Piccola Idea
     Ridurre l'oocupazione                                          UserDAO
          di memoria
                                                                  +findUsers():List

                                      <<depends>>

     Registration                                   List findUsers( ) {
  +registerUser(User u)                                   List users = null;
                                                          while(rs.next()){
                                                              if(users == null){
                                                                   users = new List();
                                                              }
                                                              users.add( new User() );
RegisterUser( User u ) {
                                                          }
      if(dao.findUsers().isEmpty()){
                                                          return users;
          grantAdminPrivileges(u);
                                                    }
      }
      Dao.registerUser(u);
}


                                        Cool!
                                  Lazy Initialization!


   Argh! Il cliente si lamenta!
     Il contratto è saltato!
Una Piccola Idea



IDEA: Test dei singoli componenti!
  Esplicitazione del contratto
  Contratto non modificato
     Per gli usi testati


Integrazione
  + Semplice
  + Sicura
Gli Unit Test



   Automatico
   Ripetibile
   Computabile
   Isolato




http://www.natpryce.com/articles/000772.html
Esempio di Unit Test


HelloWorld test...
Un Altra Idea



Se i test sono così
 importanti...
  Prima il test
  Poi il codice


TDD
  Test
  Driven
  Development
Test Driven Development
Test Driven Development
Ed infine



Se i test hanno
 successo...
  l'implementazione può
     cambiare
  il contratto non cambia
Refactoring
Test Driven Development
Esempio di TDD




1 Turno: 3 freccette


 Punteggio:
  Da 301 (o 501) a 0
  Settori
   Double = settore x 2
   Triple = settore x 3
   Bull = 25
   Bull's Eye = 50


      Arrivo a 0 con un Double o un Bull's Eye
      Altrimenti l'intero turno è annullato

More Related Content

PPTX
Unit testing 2014
ODP
TDD DataBase
ODP
TDD Copertura
ODP
TDD Isolamento
ODP
TDD Casi Studio
ODP
TDD Adozione
PDF
2024 Trend Updates: What Really Works In SEO & Content Marketing
PDF
Storytelling For The Web: Integrate Storytelling in your Design Process
Unit testing 2014
TDD DataBase
TDD Copertura
TDD Isolamento
TDD Casi Studio
TDD Adozione
2024 Trend Updates: What Really Works In SEO & Content Marketing
Storytelling For The Web: Integrate Storytelling in your Design Process
Ad

TDD Introduzione

  • 1. Agenda La strada verso Unit Test Che problemi abbiamo ? Una possibile soluzione
  • 2. Il Contesto Integrazione DevA: “...la classe UserDAO funziona correttamente...” DevB: “...anche Registration...” Cliente: “...nella home page continua ad apparire questa Null qualcosa!...”
  • 3. Il Contesto Evoluzione dei requisiti => Evoluzione del SW Errori di regressione DevA: “...ho solo modificato un metodo di UserDAO”
  • 4. L'archetipo UserDAO +findUsers():List <<depends>> Registration List findUsers( ) { +registerUser(User u) List users = new List(); while(rs.next()){ users.add( new User() ); } return users; } registerUser( User u ) { if(dao.findUsers().isEmpty()){ grantAdminPrivileges(u); } dao.registerUser(u); } Il primo utente registrato è anche amministratore
  • 5. Una Piccola Idea Ridurre l'oocupazione UserDAO di memoria +findUsers():List <<depends>> Registration List findUsers( ) { +registerUser(User u) List users = null; while(rs.next()){ if(users == null){ users = new List(); } users.add( new User() ); RegisterUser( User u ) { } if(dao.findUsers().isEmpty()){ return users; grantAdminPrivileges(u); } } Dao.registerUser(u); } Cool! Lazy Initialization! Argh! Il cliente si lamenta! Il contratto è saltato!
  • 6. Una Piccola Idea IDEA: Test dei singoli componenti! Esplicitazione del contratto Contratto non modificato Per gli usi testati Integrazione + Semplice + Sicura
  • 7. Gli Unit Test Automatico Ripetibile Computabile Isolato http://www.natpryce.com/articles/000772.html
  • 8. Esempio di Unit Test HelloWorld test...
  • 9. Un Altra Idea Se i test sono così importanti... Prima il test Poi il codice TDD Test Driven Development
  • 12. Ed infine Se i test hanno successo... l'implementazione può cambiare il contratto non cambia Refactoring
  • 14. Esempio di TDD 1 Turno: 3 freccette Punteggio: Da 301 (o 501) a 0 Settori Double = settore x 2 Triple = settore x 3 Bull = 25 Bull's Eye = 50 Arrivo a 0 con un Double o un Bull's Eye Altrimenti l'intero turno è annullato