SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
Java Unit Testing



         Introduzione


    Ing. Fabrizio Gianneschi
Java User Group Sardegna Onlus
Riferimenti
●   fabrizio.gianneschi@jugsardegna.org
●   http://jroller.com/bitog


Java User Group Sardegna
●   http://www.jugsardegna.org


Java.net Java User Groups Community
●   http://community.java.net/jugs
Introduzione
Il ciclo di sviluppo
Sin dagli albori dell'informatica, gli ingegneri del software
hanno tentato di schematizzare il cosiddetto “ciclo di
sviluppo”
Per CdS si intende comunemente l'insieme di passi che,
partendo dalla raccolta dei requisiti iniziali, porta al rilascio
in produzione del software che (si spera) soddisfi tali
requisiti
Per ridurre la complessità del CdS, lo si è sempre suddiviso
in moduli (fasi), ciascuno a sua volta ingegnerizzabile e
dalle prestazioni misurabili
CdS e metodologie
●   Negli anni, diverse “metodologie” di sviluppo del
    software hanno dato la propria definizione (e
    implementazione) di ciclo di sviluppo, nei modi più
    svariati
●   Sono variate le notazioni, i linguaggi, le definizioni, il
    numero e la tipologia delle fasi
●   Come sempre, “one size doesn't fit all”
Waterfall




© Wikimedia commons, some rights reserved
Iterativo incrementale
Metodologie Agili
●   Nate sul finire degli anni '90, boom intorno al 2002
●   Di stampo iterativo-incrementale, puntano molto sulla
    valorizzazione del programmatore
●   L'Agilità consiste nel ridurre non la qualità del lavoro,
    ma la complessità del processo, del codice
●   Non è un “circo Barnum”, ma un badare al sodo!
Costi del CdS
“Agile keywords”
●   Forte automazione
●   Documentazione ridotta al minimo
●   Enfasi sugli standard
●   Roleplay
●   Integrazione frequente, se non continua
●   Valori
●   Test, test, test...
Testing
●   Il testing è la fase del CdS che serve a rilevare la
    presenza di errori
●   Ne discende che:
    –   Non serve a correggerli
    –   Non garantisce che non ce ne siano
●   Perciò, è importante testare il maggior numero di
    funzioni, il più spesso possibile
●   È efficace se fa sì che si rilevino anomalie
●   Può essere manuale, automatico, misto
Debugging & Logging
●   Complementari del testing
●   Aiutano a trovare gli errori e a correggerli
●   Debug
    –   Non automatizzabile, per definizione
    –   Richiede che il codice sia in esecuzione
    –   Richiede in genere un IDE
    –   Complicato su sistemi remoti e/o complessi
●   Log
    –   Utile e sempre raccomandato
         ● Purchè non si riduca a delle System.out.println()....
Test manuali
●   Un     tester   (umano)    riproduce    i   casi   d'uso
    dell'applicazione e compila un rapporto
●   Molti svantaggi:
    –   Limitati quasi sempre al front end
    –   Lentezza
    –   Error-prone
    –   Soggettività
●   Unico vantaggio
    –   Intelligenza
Esempio di soggettività
Test: verificare che la componente di colore rosso sia
  >127



     R=0                     ?                 R = 255




                         R = 150
Test Automatici
●   Suite di test eseguiti automaticamente da un software
    (es: JUnit)
●   Eliminano la necessità dell'intervento umano
●   Possono scatenare eventi (mail, build, deploy...)
●   Possono generare log, statistiche, documentazione
●   Rapidi
●   Ripetibili
●   Parametrizzabili
●   Ottimizzabili
Test Driven Development
●   Metodologia Agile incardinata sui test automatici
●   In due parole, il motto è: “scrivere i test prima del
    codice”
●   Suona come eretica per i neofiti e per i non avvezzi alle
    metodologie molto codice-centriche e dinamiche
●   In realtà, ha le sue profonde motivazioni
Motivazioni del TDD
Assunto di base:
“È virtualmente impossibile scrivere un sw non banale senza
  commettere errori, né garantire al 100% che il software di terze
  parti lo sia”



➔   Un software senza test non è affidabile.
    (Guidereste mai un'automobile non testata?”)

                ➔   Il testing è necessario
●   Testare, comunque, costa.
    ➔   Prima si trova un difetto, e meglio è
    ➔   Se testo in anticipo, ed impedisco di rilasciare codice non
        testato, sono sicuro che il codice in produzione soddisfa
        tutti i test

●   Testare prima, implica ragionare meglio sul design e a
    chiarire cosa deve fare un pezzo di codice
●   L'implementazione non è (immediatamente) rilevante,
    purché il test funzioni
“Old style” testing
 Scrivo il codice      Creo i test




                     Eseguo i test




                        Test ok?         Correggo il codice




                    Rilascio il codice
Ciclo del TDD




                http://www.nilkanth.com
Schematizzando...
1) Scrivere un test per verificare una funzionalità
2) Eseguire tutti i test
   (L'ultimo scritto non dovrebbe passare, la prima volta)
3) Scrivere del codice per far passare i test
4) Rieseguire i test finchè non passano
5) Fare del refactoring
6) Ripetere tutto finchè ci sono test da aggiungere
Bugfixing
●   Quanto appena detto vale anche per il bugfixing!
●   Si rileva un bug
    –   Si scrive il test che riproduce il contesto del bug
    –   L'obiettivo del test è assicurare che il funzionamento sia
        quello corretto
    –   Si scrive il codice che passa il test (ergo: si risolve
        implicitamente il bug)
●   Risultato?
    –   Quella situazione d'errore è d'ora in poi “presidiata” da un
        test
Benefici del TDD
●   Tempestiva risoluzione dei problemi
●   Garanzia di funzionamento, ora e domani
●   Mai più paura di “rompere tutto” aggiungendo
    qualcosa...
●   ...perchè aggiungere è più facile
●   Si tende a lavorare per interfacce, non per
    implementazioni
●   Meno test manuali
●   Robustezza, Manutenibilità
Regole d'oro del TDD
Test first, always
●   Processo “red/green”
    –   Fail, Pass, Refactor
●   Se non si testa subito, lo si dovrà fare dopo.
    –   Più difficile
    –   O, peggio, non lo si farà

●   100% di successo
    –   Altrimenti, non si integra né si rilascia
Separation of concerns
●   MAI mischiare il codice di test con quello “di
    produzione”

public MyClass{
  ...
  public void myMethod(...){
     //some code here
     ...
     if (isDebugMode() == true){
       ...
     }else{
       ...
     }
  }
}
public MyClass{                  public MyClassTest{
  ...
                                     ...
    public void myMethod(...){
                                     public void testMyMethod(){
        //some code here
                                         ...
        ...
                                         //test goes here!!!!
        ...
                                         ...
    }
                                     }
}
                                 }
“Houston, we've a problem...”
●   Se non riesci a scrivere il test...
    –   vuol dire che il design è fatto male


●   Se non riesci a far passare un test...
    –   vuol dire che il codice è scritto male, oppure il design è
        troppo complesso


●   Se non hai voglia di eseguire i test “perché ci mettono
    troppo”...
    –   rivedi l'automazione (build, setup, integrazione...)
Bad smells....
●   Se i test sembrano tutti uguali, o li fai col “cut&paste”,
    non stai testando bene



●   Se hai troppe dipendenze in un test, si romperà più
    facilmente



●   Se un test va sempre bene anche quando non dovrebbe
Tipologie di test
Tipologie di test
●   Test unitari
●   Test d'integrazione
●   Test funzionali (o d'accettazione)
●   Test regressivi
●   Test di carico (stress test)
Test unitari
●   Testano unità elementari di codice
●   Principio fondamentale: isolamento
●   Come definire l'unità?
    –   In genere, in Java, è una classe
    –   Ogni classe, una classe di test
    –   Ogni metodo, uno o più metodi di test
●   Di responsabilità dello sviluppatore
●   Tool: JUnit
Test d'integrazione
●   Test che verificano il funzionamento di più unità che
    collaborano tra loro
    –   Non è detto che due unità perfette collaborino
        perfettamente
●   In genere, sono eseguiti successivamente al commit nel
    CVS
    –   L'XP prevede una macchina d'integrazione
●   La responsabilità può essere del programmatore o di un
    team
●   Tool: CruiseControl
Test funzionali
●   Verificano la corretta esecuzione di complete
    funzionalità verticali, sino al back end (“carotaggio”)
●   Se coincidono con quanto vuole il cliente, o sono da egli
    scritti, sono
    anche d'accettazione
●   Comportano il test del
    front-end
    (in genere il più costoso)
●   Tool: HttpUnit, Canoo, Selenium
Test di regressione
●   Servono a verificare che il codice funzionante sino a ieri
    funzioni anche oggi
    –   Spesso, il codice che funzionava per qualche motivo non
        funziona più
    –   Quasi sempre, perchè il codice era fragile
●   In pratica, si rieseguono tutti i vecchi test, si scova
    l'errore e si corregge
●   Impliciti in molte metodologie agili (es: XP)
Test di carico e stress
●   Portano il sistema alle condizioni limite in fatto di
    volume di dati gestiti, accessi e traffico
●   Tool: JMeter
Stub e Mock
Test sotto dipendenze
●   L'isolamento è la condizione ideale per eseguire i test
●   Purtroppo, spesso non è possibile testare tutti i
    componenti in tali condizioni per via delle dipendenze
    –   Altri componenti
    –   Risorse dell'Application Server (connection pool, mail,
        librerie...)
Esempio: servlet                                          Come
                                                       simulare la
final String WELCOME = “Benvenuto tra noi”;             request?

public void doGet(HttpServletRequest req,
  HttpServletResponse res){                    Come far sì che la
                                               sessione sia nello
    HttpSession session = req.getSession();      stato voluto?

    Person p = session.getAttribute(“user”);
    if ( p == null ){
        ..//not authenticated
    }else{
        ...
        ...
    }
}
Esempio: mail
●   Supponiamo di dover effettuare dei test sul database di
    preproduzione (dati reali)
●   Devo testare se la procedura di rinnovo password
    spedisce la mail al destinatario
●   Come eseguire i test senza inondare i veri clienti di
    email?
Soluzione: Stub e Mock
●   Sono oggetti che simulano il comportamento di altri
    –   Più semplici
    –   Realizzati e controllabili dal programmatore
●   La differenza tra stub e mock è molto sottile
●   Stub: forniscono risposte “preconfezionate”, possono
    registrare informazioni sullo stato
    –   In genere si aggiungono metodi rispetto all'interfaccia
        reale
●   Mock: verificano il comportamento, più a grana fine
Esempio: Stub
public interface MailService {

    public void sendMessage (Message msg);

}

public class MailServiceStub implements MailService {

    private List<Message> messages = new ArrayList<Message>();

    public void sendMessage (Message msg) {

        messages.add(msg);

    }

    public int getNumberSent() {

        return messages.size();

    }
Stub Test
class SMTPServerTest
 public void testSend() {
      MailService srvc = new MailServiceStub();
      SMTPServer smtp = new SMTPServer();
     smtp.setService(srvc);


     List<Messages> msg = DummyMessages.create(1);
     smtp.send(msg);
     if (srvc.getNumberSent == 1){
                                              Classe
       ...//test ok                          “dummy”
     }
 }
Licenza Creative Commons (sunto)
 Attribuzione-Non commerciale-Condividi allo stesso modo
 3.0 Unported
 Tu sei libero di modificare, riprodurre, distribuire, comunicare al pubblico, esporre in
 pubblico, rappresentare, eseguire e recitare quest'opera.


  Alle seguenti condizioni:
  ●   Attribuzione. Devi attribuire la paternità dell'opera nei modi indicati dall'autore
      o da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi
      avallino te o il modo in cui tu usi l'opera.
  ●   Non commerciale. Non puoi usare quest'opera per fini commerciali.
  ●   Condividi allo stesso modo. Se alteri o trasformi quest'opera, o se la usi per
      crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o
      equivalente a questa.


  ●   Testo completo della licenza completa su:
      http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode

Contenu connexe

Tendances

PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group MilanoMassimo Groppelli
 
Unit Test di Gabriele Seroni
Unit Test di Gabriele SeroniUnit Test di Gabriele Seroni
Unit Test di Gabriele SeroniGiuneco S.r.l
 
Android Test Driven Development
Android Test Driven DevelopmentAndroid Test Driven Development
Android Test Driven Developmentsazilla
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliAndrea Della Corte
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven DevelopmentEnnio Masi
 
Lezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e SubversionLezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e SubversionAndrea Della Corte
 
Lezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme ProgrammingLezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme ProgrammingAndrea Della Corte
 
Lezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliLezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliAndrea Della Corte
 
Tdd.Every.Where.21012012
Tdd.Every.Where.21012012Tdd.Every.Where.21012012
Tdd.Every.Where.21012012LEGALDESK
 
Programmazione concorrente in Java (vecchio modello)
Programmazione concorrente in Java (vecchio modello)Programmazione concorrente in Java (vecchio modello)
Programmazione concorrente in Java (vecchio modello)Davide Carboni
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
 
Come automatizzare i test con Selenium IDE
Come automatizzare i test con Selenium IDECome automatizzare i test con Selenium IDE
Come automatizzare i test con Selenium IDEStefano Trojani
 
Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Carmelantonio Zolfo
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationTiziano Serritella
 

Tendances (19)

Unit testing 101
Unit testing 101Unit testing 101
Unit testing 101
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 
Unit Test di Gabriele Seroni
Unit Test di Gabriele SeroniUnit Test di Gabriele Seroni
Unit Test di Gabriele Seroni
 
Concurrency
ConcurrencyConcurrency
Concurrency
 
Android Test Driven Development
Android Test Driven DevelopmentAndroid Test Driven Development
Android Test Driven Development
 
Lezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern ComportamentaliLezione 8: Design Pattern Comportamentali
Lezione 8: Design Pattern Comportamentali
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven Development
 
Lezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e SubversionLezione 4: I tool Ant e Subversion
Lezione 4: I tool Ant e Subversion
 
Lezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme ProgrammingLezione 3: Sviluppo in Extreme Programming
Lezione 3: Sviluppo in Extreme Programming
 
Lezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliLezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern Strutturali
 
Tdd.Every.Where.21012012
Tdd.Every.Where.21012012Tdd.Every.Where.21012012
Tdd.Every.Where.21012012
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Programmazione concorrente in Java (vecchio modello)
Programmazione concorrente in Java (vecchio modello)Programmazione concorrente in Java (vecchio modello)
Programmazione concorrente in Java (vecchio modello)
 
Il testing con zend framework
Il testing con zend frameworkIl testing con zend framework
Il testing con zend framework
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql Server
 
Come automatizzare i test con Selenium IDE
Come automatizzare i test con Selenium IDECome automatizzare i test con Selenium IDE
Come automatizzare i test con Selenium IDE
 
Maven Eclipse
Maven EclipseMaven Eclipse
Maven Eclipse
 
Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
 

Similaire à Java Unit Testing - Introduction

Software Testing & Test Driven Development
Software Testing & Test Driven DevelopmentSoftware Testing & Test Driven Development
Software Testing & Test Driven DevelopmentSergio Santoro
 
Presentazione Testing automatizzato
Presentazione Testing automatizzatoPresentazione Testing automatizzato
Presentazione Testing automatizzatoangelolu
 
PASS Virtual Chapter - Unit Testing su SQL Server
PASS Virtual Chapter - Unit Testing su SQL ServerPASS Virtual Chapter - Unit Testing su SQL Server
PASS Virtual Chapter - Unit Testing su SQL ServerAlessandro Alpi
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
CONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERCONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERDotNetCampus
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPresslucatume
 
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...Boymix81
 
Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliStefano Leli
 
TDD patterns and TDD strategies
TDD patterns and TDD strategiesTDD patterns and TDD strategies
TDD patterns and TDD strategiesAlessandro Ceseno
 
PASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous IntegrationPASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous IntegrationAlessandro Alpi
 
Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceAndrea Dottor
 
Tdd e continuous delivery sull'infrastruttura
Tdd e continuous delivery sull'infrastrutturaTdd e continuous delivery sull'infrastruttura
Tdd e continuous delivery sull'infrastrutturaCodemotion
 
TDD e Continuous Delivery sull'infrastruttura
TDD e Continuous Delivery sull'infrastrutturaTDD e Continuous Delivery sull'infrastruttura
TDD e Continuous Delivery sull'infrastrutturaFilippo Liverani
 
Android Test Driven Development
Android Test Driven DevelopmentAndroid Test Driven Development
Android Test Driven Developmentsazilla
 

Similaire à Java Unit Testing - Introduction (20)

Software Testing & Test Driven Development
Software Testing & Test Driven DevelopmentSoftware Testing & Test Driven Development
Software Testing & Test Driven Development
 
Software Testing e TDD
Software Testing e TDDSoftware Testing e TDD
Software Testing e TDD
 
Presentazione Testing automatizzato
Presentazione Testing automatizzatoPresentazione Testing automatizzato
Presentazione Testing automatizzato
 
PASS Virtual Chapter - Unit Testing su SQL Server
PASS Virtual Chapter - Unit Testing su SQL ServerPASS Virtual Chapter - Unit Testing su SQL Server
PASS Virtual Chapter - Unit Testing su SQL Server
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
CONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERCONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVER
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPress
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...
Presentazione della Tesi di Laurea Specialistica : STRUMENTI PER LA GENERAZIO...
 
Intoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie AgiliIntoduzione Alle Metodologie Agili
Intoduzione Alle Metodologie Agili
 
Total Testing in DevOps
Total Testing in DevOpsTotal Testing in DevOps
Total Testing in DevOps
 
TDD patterns and TDD strategies
TDD patterns and TDD strategiesTDD patterns and TDD strategies
TDD patterns and TDD strategies
 
Unit testing 2014
Unit testing 2014Unit testing 2014
Unit testing 2014
 
PASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous IntegrationPASS Virtual Chapter - SQL Server Continuous Integration
PASS Virtual Chapter - SQL Server Continuous Integration
 
Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita felice
 
Tdd e continuous delivery sull'infrastruttura
Tdd e continuous delivery sull'infrastrutturaTdd e continuous delivery sull'infrastruttura
Tdd e continuous delivery sull'infrastruttura
 
Il testing con zend framework
Il testing con zend frameworkIl testing con zend framework
Il testing con zend framework
 
TDD e Continuous Delivery sull'infrastruttura
TDD e Continuous Delivery sull'infrastrutturaTDD e Continuous Delivery sull'infrastruttura
TDD e Continuous Delivery sull'infrastruttura
 
Android Test Driven Development
Android Test Driven DevelopmentAndroid Test Driven Development
Android Test Driven Development
 
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 

Dernier

Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 

Dernier (9)

Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 

Java Unit Testing - Introduction

  • 1. Java Unit Testing Introduzione Ing. Fabrizio Gianneschi Java User Group Sardegna Onlus
  • 2. Riferimenti ● fabrizio.gianneschi@jugsardegna.org ● http://jroller.com/bitog Java User Group Sardegna ● http://www.jugsardegna.org Java.net Java User Groups Community ● http://community.java.net/jugs
  • 4. Il ciclo di sviluppo Sin dagli albori dell'informatica, gli ingegneri del software hanno tentato di schematizzare il cosiddetto “ciclo di sviluppo” Per CdS si intende comunemente l'insieme di passi che, partendo dalla raccolta dei requisiti iniziali, porta al rilascio in produzione del software che (si spera) soddisfi tali requisiti Per ridurre la complessità del CdS, lo si è sempre suddiviso in moduli (fasi), ciascuno a sua volta ingegnerizzabile e dalle prestazioni misurabili
  • 5. CdS e metodologie ● Negli anni, diverse “metodologie” di sviluppo del software hanno dato la propria definizione (e implementazione) di ciclo di sviluppo, nei modi più svariati ● Sono variate le notazioni, i linguaggi, le definizioni, il numero e la tipologia delle fasi ● Come sempre, “one size doesn't fit all”
  • 6. Waterfall © Wikimedia commons, some rights reserved
  • 8. Metodologie Agili ● Nate sul finire degli anni '90, boom intorno al 2002 ● Di stampo iterativo-incrementale, puntano molto sulla valorizzazione del programmatore ● L'Agilità consiste nel ridurre non la qualità del lavoro, ma la complessità del processo, del codice ● Non è un “circo Barnum”, ma un badare al sodo!
  • 10. “Agile keywords” ● Forte automazione ● Documentazione ridotta al minimo ● Enfasi sugli standard ● Roleplay ● Integrazione frequente, se non continua ● Valori ● Test, test, test...
  • 11. Testing ● Il testing è la fase del CdS che serve a rilevare la presenza di errori ● Ne discende che: – Non serve a correggerli – Non garantisce che non ce ne siano ● Perciò, è importante testare il maggior numero di funzioni, il più spesso possibile ● È efficace se fa sì che si rilevino anomalie ● Può essere manuale, automatico, misto
  • 12. Debugging & Logging ● Complementari del testing ● Aiutano a trovare gli errori e a correggerli ● Debug – Non automatizzabile, per definizione – Richiede che il codice sia in esecuzione – Richiede in genere un IDE – Complicato su sistemi remoti e/o complessi ● Log – Utile e sempre raccomandato ● Purchè non si riduca a delle System.out.println()....
  • 13. Test manuali ● Un tester (umano) riproduce i casi d'uso dell'applicazione e compila un rapporto ● Molti svantaggi: – Limitati quasi sempre al front end – Lentezza – Error-prone – Soggettività ● Unico vantaggio – Intelligenza
  • 14. Esempio di soggettività Test: verificare che la componente di colore rosso sia >127 R=0 ? R = 255 R = 150
  • 15. Test Automatici ● Suite di test eseguiti automaticamente da un software (es: JUnit) ● Eliminano la necessità dell'intervento umano ● Possono scatenare eventi (mail, build, deploy...) ● Possono generare log, statistiche, documentazione ● Rapidi ● Ripetibili ● Parametrizzabili ● Ottimizzabili
  • 16. Test Driven Development ● Metodologia Agile incardinata sui test automatici ● In due parole, il motto è: “scrivere i test prima del codice” ● Suona come eretica per i neofiti e per i non avvezzi alle metodologie molto codice-centriche e dinamiche ● In realtà, ha le sue profonde motivazioni
  • 17. Motivazioni del TDD Assunto di base: “È virtualmente impossibile scrivere un sw non banale senza commettere errori, né garantire al 100% che il software di terze parti lo sia” ➔ Un software senza test non è affidabile. (Guidereste mai un'automobile non testata?”) ➔ Il testing è necessario
  • 18. Testare, comunque, costa. ➔ Prima si trova un difetto, e meglio è ➔ Se testo in anticipo, ed impedisco di rilasciare codice non testato, sono sicuro che il codice in produzione soddisfa tutti i test ● Testare prima, implica ragionare meglio sul design e a chiarire cosa deve fare un pezzo di codice ● L'implementazione non è (immediatamente) rilevante, purché il test funzioni
  • 19. “Old style” testing Scrivo il codice Creo i test Eseguo i test Test ok? Correggo il codice Rilascio il codice
  • 20. Ciclo del TDD http://www.nilkanth.com
  • 21. Schematizzando... 1) Scrivere un test per verificare una funzionalità 2) Eseguire tutti i test (L'ultimo scritto non dovrebbe passare, la prima volta) 3) Scrivere del codice per far passare i test 4) Rieseguire i test finchè non passano 5) Fare del refactoring 6) Ripetere tutto finchè ci sono test da aggiungere
  • 22. Bugfixing ● Quanto appena detto vale anche per il bugfixing! ● Si rileva un bug – Si scrive il test che riproduce il contesto del bug – L'obiettivo del test è assicurare che il funzionamento sia quello corretto – Si scrive il codice che passa il test (ergo: si risolve implicitamente il bug) ● Risultato? – Quella situazione d'errore è d'ora in poi “presidiata” da un test
  • 23. Benefici del TDD ● Tempestiva risoluzione dei problemi ● Garanzia di funzionamento, ora e domani ● Mai più paura di “rompere tutto” aggiungendo qualcosa... ● ...perchè aggiungere è più facile ● Si tende a lavorare per interfacce, non per implementazioni ● Meno test manuali ● Robustezza, Manutenibilità
  • 25. Test first, always ● Processo “red/green” – Fail, Pass, Refactor ● Se non si testa subito, lo si dovrà fare dopo. – Più difficile – O, peggio, non lo si farà ● 100% di successo – Altrimenti, non si integra né si rilascia
  • 26. Separation of concerns ● MAI mischiare il codice di test con quello “di produzione” public MyClass{ ... public void myMethod(...){ //some code here ... if (isDebugMode() == true){ ... }else{ ... } } }
  • 27. public MyClass{ public MyClassTest{ ... ... public void myMethod(...){ public void testMyMethod(){ //some code here ... ... //test goes here!!!! ... ... } } } }
  • 28. “Houston, we've a problem...” ● Se non riesci a scrivere il test... – vuol dire che il design è fatto male ● Se non riesci a far passare un test... – vuol dire che il codice è scritto male, oppure il design è troppo complesso ● Se non hai voglia di eseguire i test “perché ci mettono troppo”... – rivedi l'automazione (build, setup, integrazione...)
  • 29. Bad smells.... ● Se i test sembrano tutti uguali, o li fai col “cut&paste”, non stai testando bene ● Se hai troppe dipendenze in un test, si romperà più facilmente ● Se un test va sempre bene anche quando non dovrebbe
  • 31. Tipologie di test ● Test unitari ● Test d'integrazione ● Test funzionali (o d'accettazione) ● Test regressivi ● Test di carico (stress test)
  • 32. Test unitari ● Testano unità elementari di codice ● Principio fondamentale: isolamento ● Come definire l'unità? – In genere, in Java, è una classe – Ogni classe, una classe di test – Ogni metodo, uno o più metodi di test ● Di responsabilità dello sviluppatore ● Tool: JUnit
  • 33. Test d'integrazione ● Test che verificano il funzionamento di più unità che collaborano tra loro – Non è detto che due unità perfette collaborino perfettamente ● In genere, sono eseguiti successivamente al commit nel CVS – L'XP prevede una macchina d'integrazione ● La responsabilità può essere del programmatore o di un team ● Tool: CruiseControl
  • 34. Test funzionali ● Verificano la corretta esecuzione di complete funzionalità verticali, sino al back end (“carotaggio”) ● Se coincidono con quanto vuole il cliente, o sono da egli scritti, sono anche d'accettazione ● Comportano il test del front-end (in genere il più costoso) ● Tool: HttpUnit, Canoo, Selenium
  • 35. Test di regressione ● Servono a verificare che il codice funzionante sino a ieri funzioni anche oggi – Spesso, il codice che funzionava per qualche motivo non funziona più – Quasi sempre, perchè il codice era fragile ● In pratica, si rieseguono tutti i vecchi test, si scova l'errore e si corregge ● Impliciti in molte metodologie agili (es: XP)
  • 36. Test di carico e stress ● Portano il sistema alle condizioni limite in fatto di volume di dati gestiti, accessi e traffico ● Tool: JMeter
  • 38. Test sotto dipendenze ● L'isolamento è la condizione ideale per eseguire i test ● Purtroppo, spesso non è possibile testare tutti i componenti in tali condizioni per via delle dipendenze – Altri componenti – Risorse dell'Application Server (connection pool, mail, librerie...)
  • 39. Esempio: servlet Come simulare la final String WELCOME = “Benvenuto tra noi”; request? public void doGet(HttpServletRequest req, HttpServletResponse res){ Come far sì che la sessione sia nello HttpSession session = req.getSession(); stato voluto? Person p = session.getAttribute(“user”); if ( p == null ){ ..//not authenticated }else{ ... ... } }
  • 40. Esempio: mail ● Supponiamo di dover effettuare dei test sul database di preproduzione (dati reali) ● Devo testare se la procedura di rinnovo password spedisce la mail al destinatario ● Come eseguire i test senza inondare i veri clienti di email?
  • 41. Soluzione: Stub e Mock ● Sono oggetti che simulano il comportamento di altri – Più semplici – Realizzati e controllabili dal programmatore ● La differenza tra stub e mock è molto sottile ● Stub: forniscono risposte “preconfezionate”, possono registrare informazioni sullo stato – In genere si aggiungono metodi rispetto all'interfaccia reale ● Mock: verificano il comportamento, più a grana fine
  • 42. Esempio: Stub public interface MailService { public void sendMessage (Message msg); } public class MailServiceStub implements MailService { private List<Message> messages = new ArrayList<Message>(); public void sendMessage (Message msg) { messages.add(msg); } public int getNumberSent() { return messages.size(); }
  • 43. Stub Test class SMTPServerTest public void testSend() { MailService srvc = new MailServiceStub(); SMTPServer smtp = new SMTPServer(); smtp.setService(srvc); List<Messages> msg = DummyMessages.create(1); smtp.send(msg); if (srvc.getNumberSent == 1){ Classe ...//test ok “dummy” } }
  • 44. Licenza Creative Commons (sunto) Attribuzione-Non commerciale-Condividi allo stesso modo 3.0 Unported Tu sei libero di modificare, riprodurre, distribuire, comunicare al pubblico, esporre in pubblico, rappresentare, eseguire e recitare quest'opera. Alle seguenti condizioni: ● Attribuzione. Devi attribuire la paternità dell'opera nei modi indicati dall'autore o da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi avallino te o il modo in cui tu usi l'opera. ● Non commerciale. Non puoi usare quest'opera per fini commerciali. ● Condividi allo stesso modo. Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o equivalente a questa. ● Testo completo della licenza completa su: http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode