SlideShare a Scribd company logo
1 of 40
METODOLOGIE AGILI
Introduzione al workshop sperimentale
Fasi dello sviluppo software
 Analisi dei requisiti
 Progettazione
 Codifica
 Testing
 Rilascio
Sviluppare software è complesso
Cosa il cliente veramente
voleva
Metodologie tradizionali: waterfall
Metodologie tradizionali: waterfall
Limiti del waterfall
Tende ad essere
rigido e non adattabile
Tutto nel software cambia
 Requisiti
 Progetto
 Business
 Tecnologia
 Team
Gestire il cambiamento
Il problema non è il cambiamento
ma è l'incapacità di gestirlo
Obiettivi delle metodologie agili
Obiettivi delle metodologie agili
 Soddisfare il cliente per mezzo di tempestivi
e continui rilasci di software di valore.
 I cambiamenti nelle specifiche sono ben accetti, anche a
stadi avanzati di sviluppo.
 Ridurre i tempi di realizzazione
 Aumentare la produttività
 Aumentare la qualità
 Del software
 Del lavoro
Principi fondamentali dell'agile
 Lavoro di squadra
 Comunicazione
 Feedback continuo
 Piccoli passi
Molteplici tecniche e metodi
So what?
 Molte di queste tecniche sono considerate
difficili
 Non si insegnano neppure all'università
 Richiedono mesi di addestramento
 Ecchecistiamo a fare qui?
Vogliamo cambiare!
 Non sempre quello che tutti pensano è la cosa
giusta.
 Se non si fanno cambiamenti, non ci si evolve e
crederemmo di sapere cose non proprio
corrette:
Dove vogliamo andare?
 Vogliamo esporre programmatori giovani
(”puri”?) precocemente a queste tecniche
 E’ nostra opinione che questo abbia un effetto
positivo sul processo di sviluppo, in particolare
sui programmatori
 Specialmente, pensiamo sia un’ottimo
strumento didattico.
Cosa non è
 Non è una gara, tipo le Olimpiadi di Informatica
 Non deve essere stressante, semmai il
contrario
 Non è una verifica. Se ci sarà il voto, sarà
basato sulla cooperazione dimostrata, non sul
codice prodotto.
 Non è neppure una lezione autoconclusiva.
Applicheremo questa tecnica anche in futuro.
”Practice make perfect”.
Come lavoreremo
 Oggi proveremo ad applicare alcune tecniche
agili tutte in una volta.
 Sarete divisi in gruppi di studio, ognuno dei
quali lavora separatamente; però, la
comunicazione con gli altri gruppi non è vietata
(infatti, non è una gara).
 Proveremo a costruire una classe Java
perfettamente (?) funzionante
1° tecnica: Pair programming
?
Se non lo
conoscete
già...
2° tecnica: Timeboxing
2° tecnica: Timeboxing
 C'è un tempo ben determinato per chiudere un
passo dello sviluppo
 Finito il tempo, si
consegna.
 Niente eccezioni!
3° Test Driven Development
 Prima si scrive il test
 Poi si scrive il codice
 Quando va, si migliora
il codice
TDD – Scrivere il test
 Il test va scritto sapendo COSA si vuole
ottenere, ma non come.
 Lanciare il test: DEVE fallire
TDD – Refactoring
 Scrivere il codice
 Scrivere il MINIMO codice che permette di
passare il test
 Lanciare il test – se è rosso, rivedere il codice e
ripetere
TDD – Refactoring
 Consiste nel modificare la struttura interna di
un codice codice senza modificarne il
comportamento esterno
 Permette di migliorare
– la leggibilità
– la riusabilità l'estensibilità
– Le prestazioni
Argomento: Anno bisestile (WP)
 Un anno bisestile è un anno solare in cui
avviene la periodica intercalazione di un giorno
aggiuntivo nell'anno stesso, un accorgimento
utilizzato in quasi tutti i calendari solari (quali
quelli giuliano e gregoriano) per evitare lo
slittamento delle stagioni: ogni 4 anni
accumulerebbero un giorno in più di ritardo. Per
correggere questo slittamento, agli anni
"normali" di 365 giorni (ogni 4 anni) si
intercalano gli anni "bisestili" di 366:
TEST DRIVE
 Proveremo un TDD con Junit – NON
SCRIVERETE I TEST, ma vi limiterete a
scrivere diretti dalle indicazioni del test.
 Sedetevi alle vostre postazioni
 Create un progetto Java Console e chiamatelo
JavaBisestile. Creerà una classe chiamata
JavaBisestile, all'interno del package
javabisestile.
Step 1 - Setup
 Fate click destro sul file JavaBisestile.java
 Scegliete “Tools > Create Tests”
 Scegliete Junit 4.x.
 Il sistema creerà un file speciale, chiamato
JavaBisestileTest.java
 Contiene lo scheletro del nostro test.

Step 1 – Test (RED + Green)
 Fate Run->Test Project
 Il risultato è rosso.
 Andate in JavaBisestileTest
 Eliminate la riga con throw...
 Fate Run->Test Project
 Verde!
Step 2 – First real test (RED)!
 In fondo alla classe JavaBisestileTest, ma
prima dell'ultima graffa, aggiungete questo
codice (Test1.java):
@Test
public void testIsBisestile() {
assertTrue("2004 deve essere
bisestile",JavaBisestile.isBisestile(2004));
assertTrue("2008 deve essere
bisestile",JavaBisestile.isBisestile(2008));
assertTrue("2012 deve essere
bisestile",JavaBisestile.isBisestile(2012));}
 Lanciate il test
Step 2 – First real test (RED)!
 Click sulla lampadina dell'errore
 Scegliete “Create Method isBisestile(int) in
javabisestile.JavaBisestile”.
static boolean isBisestile(int i) {
throw new
UnsupportedOperationException("Not
supported yet.");
}
 Lanciate il test (ancora rosso)
Step 2 – First real test (GREEN)
 Eliminare la riga fail(...)...
 Scrivere il codice minimo che renda valido il
test
 Avete 20 secondi
 Lanciate il test: deve essere verde.
Step 2 – Controllo
 La soluzione corretta è
 return true
 In tutti gli altri casi avete agito con overcoding.
 Ricordate: scrivere il MINIMO codice che fa
passare il test.
 In questo caso salteremo il refactoring
Step 3 - ”Triangulation”
 Il test che abbiamo aggiunto non è molto
significativo
 Come nel caso della navigazione, per fare il
punto abbiamo bisogno almento di un altro test,
possibilmente che ci dica qualcosa di più.
 Per esempio elementi di tipo DIVERSO dal
precedente.
 In gergo si chiama ”triangolazione”
Step 3 – Better test (RED)
 Inserite questo nuovo test (test2.java)
 @Test
public void testNonBisestile() {
 assertFalse("2005 non deve essere
bisestile",JavaBisestile.isBisestile(2005));
 assertFalse("2003 non deve essere
bisestile",JavaBisestile.isBisestile(2003));
 assertFalse("2002 non deve essere
bisestile",JavaBisestile.isBisestile(2002));
 assertFalse("2001 non deve essere
bisestile",JavaBisestile.isBisestile(2001));
 }
Step 3 – Better test (GREEN)
 Fate in modo che il test passi
 Avete 120 secondi
 Lanciate il test: il test deve essere verde.
Step 3 – Better test (REFACTOR)
 Dedicate 130 secondi a migliorare il vostro
codice
 Commenti? Javadoc?
 Nomi di variabili sensati? Indentazione?
 Fa schifo?
– Usa uno switch?
– Peggio, usa 4 if?
– Se si è ora di cambiarlo (pensate a un test con 35
valori di anno...il vostro codice diventa elefantiaco)
 Dopo la correzione, tutto deve essere verde.
Step 4 – Non va ancora bene...
 Da Wikipedia:
 ”A partire dal 1582 è in funzione il calendario
gregoriano, che elimina un anno bisestile
all'inizio di ogni secolo, se non è divisibile per
400”
 Codifichiamo questo in un altro test.

Step 4 – Second test (RED)
@Test
 public void testcalendarioGregoriano() {
 assertTrue("1000 non deve essere
bisestile",JavaBisestile.isBisestile(1000));
 assertFalse("1800 non deve essere
bisestile",JavaBisestile.isBisestile(1800));
 assertFalse("1900 non deve essere
bisestile",JavaBisestile.isBisestile(1900));
 assertTrue("2000 deve essere
bisestile",JavaBisestile.isBisestile(2000));
 }
Step 4 – Second test (RED)

Finite il test nei tempi che desiderate

Un premio a chi finisce prima con il codice
migliore!

File: Test3.java

Fine!
 Grazie per l'attenzione
 Pronti per l'azione ”vera”?


More Related Content

What's hot

Android Test Driven Development
Android Test Driven DevelopmentAndroid Test Driven Development
Android Test Driven Developmentsazilla
 
Test Driven Development @ Xe.Net
Test Driven Development @ Xe.NetTest Driven Development @ Xe.Net
Test Driven Development @ Xe.NetMauro Servienti
 
Fe05 test drivenjavascriptdevelopment
Fe05   test drivenjavascriptdevelopmentFe05   test drivenjavascriptdevelopment
Fe05 test drivenjavascriptdevelopmentDotNetCampus
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven DevelopmentEnnio Masi
 
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
 
ATDD - Acceptance Test Driven Development
ATDD - Acceptance Test Driven DevelopmentATDD - Acceptance Test Driven Development
ATDD - Acceptance Test Driven DevelopmentGiorgio Marchetti
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)Roberto Bettazzoni
 
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
 
Test Driven Development for iOS
Test Driven Development for iOSTest Driven Development for iOS
Test Driven Development for iOSAlessandro Ceseno
 

What's hot (13)

Test automatizzati & serenity bdd
Test automatizzati & serenity bddTest automatizzati & serenity bdd
Test automatizzati & serenity bdd
 
Android Test Driven Development
Android Test Driven DevelopmentAndroid Test Driven Development
Android Test Driven Development
 
TTT - Test, Tools and Tips - jug roma
TTT - Test, Tools and Tips - jug romaTTT - Test, Tools and Tips - jug roma
TTT - Test, Tools and Tips - jug roma
 
Test Driven Development @ Xe.Net
Test Driven Development @ Xe.NetTest Driven Development @ Xe.Net
Test Driven Development @ Xe.Net
 
Fe05 test drivenjavascriptdevelopment
Fe05   test drivenjavascriptdevelopmentFe05   test drivenjavascriptdevelopment
Fe05 test drivenjavascriptdevelopment
 
Pro php refactoring
Pro php refactoringPro php refactoring
Pro php refactoring
 
Introduzione al Test Driven Development
Introduzione al Test Driven DevelopmentIntroduzione al Test Driven Development
Introduzione al Test Driven Development
 
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
 
ATDD - Acceptance Test Driven Development
ATDD - Acceptance Test Driven DevelopmentATDD - Acceptance Test Driven Development
ATDD - Acceptance Test Driven Development
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)
 
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
 
Unit test
Unit testUnit test
Unit test
 
Test Driven Development for iOS
Test Driven Development for iOSTest Driven Development for iOS
Test Driven Development for iOS
 

Similar to Workshop: Introduzione ad TDD

Software Testing & Test Driven Development
Software Testing & Test Driven DevelopmentSoftware Testing & Test Driven Development
Software Testing & Test Driven DevelopmentSergio Santoro
 
Delphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del TestingDelphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del TestingMarco Breveglieri
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...Alessandro Alpi
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPresslucatume
 
Unit Test di Gabriele Seroni
Unit Test di Gabriele SeroniUnit Test di Gabriele Seroni
Unit Test di Gabriele SeroniGiuneco S.r.l
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group MilanoMassimo Groppelli
 
CONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERCONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERDotNetCampus
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascriptPiero Bozzolo
 
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKataAndrea Francia
 
L'Occhio di Ra sul Testing
L'Occhio di Ra sul TestingL'Occhio di Ra sul Testing
L'Occhio di Ra sul TestingFelice Pescatore
 
Java Unit Testing - Introduction
Java Unit Testing - IntroductionJava Unit Testing - Introduction
Java Unit Testing - Introductionfgianneschi
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capturefcospito
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capturefcospito
 
Unit Tests VS End To End Tests
Unit Tests VS End To End TestsUnit Tests VS End To End Tests
Unit Tests VS End To End Testsmimmozzo_
 
Workshop Test Drive Development
Workshop Test Drive DevelopmentWorkshop Test Drive Development
Workshop Test Drive DevelopmentCommit University
 

Similar to Workshop: Introduzione ad TDD (20)

Unit testing 101
Unit testing 101Unit testing 101
Unit testing 101
 
Software Testing & Test Driven Development
Software Testing & Test Driven DevelopmentSoftware Testing & Test Driven Development
Software Testing & Test Driven Development
 
Delphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del TestingDelphi & Dintorni Webinar - Diventa un mago del Testing
Delphi & Dintorni Webinar - Diventa un mago del Testing
 
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
DevOpsHeroes 2016 - Realizzare Continouous Integration con SQL Server e Visua...
 
Total Testing in DevOps
Total Testing in DevOpsTotal Testing in DevOps
Total Testing in DevOps
 
TDD in WordPress
TDD in WordPressTDD in WordPress
TDD in WordPress
 
Unit Test di Gabriele Seroni
Unit Test di Gabriele SeroniUnit Test di Gabriele Seroni
Unit Test di Gabriele Seroni
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 
CONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVERCONTINUOUS INTEGRATION CON SQL SERVER
CONTINUOUS INTEGRATION CON SQL SERVER
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql Server
 
TDD - una introduzione
TDD -  una introduzioneTDD -  una introduzione
TDD - una introduzione
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascript
 
Baby Steps TripServiceKata
Baby Steps TripServiceKataBaby Steps TripServiceKata
Baby Steps TripServiceKata
 
L'Occhio di Ra sul Testing
L'Occhio di Ra sul TestingL'Occhio di Ra sul Testing
L'Occhio di Ra sul Testing
 
Java Unit Testing - Introduction
Java Unit Testing - IntroductionJava Unit Testing - Introduction
Java Unit Testing - Introduction
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
 
Unit Tests VS End To End Tests
Unit Tests VS End To End TestsUnit Tests VS End To End Tests
Unit Tests VS End To End Tests
 
Workshop Test Drive Development
Workshop Test Drive DevelopmentWorkshop Test Drive Development
Workshop Test Drive Development
 

More from Marcello Missiroli

More from Marcello Missiroli (20)

Algorithmist guide II
Algorithmist guide IIAlgorithmist guide II
Algorithmist guide II
 
Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
 
Dal C a Java (2/3)
Dal C a Java (2/3)Dal C a Java (2/3)
Dal C a Java (2/3)
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Variabili
VariabiliVariabili
Variabili
 
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
 
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
 
Il ciclo for
Il ciclo forIl ciclo for
Il ciclo for
 
Lo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in JavaLo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in Java
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
 

Recently uploaded

XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaStefano Lariccia
 
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxLorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxlorenzodemidio01
 
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxLorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxlorenzodemidio01
 
Lorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxLorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxlorenzodemidio01
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaStefano Lariccia
 
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxLorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxlorenzodemidio01
 

Recently uploaded (6)

XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia RomanaXIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
XIII Lezione - Arabo G.Rammo @ Libera Accademia Romana
 
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptxLorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
Lorenzo D'Emidio_Vita di Cristoforo Colombo.pptx
 
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptxLorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
Lorenzo D'Emidio- Lavoro sulla Bioarchittetura.pptx
 
Lorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptxLorenzo D'Emidio_Francesco Petrarca.pptx
Lorenzo D'Emidio_Francesco Petrarca.pptx
 
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia RomanaXI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
XI Lezione - Arabo LAR Giath Rammo @ Libera Accademia Romana
 
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptxLorenzo D'Emidio_Vita e opere di Aristotele.pptx
Lorenzo D'Emidio_Vita e opere di Aristotele.pptx
 

Workshop: Introduzione ad TDD

  • 1. METODOLOGIE AGILI Introduzione al workshop sperimentale
  • 2. Fasi dello sviluppo software  Analisi dei requisiti  Progettazione  Codifica  Testing  Rilascio
  • 3. Sviluppare software è complesso Cosa il cliente veramente voleva
  • 6. Limiti del waterfall Tende ad essere rigido e non adattabile
  • 7. Tutto nel software cambia  Requisiti  Progetto  Business  Tecnologia  Team
  • 8. Gestire il cambiamento Il problema non è il cambiamento ma è l'incapacità di gestirlo
  • 10. Obiettivi delle metodologie agili  Soddisfare il cliente per mezzo di tempestivi e continui rilasci di software di valore.  I cambiamenti nelle specifiche sono ben accetti, anche a stadi avanzati di sviluppo.  Ridurre i tempi di realizzazione  Aumentare la produttività  Aumentare la qualità  Del software  Del lavoro
  • 11. Principi fondamentali dell'agile  Lavoro di squadra  Comunicazione  Feedback continuo  Piccoli passi
  • 13. So what?  Molte di queste tecniche sono considerate difficili  Non si insegnano neppure all'università  Richiedono mesi di addestramento  Ecchecistiamo a fare qui?
  • 14. Vogliamo cambiare!  Non sempre quello che tutti pensano è la cosa giusta.  Se non si fanno cambiamenti, non ci si evolve e crederemmo di sapere cose non proprio corrette:
  • 15. Dove vogliamo andare?  Vogliamo esporre programmatori giovani (”puri”?) precocemente a queste tecniche  E’ nostra opinione che questo abbia un effetto positivo sul processo di sviluppo, in particolare sui programmatori  Specialmente, pensiamo sia un’ottimo strumento didattico.
  • 16. Cosa non è  Non è una gara, tipo le Olimpiadi di Informatica  Non deve essere stressante, semmai il contrario  Non è una verifica. Se ci sarà il voto, sarà basato sulla cooperazione dimostrata, non sul codice prodotto.  Non è neppure una lezione autoconclusiva. Applicheremo questa tecnica anche in futuro. ”Practice make perfect”.
  • 17. Come lavoreremo  Oggi proveremo ad applicare alcune tecniche agili tutte in una volta.  Sarete divisi in gruppi di studio, ognuno dei quali lavora separatamente; però, la comunicazione con gli altri gruppi non è vietata (infatti, non è una gara).  Proveremo a costruire una classe Java perfettamente (?) funzionante
  • 18. 1° tecnica: Pair programming ? Se non lo conoscete già...
  • 20. 2° tecnica: Timeboxing  C'è un tempo ben determinato per chiudere un passo dello sviluppo  Finito il tempo, si consegna.  Niente eccezioni!
  • 21. 3° Test Driven Development  Prima si scrive il test  Poi si scrive il codice  Quando va, si migliora il codice
  • 22. TDD – Scrivere il test  Il test va scritto sapendo COSA si vuole ottenere, ma non come.  Lanciare il test: DEVE fallire
  • 23. TDD – Refactoring  Scrivere il codice  Scrivere il MINIMO codice che permette di passare il test  Lanciare il test – se è rosso, rivedere il codice e ripetere
  • 24. TDD – Refactoring  Consiste nel modificare la struttura interna di un codice codice senza modificarne il comportamento esterno  Permette di migliorare – la leggibilità – la riusabilità l'estensibilità – Le prestazioni
  • 25. Argomento: Anno bisestile (WP)  Un anno bisestile è un anno solare in cui avviene la periodica intercalazione di un giorno aggiuntivo nell'anno stesso, un accorgimento utilizzato in quasi tutti i calendari solari (quali quelli giuliano e gregoriano) per evitare lo slittamento delle stagioni: ogni 4 anni accumulerebbero un giorno in più di ritardo. Per correggere questo slittamento, agli anni "normali" di 365 giorni (ogni 4 anni) si intercalano gli anni "bisestili" di 366:
  • 26. TEST DRIVE  Proveremo un TDD con Junit – NON SCRIVERETE I TEST, ma vi limiterete a scrivere diretti dalle indicazioni del test.  Sedetevi alle vostre postazioni  Create un progetto Java Console e chiamatelo JavaBisestile. Creerà una classe chiamata JavaBisestile, all'interno del package javabisestile.
  • 27. Step 1 - Setup  Fate click destro sul file JavaBisestile.java  Scegliete “Tools > Create Tests”  Scegliete Junit 4.x.  Il sistema creerà un file speciale, chiamato JavaBisestileTest.java  Contiene lo scheletro del nostro test. 
  • 28. Step 1 – Test (RED + Green)  Fate Run->Test Project  Il risultato è rosso.  Andate in JavaBisestileTest  Eliminate la riga con throw...  Fate Run->Test Project  Verde!
  • 29. Step 2 – First real test (RED)!  In fondo alla classe JavaBisestileTest, ma prima dell'ultima graffa, aggiungete questo codice (Test1.java): @Test public void testIsBisestile() { assertTrue("2004 deve essere bisestile",JavaBisestile.isBisestile(2004)); assertTrue("2008 deve essere bisestile",JavaBisestile.isBisestile(2008)); assertTrue("2012 deve essere bisestile",JavaBisestile.isBisestile(2012));}  Lanciate il test
  • 30. Step 2 – First real test (RED)!  Click sulla lampadina dell'errore  Scegliete “Create Method isBisestile(int) in javabisestile.JavaBisestile”. static boolean isBisestile(int i) { throw new UnsupportedOperationException("Not supported yet."); }  Lanciate il test (ancora rosso)
  • 31. Step 2 – First real test (GREEN)  Eliminare la riga fail(...)...  Scrivere il codice minimo che renda valido il test  Avete 20 secondi  Lanciate il test: deve essere verde.
  • 32. Step 2 – Controllo  La soluzione corretta è  return true  In tutti gli altri casi avete agito con overcoding.  Ricordate: scrivere il MINIMO codice che fa passare il test.  In questo caso salteremo il refactoring
  • 33. Step 3 - ”Triangulation”  Il test che abbiamo aggiunto non è molto significativo  Come nel caso della navigazione, per fare il punto abbiamo bisogno almento di un altro test, possibilmente che ci dica qualcosa di più.  Per esempio elementi di tipo DIVERSO dal precedente.  In gergo si chiama ”triangolazione”
  • 34. Step 3 – Better test (RED)  Inserite questo nuovo test (test2.java)  @Test public void testNonBisestile() {  assertFalse("2005 non deve essere bisestile",JavaBisestile.isBisestile(2005));  assertFalse("2003 non deve essere bisestile",JavaBisestile.isBisestile(2003));  assertFalse("2002 non deve essere bisestile",JavaBisestile.isBisestile(2002));  assertFalse("2001 non deve essere bisestile",JavaBisestile.isBisestile(2001));  }
  • 35. Step 3 – Better test (GREEN)  Fate in modo che il test passi  Avete 120 secondi  Lanciate il test: il test deve essere verde.
  • 36. Step 3 – Better test (REFACTOR)  Dedicate 130 secondi a migliorare il vostro codice  Commenti? Javadoc?  Nomi di variabili sensati? Indentazione?  Fa schifo? – Usa uno switch? – Peggio, usa 4 if? – Se si è ora di cambiarlo (pensate a un test con 35 valori di anno...il vostro codice diventa elefantiaco)  Dopo la correzione, tutto deve essere verde.
  • 37. Step 4 – Non va ancora bene...  Da Wikipedia:  ”A partire dal 1582 è in funzione il calendario gregoriano, che elimina un anno bisestile all'inizio di ogni secolo, se non è divisibile per 400”  Codifichiamo questo in un altro test. 
  • 38. Step 4 – Second test (RED) @Test  public void testcalendarioGregoriano() {  assertTrue("1000 non deve essere bisestile",JavaBisestile.isBisestile(1000));  assertFalse("1800 non deve essere bisestile",JavaBisestile.isBisestile(1800));  assertFalse("1900 non deve essere bisestile",JavaBisestile.isBisestile(1900));  assertTrue("2000 deve essere bisestile",JavaBisestile.isBisestile(2000));  }
  • 39. Step 4 – Second test (RED)  Finite il test nei tempi che desiderate  Un premio a chi finisce prima con il codice migliore!  File: Test3.java 
  • 40. Fine!  Grazie per l'attenzione  Pronti per l'azione ”vera”? 