Abbiamo sperimentato BDD sul campo e c’è piaciuto parecchio, per motivi del tutto inaspettati. Spesso il fallimento dei progetti è dato da questioni umane, di comprensione, di comunicazione, non da difficoltà tecniche. Capire cosa si deve fare e quando non è così semplice come sembra. Seguendo il Behaviour Driven Development abbiamo migliorato la comunicazione tra di noi, aumentato la comprensione del dominio e messo a fuoco le priorità. Il talk racconta la nostra esperienza diretta.
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
BDD tutta questione di comunicazione
1. MILAN november 28th/29th 2014
Riccardo Franconi e Francesco Tassi
!
BDD Tutta questione di comunicazione
Raccontiamo il BDD in un progetto reale
rf@ideato.it ftassi@ideato.it - ideato
5. MILAN november 28th/29th 2014
“behavior-driven development (abbreviato in
BDD e traducibile in Sviluppo guidato dal
comportamento) è una metodologia di sviluppo
del software basata sul test-driven development
(TDD)”
– Wikipedia
6. MILAN november 28th/29th 2014
“Non basta scrivere software correttamente,
bisogna anche scrivere il software corretto”
– “BDD in Action” John Ferguson Smart
7. MILAN november 28th/29th 2014
BDD in breve
• Esempi non test
• Linguaggio condiviso
• Business Value
10. MILAN november 28th/29th 2014
Esempi non test
Scenario: Somma
Dato che inserisco due numeri
Allora Ottengo la loro somma
public function
testOperazioneSommaDovrebbeSommareDueNumeri()
{
//...
}
23. MILAN november 28th/29th 2014
Come Discussione
Obiettivo FFeFeaeatuaturteuresress
Specifiche
Eseguibili
Specifiche
Eseguibili
EEsseemmppi i Specifiche
Esempi
Eseguibili
31. MILAN november 28th/29th 2014
Specifiche eseguibili
Scenario: Prenotazione con email non valida!
Dato che un giocatore ha scelto di prenotare un campo per "domani"!
Quando completa la prenotazione con una mail non valida!
Allora visualizza che deve inserire una mail valida!
!!
/**!
* @Given /^che un ospite ha scelto di prenotare un campo per "domani"$/!
*/!
public function haSceltoDiPrenotarePerIl($bookingDate = null){…}
33. MILAN november 28th/29th 2014
Obiettivo
Per avere un vantaggio competitivo rispetto ai miei
concorrenti
Voglio avere un sistema di prenotazione online
Che permetta ai miei clienti di prenotare da computer o
smartphone
34. MILAN november 28th/29th 2014
Features
Feature: Prenotazione campo
Per rendere più semplice e aumentare il
numero delle prenotazioni ricevute
Come giocatore
Voglio poter prenotare online un campo
35. MILAN november 28th/29th 2014
Esempi
Scenario: Visualizzazione dei campi
disponibili
Scenario: Prenotazione di un campo
Scenario: Mail di conferma della
prenotazione
Scenario: Prenotazione ricorrente
....
36. MILAN november 28th/29th 2014
Esempi
Scenario: Visualizzazione dei campi disponibili!
Quando l'utente autenticato visita la pagina dei campi!
Allora può vedere i campi divisi per sport
37. MILAN november 28th/29th 2014
Esempi
Autenticato!?!
Scenario: Visualizzazione dei campi disponibili!
Quando l'utente autenticato visita la pagina dei campi!
Allora può vedere i campi divisi per sport
38. MILAN november 28th/29th 2014
Esempi
-Q: “Ma l’utente quindi è un utente
registrato?”
Scenario: Visualizzazione dei campi disponibili!
- A: “Si”
- Q: “Perché?”
- A: “Perché così lo posso rintracciare”
- Q: “Ma, non basta il numero di telefono?”
Quando l'utente autenticato visita la pagina dei campi!
Allora può vedere i campi divisi per sport
-A: “Beh, si” Autenticato!?!
39. MILAN november 28th/29th 2014
Esempi
Scenario: Visualizzazione dei campi disponibili!
Quando l'utente autenticato il giocatore visita la
pagina dei campi!
Allora può vedere i campi divisi per sport
40. MILAN november 28th/29th 2014
Esempi
Scenario: Visualizzazione dei campi disponibili!
Quando il giocatore visita la pagina dei campi!
Allora può vedere i campi divisi per sport
—- spreco
41. MILAN november 28th/29th 2014
Esempi
Scenario: Prenotazione ricorrente!
Quando l’admin sceglie un campo!
E seleziona il prossimo martedì!
E seleziona la data di fine ripetizione tra 4 martedì!
E la ripetizione "settimanale"!
E completa la prenotazione!
Allora ha prenotato quel campo per i prossimi 4 martedì
42. MILAN november 28th/29th 2014
Esempi
Scenario: Prenotazione ricorrente!
Quando l’admin sceglie un campo!
E seleziona il prossimo martedì!
E seleziona la data di fine ripetizione tra 4 martedì!
E la ripetizione "settimanale"!
E completa la prenotazione!
Allora ha prenotato quel campo per i prossimi 4 martedì
se non è disponibile!?!
43. MILAN november 28th/29th 2014
Esempi
- Q: “cosa succede?”
- A: “Salviamo solo le valide”
- Q: “E delle altre come tieni traccia?”
- A: “Inviami un elenco di quelle
Scenario: Prenotazione ricorrente!
l’admin sovrapposte”
Quando sceglie un campo!
E seleziona il prossimo martedì!
E seleziona la data di fine ripetizione tra 4 martedì!
E la ripetizione "settimanale"!
E completa la prenotazione!
Allora ha prenotato quel disponibile!?!
campo per i prossimi 4 martedì non è se
44. MILAN november 28th/29th 2014
Esempi
Scenario: Prenotazione ricorrente sovrapposta!
Dato che il giocatore ha completato una
prenotazione!
Quando l'admin crea una prenotazione ricorrente
che si sovrappone a quella esistente!
Allora ha prenotato quel campo solo per le
giornate disponibili!
E riceve un riepilogo delle prenotazioni
sovrapposte
45. MILAN november 28th/29th 2014
Esempi
++ conoscenza del dominio
Scenario: Prenotazione ricorrente sovrapposta!
Dato che il giocatore ha completato una
prenotazione!
Quando l'admin crea una prenotazione ricorrente
che si sovrappone a quella esistente!
Allora ha prenotato quel campo solo per le
giornate disponibili!
E riceve un riepilogo delle prenotazioni
sovrapposte
46. MILAN november 28th/29th 2014
Specifiche eseguibili
Scenari espressivi - Outside in - Page Object pattern
47. MILAN november 28th/29th 2014
Scenari espressivi
Scenario: Prenotazione!
Quando un giocatore visita la pagina dei campi!
E ne sceglie uno!
E seleziona il giorno dalla select "booking_day"!
E seleziona il mese dalla select "booking_month"!
E seleziona l'anno dalla select "booking_year"!
...
48. MILAN november 28th/29th 2014
Scenari espressivi
Scenario: Prenotazione!
Quando un giocatore visita la pagina dei campi!
E ne sceglie uno!
E seleziona il giorno dalla select "booking_day"!
E seleziona il mese dalla select "booking_month"!
E seleziona l'anno dalla select "booking_year"!
...
49. MILAN november 28th/29th 2014
Scenari espressivi
Scenario: Prenotazione!
Quando un giocatore visita la pagina dei campi!
E ne sceglie uno!
E seleziona la data!
...
50. MILAN november 28th/29th 2014
Scenari espressivi
Scenario: Prenotazione con email non valida!
!
Quando un giocatore visita la pagina dei campi!
E ne sceglie uno!
E seleziona la data!
E completa la prenotazione con una mail non valida!
Allora visualizza che deve inserire una mail valida
51. MILAN november 28th/29th 2014
Scenari espressivi
Scenario: Prenotazione con email non valida!
!
Quando un giocatore visita la pagina dei campi!
E ne sceglie uno!
E seleziona la data!
E completa la prenotazione con una mail non valida!
Allora visualizza che deve inserire una mail valida
52. MILAN november 28th/29th 2014
Scenari espressivi
Background:!
Quando un giocatore visita la pagina dei campi!
E ne sceglie uno!
E seleziona la data!
!
Scenario: Prenotazione con email non valida!
E completa la prenotazione con una mail non valida!
Allora visualizza che deve inserire una mail valida
53. MILAN november 28th/29th 2014
Codice espressivo
/**!
* @Given /^completa la prenotazione con una mail non valida$/!
*/!
public function completaLaPrenotazioneConUnaMailNonValida()!
{!!
$page = $this->mink->getSession()->getPage();!
!
! $this->player = $this->createPlayer();!
! $this->player->email = 'fooinvalidemail';!
! $page->fillField('firstName', $this->player->firstName);!
! $page->fillField('lastName', $this->player->lastName);!
! $page->fillField('email', $this->player->email);!
! $page->fillField('phone', $this->player->phoneNumber);!
!
! $page->pressButton('book');!
}
54. MILAN november 28th/29th 2014
Codice espressivo
/**!
* @Given /^completa la prenotazione con una mail non valida$/!
*/!
public function completaLaPrenotazioneConUnaMailNonValida()!
{!!
$page = $this->mink->getSession()->getPage();!
!
! $this->player = $this->createPlayer();!
! $this->player->email = 'fooinvalidemail';!
! $page->fillField('firstName', $this->player->firstName);!
! $page->fillField('lastName', $this->player->lastName);!
! $page->fillField('email', $this->player->email);!
! $page->fillField('phone', $this->player->phoneNumber);!
!
! $page->pressButton('book');!
}
55. MILAN november 28th/29th 2014
Codice espressivo
/**!
* @Given /^completa la prenotazione con una mail non valida$/!
*/!
public function completaLaPrenotazioneConUnaMailNonValida()!
{!!
$bookingPage = $this->getBookingPage();!
!
! $this->player = $this->createPlayer();!
! $this->player->email = 'fooinvalidemail';!
! $this->bookingPage->book($this->player);!
}
56. MILAN november 28th/29th 2014
class BookingPage !
{!
! public function book($player)!
! {!
! ! $this->page->fillField('firstName', $player->firstName);!
! $this->page->fillField('lastName', $player->lastName);!
! $this->page->fillField('email', $player->email);!
! $this->page->fillField('phone', $player->phoneNumber);!
!
! $this->page->pressButton('book');!
}!
}
Codice espressivo
57. MILAN november 28th/29th 2014
Outside in
1
2
3
5 4
phpspec
Behat
6
1 - Discussione di uno scenario
2 - Step rosso
3 - Spec rossa
4 - Implementazione
7
5 - Refactoring
6 - Step verde
7 - Refactoring
74. MILAN november 28th/29th 2014
Risorse
• http://www.ideato.it/tag/bdd!
• Bdd in Action: Behavior-driven Development for the Whole Software Lifecycle di John
Ferguson Smart!
• Specification by Example: How Successful Teams Deliver the Right Software di Gojko
Adzic!
• The RSpec Book: Behaviour Driven Development di Dave Astels, Bryan Helmkamp, Dan
North, Zac David Chelimsky