SlideShare a Scribd company logo
Software Testing
e
Test Driven Development
Cassino, 29 ottobre 2015
Mi presento
Sergio Santoro
Web developer
PHP e Python
In Facile.it da un anno
@taueres
FOSS enthusiast
Contributor di MediaWiki e Pywikibot
Problema
Monitorare l'evoluzione del software ed evitare
carenze di affidabilità e di attinenza ai requisiti.
Soluzioni:
– Ispezioni software (QA)
– Software Testing
Software Testing
Cos'è?
Attività d'indagine per rilevare e prevenire carenze
di affidabilità e correttezza in un sistema software.
Cosa NON è?
Attività che ci consente di dimostrare
l'assenza di errori in un sistema software
NO
COM
PLETEZZA
NO
COM
PLETEZZA
Software Failures
Si ha una failure quando il software espone un
comportamento erroneo.
Il comportamento effettivo è diverso da quello atteso.
Esempio: 5 + 2 = 6
Le failures sono spesso causate da bug
d'implementazione.
Problemi hardware?
PEBKAC?
Obiettivi del software testing
● Rilevare il maggior numero di failures possibili.
● …
Il software testing non si occupa di:
● Individuare e sistemare i bug
● Migliorare il desing
● Formalizzare il problema
Solo?
Testing, perché?
Il testing è un'attività costosa e non dà certezze.
Perché attuarla?
– Meno failures
– Bolder developers
– Refactor più semplice
– Documentazione aggiuntiva per il codice
– Miglior design
– Ispezioni software aggiuntive
– Non riguarda solo i software developers
Modalità d'esecuzione dei test
● Software Testing manuale
Eseguire il programma manualmente e
verificarne il corretto funzionamento.
● Software Testing automatico
Esercitare il software mediante l'uso di altri
programmi. Valutare automaticamente la sua
correttezza.
Software Testing manuale
Esempi: acceptance test, beta test.
Vantaggi:
– Test molto efficaci con l'utente finale;
– Riproducono le effettive condizioni d'esercizio.
Svantaggi:
– Attività molto lenta e costosa;
– Errori lato utente;
– Solo per software già funzionante e completo.
Software Testing automatico
Vantaggi:
– Test più veloci;
– Test eseguibili continuamente;
– Test più formali;
– Applicabile in qualsiasi stadio di sviluppo;
– Code coverage.
Svantaggi:
– Ulteriore codice da produrre e manutenere;
– Simulazione ambiente di produzione;
– Solo per gli addetti ai lavori.
Tipologie Testing automatico
Testing funzionale (End-to-end)
Esercitare il sistema nella sua interezza.
Testing d'integrazione
Testare l'interazione tra componenti
Testing d'unità
Esercitare una singola componente
Esempio
Testing d'unità
Esercitare una singola componente in un
ambiente “ideale” per verificare il suo corretto
funzionamento.
Vantaggi:
– Bug ben localizzati.
– I risultati non sono influenzati da altre componenti.
– Test molto veloci e semplici.
Strumenti per il Testing d'unità
Testing-frameworks xUnit.
Ogni linguaggio ha la sua implementazione:
– Java, JUnit
– Python, PyUnit
– PHP, PHPUnit
ComponenteComponente
da testareda testare
Dip2 Dip3
Dip1 UserStub1
Stub2 Stub3
Test
Driver
Test driver
Esercitare la componente under-test e verificare
la correttezza dell'output.
Responsabilità:
– Definire le condizioni d'ingresso
– Definire l'oracolo
– Esercitare la componente
– Confrontare i risultati con l'oracolo
Test driver
Si realizza mediante la scrittura di uno o più
test cases
class ArrayUtilsTest extends PHPUnit_Framework_TestCase
{
public function testSumArray()
{
$inputArray = [1, 2, 3];
$expected = 6;
$arrayUtils = new ArrayUtils();
$actual = $arrayUtils->sumArray($inputArray);
$this->assertEquals($expected, $actual);
}
}
Stub e Mock
Rimpiazzare le componenti reali con
implementazioni fittizie.
Stub: Simula il comportamento della
componente reale.
Mock: Stub + expectations.
Esempio
Esempio Stub
class SubscriptionBuilderStub extends SubscriptionBuilder
{
public function __construct() {}
// Overrides
public function getSubscriptionFrom(Category $c, User $user)
{
return new Subscription();
}
}
Esempio Mock
class SubscriptionBuilderMock extends SubscriptionBuilder
{
public $userArg;
public function __construct() {}
// Overrides
public function getSubscriptionFrom(Category $c, User $user)
{
$this->userArg = $user;
return new Subscription();
}
public function checkExpectations($expectedUser)
{
return $this->userArg === $expectedUser;
}
}
Prophecy
Libreria inclusa in PHPUnit che semplifica
l'implementazione di Stub e Mock
Prophet Object Prophecy Method Prophecy
Stub / Mock
Check
Predictions
1 * 1 *
1
1
Prophecy
function testWithStub()
{
$p = new ProphecyProphet();
$builderStub = $p->prophesize('SubscriptionBuilder');
$builderStub->getSubscriptionFrom(Argument::cetera())
->willReturn(new Subscription());
$stub = $builderStub->reveal();
// ...
}
function testWithMock()
{
$p = new ProphecyProphet();
$user = new User();
$builderMock = $p->prophesize('SubscriptionBuilder');
$builderMock->getSubscriptionFrom(Argument::any(), $user)
->shouldBeCalledTimes(1)
->willReturn(new Subscription());
$mock = $builderMock->reveal();
// ...
$p->checkPredictions();
}
Prophecy
Test Driven Development
Cos'è?
È una metodologia per lo sviluppo software con
approccio Test-first.
I test occupano una posizione predominante.
“Come usare una componente?”
Solo testing d'unità.
Normal flow
Design
Implement
Test
TDD flow
Design
Test
Implement
Principi del TDD
● Si può aggiungere una nuova funzionalità solo
quando c'è un test corrispondente che fallisce.
● Si può riparare un bug solo quando esso viene
esercitato da un test che sta fallendo.
● Il Refactoring è l'unica operazione concessa con
test verdi.
Green
- New features
- Bug fixing
- Refactoring
Red
Test Driven Development
L'attività di sviluppo viene suddivisa in
molte piccole iterazioni.
Ogni iterazione è indipendente dalle altre.
Problem Solution
Partial
solution
Partial
solution
Iterazione TDD
Comprendere,
formalizzare il problema.
Definire l'API.
Rolvere il problema
senza preoccuparsi
del design.Migliorare la
qualità del codice
senza aggiungere
nuove
funzionalità.
Iterazione TDD
Quanto devono essere ampie le iterazioni?
Molto soggettivo:
– Comprensione del problema
– Comprensione del sistema
– Boldness
Generalmente durano una manciata di minuti.
Iterazione TDD
Quante iterazioni?
Almeno una iterazione per ogni caso d'uso della
componente.
Esempio:
+ * + = +
- * + = -
- * - = +
3 casi d'uso -> 3 iterazioni
Esempio iterazioni TDD
Problema: somma tra diverse valute.
1 € + 1 $ = ?
It. 1: somma con un solo addendo
It. 2: somma di addendi con la stessa valuta
It. 3: somma di addendi con valuta differente
Vantaggi TDD
● Forte comprensione del problema
● Continuo feedback, più boldness
● Risolvere il problema ≠ Design
● Be the user of your code!
● Divide et impera
TDD nel ciclo di sviluppo
Analisi del
problema
Analisi del
sistema
Design
Alto livello
TDD
Functional
Test
Acceptance
Test
Problem System Implementation

More Related Content

What's hot (20)

PPTX
Unit test
Roberto Cappelletti
 
PPTX
Unit testing 2014
Giacomo Petronio
 
ODP
Unit testing 101
Daniel Londero
 
PDF
Come rilasciare App di Qualità
Luca Manara
 
PDF
Test e scrum un caso reale v3.2
Ivan Fioravanti
 
PPTX
Alm pills - Sessione community tour Dot Net Umbria 2011
Gian Maria Ricci
 
PDF
TMap: una metodologia di test business driven
Codemotion
 
PPTX
TPi: una metodologia per il miglioramento del processo di test, by Andrea Di ...
Codemotion
 
DOCX
Sinossi
Stefano Tollot
 
PPTX
Unit Testing
Andrea Tosato
 
PDF
Android Test Driven Development
sazilla
 
PPTX
Codice di qualità con VS2010 (TDD)
XeDotNet
 
PDF
Lezione 1: I metodi agili
Andrea Della Corte
 
PDF
TDD patterns and TDD strategies
Alessandro Ceseno
 
PPTX
Continuous integration per sviluppatori mobile
Antonio Liccardi
 
PPTX
Automated UI testing for iOs and Android mobile apps
Massimo Bonanni
 
PPTX
Xamarin Test Cloud
Massimo Bonanni
 
PPTX
Il dilemma del test: Manuale o Automatico?
Microfocusitalia
 
PDF
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
Nicola Paoletti
 
PPTX
AgileIoT, agile meets IoT - MEC 2016
Felice Pescatore
 
Unit testing 2014
Giacomo Petronio
 
Unit testing 101
Daniel Londero
 
Come rilasciare App di Qualità
Luca Manara
 
Test e scrum un caso reale v3.2
Ivan Fioravanti
 
Alm pills - Sessione community tour Dot Net Umbria 2011
Gian Maria Ricci
 
TMap: una metodologia di test business driven
Codemotion
 
TPi: una metodologia per il miglioramento del processo di test, by Andrea Di ...
Codemotion
 
Unit Testing
Andrea Tosato
 
Android Test Driven Development
sazilla
 
Codice di qualità con VS2010 (TDD)
XeDotNet
 
Lezione 1: I metodi agili
Andrea Della Corte
 
TDD patterns and TDD strategies
Alessandro Ceseno
 
Continuous integration per sviluppatori mobile
Antonio Liccardi
 
Automated UI testing for iOs and Android mobile apps
Massimo Bonanni
 
Xamarin Test Cloud
Massimo Bonanni
 
Il dilemma del test: Manuale o Automatico?
Microfocusitalia
 
Benchmarking - Architettura degli Elaboratori - AA 2010/2011 - UNICAM
Nicola Paoletti
 
AgileIoT, agile meets IoT - MEC 2016
Felice Pescatore
 

Viewers also liked (20)

PPTX
Mocking
Emanuele DelBono
 
PPTX
Test driven development v1.0
Ganesh Kondal
 
PDF
Da programmatore a CEO
Emanuele DelBono
 
PDF
Software testing
IxmaSoft
 
PPTX
Introduzione al Testing
DotNetMarche
 
PPT
Introduzione al Test Driven Development
Ennio Masi
 
PDF
attestato_fastweb
Ilaria Bogazzi
 
PDF
Telecom Italia - Bilancio di sostenibilita' 2011
Gruppo TIM
 
PPT
Project enel ed-f_jv_nucleare
roberto giubila
 
PPTX
Smau Firenze 2015 - Telecom Italia Digital Solutions
SMAU
 
PDF
Telecom Italia
Riccardo Mastellone
 
PDF
Unit Testing
Giacomo Petronio
 
PPTX
Smau Padova 2015 - Telecom Italia Digital Solutions
SMAU
 
PDF
Mario di Mauro - DEMO DAY - TIM #Wcap Accelerator
Gruppo TIM
 
PDF
Rapporto-Finale-2015_Osservatorio-Corporate-Governance-TEH-A
HULT International Business School
 
PDF
Report di corporate governance e relazione sulla remunerazione di Telecom Ita...
Gruppo TIM
 
PDF
Teorie e tecniche dei test
Olaudio Bia
 
PPTX
2013 06 19_report_tim
CarlottaVentura
 
PDF
Relazione finanziaria annuale Telecom Italia 2013
Gruppo TIM
 
PPTX
Beacons in Context
Rex St. John
 
Test driven development v1.0
Ganesh Kondal
 
Da programmatore a CEO
Emanuele DelBono
 
Software testing
IxmaSoft
 
Introduzione al Testing
DotNetMarche
 
Introduzione al Test Driven Development
Ennio Masi
 
attestato_fastweb
Ilaria Bogazzi
 
Telecom Italia - Bilancio di sostenibilita' 2011
Gruppo TIM
 
Project enel ed-f_jv_nucleare
roberto giubila
 
Smau Firenze 2015 - Telecom Italia Digital Solutions
SMAU
 
Telecom Italia
Riccardo Mastellone
 
Unit Testing
Giacomo Petronio
 
Smau Padova 2015 - Telecom Italia Digital Solutions
SMAU
 
Mario di Mauro - DEMO DAY - TIM #Wcap Accelerator
Gruppo TIM
 
Rapporto-Finale-2015_Osservatorio-Corporate-Governance-TEH-A
HULT International Business School
 
Report di corporate governance e relazione sulla remunerazione di Telecom Ita...
Gruppo TIM
 
Teorie e tecniche dei test
Olaudio Bia
 
2013 06 19_report_tim
CarlottaVentura
 
Relazione finanziaria annuale Telecom Italia 2013
Gruppo TIM
 
Beacons in Context
Rex St. John
 
Ad

Similar to Software Testing & Test Driven Development (20)

PDF
Java Unit Testing - Introduction
fgianneschi
 
PDF
Una fugace occhiata al Test Driven Development (2006)
Roberto Bettazzoni
 
PDF
Presentazione Testing automatizzato
angelolu
 
PPTX
Test Driven Development @ Xe.Net
Mauro Servienti
 
ODP
Testing
Domenico Briganti
 
ODP
Mocking Objects Practices
GrUSP
 
ODP
TDD - una introduzione
Roberto Franchini
 
KEY
TDD Test Driven Development
Tassi Francesco
 
PPTX
Unit Test di Gabriele Seroni
Giuneco S.r.l
 
PDF
Test istruzioni per l'uso
silvio Troia
 
PPTX
Test double - un'introduzione (PHP)
Carmelantonio Zolfo
 
ODP
Consigli per iniziare tdd
Tassoman ☺
 
PDF
TDD in WordPress
lucatume
 
PDF
Lezione 3: Sviluppo in Extreme Programming
Andrea Della Corte
 
PPT
dalTDDalBDD
cpattarello
 
PDF
Redefining the Role of the Test Engineer: The Path to a New Era | DevFest Mil...
Ludovico Besana
 
PDF
Test Driven Development for iOS
Alessandro Ceseno
 
PDF
Il testing con zend framework
Zend by Rogue Wave Software
 
PDF
Il testing con zend framework
Zend by Rogue Wave Software
 
Java Unit Testing - Introduction
fgianneschi
 
Una fugace occhiata al Test Driven Development (2006)
Roberto Bettazzoni
 
Presentazione Testing automatizzato
angelolu
 
Test Driven Development @ Xe.Net
Mauro Servienti
 
Mocking Objects Practices
GrUSP
 
TDD - una introduzione
Roberto Franchini
 
TDD Test Driven Development
Tassi Francesco
 
Unit Test di Gabriele Seroni
Giuneco S.r.l
 
Test istruzioni per l'uso
silvio Troia
 
Test double - un'introduzione (PHP)
Carmelantonio Zolfo
 
Consigli per iniziare tdd
Tassoman ☺
 
TDD in WordPress
lucatume
 
Lezione 3: Sviluppo in Extreme Programming
Andrea Della Corte
 
dalTDDalBDD
cpattarello
 
Redefining the Role of the Test Engineer: The Path to a New Era | DevFest Mil...
Ludovico Besana
 
Test Driven Development for iOS
Alessandro Ceseno
 
Il testing con zend framework
Zend by Rogue Wave Software
 
Il testing con zend framework
Zend by Rogue Wave Software
 
Ad

Software Testing & Test Driven Development

  • 1. Software Testing e Test Driven Development Cassino, 29 ottobre 2015
  • 2. Mi presento Sergio Santoro Web developer PHP e Python In Facile.it da un anno @taueres FOSS enthusiast Contributor di MediaWiki e Pywikibot
  • 3. Problema Monitorare l'evoluzione del software ed evitare carenze di affidabilità e di attinenza ai requisiti. Soluzioni: – Ispezioni software (QA) – Software Testing
  • 4. Software Testing Cos'è? Attività d'indagine per rilevare e prevenire carenze di affidabilità e correttezza in un sistema software. Cosa NON è? Attività che ci consente di dimostrare l'assenza di errori in un sistema software NO COM PLETEZZA NO COM PLETEZZA
  • 5. Software Failures Si ha una failure quando il software espone un comportamento erroneo. Il comportamento effettivo è diverso da quello atteso. Esempio: 5 + 2 = 6 Le failures sono spesso causate da bug d'implementazione. Problemi hardware? PEBKAC?
  • 6. Obiettivi del software testing ● Rilevare il maggior numero di failures possibili. ● … Il software testing non si occupa di: ● Individuare e sistemare i bug ● Migliorare il desing ● Formalizzare il problema Solo?
  • 7. Testing, perché? Il testing è un'attività costosa e non dà certezze. Perché attuarla? – Meno failures – Bolder developers – Refactor più semplice – Documentazione aggiuntiva per il codice – Miglior design – Ispezioni software aggiuntive – Non riguarda solo i software developers
  • 8. Modalità d'esecuzione dei test ● Software Testing manuale Eseguire il programma manualmente e verificarne il corretto funzionamento. ● Software Testing automatico Esercitare il software mediante l'uso di altri programmi. Valutare automaticamente la sua correttezza.
  • 9. Software Testing manuale Esempi: acceptance test, beta test. Vantaggi: – Test molto efficaci con l'utente finale; – Riproducono le effettive condizioni d'esercizio. Svantaggi: – Attività molto lenta e costosa; – Errori lato utente; – Solo per software già funzionante e completo.
  • 10. Software Testing automatico Vantaggi: – Test più veloci; – Test eseguibili continuamente; – Test più formali; – Applicabile in qualsiasi stadio di sviluppo; – Code coverage. Svantaggi: – Ulteriore codice da produrre e manutenere; – Simulazione ambiente di produzione; – Solo per gli addetti ai lavori.
  • 11. Tipologie Testing automatico Testing funzionale (End-to-end) Esercitare il sistema nella sua interezza. Testing d'integrazione Testare l'interazione tra componenti Testing d'unità Esercitare una singola componente
  • 13. Testing d'unità Esercitare una singola componente in un ambiente “ideale” per verificare il suo corretto funzionamento. Vantaggi: – Bug ben localizzati. – I risultati non sono influenzati da altre componenti. – Test molto veloci e semplici.
  • 14. Strumenti per il Testing d'unità Testing-frameworks xUnit. Ogni linguaggio ha la sua implementazione: – Java, JUnit – Python, PyUnit – PHP, PHPUnit
  • 15. ComponenteComponente da testareda testare Dip2 Dip3 Dip1 UserStub1 Stub2 Stub3 Test Driver
  • 16. Test driver Esercitare la componente under-test e verificare la correttezza dell'output. Responsabilità: – Definire le condizioni d'ingresso – Definire l'oracolo – Esercitare la componente – Confrontare i risultati con l'oracolo
  • 17. Test driver Si realizza mediante la scrittura di uno o più test cases class ArrayUtilsTest extends PHPUnit_Framework_TestCase { public function testSumArray() { $inputArray = [1, 2, 3]; $expected = 6; $arrayUtils = new ArrayUtils(); $actual = $arrayUtils->sumArray($inputArray); $this->assertEquals($expected, $actual); } }
  • 18. Stub e Mock Rimpiazzare le componenti reali con implementazioni fittizie. Stub: Simula il comportamento della componente reale. Mock: Stub + expectations.
  • 20. Esempio Stub class SubscriptionBuilderStub extends SubscriptionBuilder { public function __construct() {} // Overrides public function getSubscriptionFrom(Category $c, User $user) { return new Subscription(); } }
  • 21. Esempio Mock class SubscriptionBuilderMock extends SubscriptionBuilder { public $userArg; public function __construct() {} // Overrides public function getSubscriptionFrom(Category $c, User $user) { $this->userArg = $user; return new Subscription(); } public function checkExpectations($expectedUser) { return $this->userArg === $expectedUser; } }
  • 22. Prophecy Libreria inclusa in PHPUnit che semplifica l'implementazione di Stub e Mock Prophet Object Prophecy Method Prophecy Stub / Mock Check Predictions 1 * 1 * 1 1
  • 23. Prophecy function testWithStub() { $p = new ProphecyProphet(); $builderStub = $p->prophesize('SubscriptionBuilder'); $builderStub->getSubscriptionFrom(Argument::cetera()) ->willReturn(new Subscription()); $stub = $builderStub->reveal(); // ... }
  • 24. function testWithMock() { $p = new ProphecyProphet(); $user = new User(); $builderMock = $p->prophesize('SubscriptionBuilder'); $builderMock->getSubscriptionFrom(Argument::any(), $user) ->shouldBeCalledTimes(1) ->willReturn(new Subscription()); $mock = $builderMock->reveal(); // ... $p->checkPredictions(); } Prophecy
  • 25. Test Driven Development Cos'è? È una metodologia per lo sviluppo software con approccio Test-first. I test occupano una posizione predominante. “Come usare una componente?” Solo testing d'unità.
  • 28. Principi del TDD ● Si può aggiungere una nuova funzionalità solo quando c'è un test corrispondente che fallisce. ● Si può riparare un bug solo quando esso viene esercitato da un test che sta fallendo. ● Il Refactoring è l'unica operazione concessa con test verdi. Green - New features - Bug fixing - Refactoring Red
  • 29. Test Driven Development L'attività di sviluppo viene suddivisa in molte piccole iterazioni. Ogni iterazione è indipendente dalle altre. Problem Solution Partial solution Partial solution
  • 30. Iterazione TDD Comprendere, formalizzare il problema. Definire l'API. Rolvere il problema senza preoccuparsi del design.Migliorare la qualità del codice senza aggiungere nuove funzionalità.
  • 31. Iterazione TDD Quanto devono essere ampie le iterazioni? Molto soggettivo: – Comprensione del problema – Comprensione del sistema – Boldness Generalmente durano una manciata di minuti.
  • 32. Iterazione TDD Quante iterazioni? Almeno una iterazione per ogni caso d'uso della componente. Esempio: + * + = + - * + = - - * - = + 3 casi d'uso -> 3 iterazioni
  • 33. Esempio iterazioni TDD Problema: somma tra diverse valute. 1 € + 1 $ = ? It. 1: somma con un solo addendo It. 2: somma di addendi con la stessa valuta It. 3: somma di addendi con valuta differente
  • 34. Vantaggi TDD ● Forte comprensione del problema ● Continuo feedback, più boldness ● Risolvere il problema ≠ Design ● Be the user of your code! ● Divide et impera
  • 35. TDD nel ciclo di sviluppo Analisi del problema Analisi del sistema Design Alto livello TDD Functional Test Acceptance Test Problem System Implementation