Software Testing & Test Driven Development

Post on 11-Jan-2017

325 views 1 download

Transcript of Software Testing & Test Driven Development

Software Testinge

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 C

OM

PLETEZZA

NO C

OM

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

ComponenteComponenteda testareda testare

Dip2 Dip3

Dip1 UserStub1

Stub2 Stub3

TestDriver

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 Mockclass 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 / MockCheck

Predictions

1 * 1 *

1

1

Prophecy

function testWithStub(){ $p = new Prophecy\Prophet();

$builderStub = $p->prophesize('SubscriptionBuilder'); $builderStub->getSubscriptionFrom(Argument::cetera()) ->willReturn(new Subscription());

$stub = $builderStub->reveal();

// ...}

function testWithMock(){ $p = new Prophecy\Prophet();

$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

Partialsolution

Partialsolution

Iterazione TDD

Comprendere, formalizzare il problema.Definire l'API.

Rolvere il problemasenza 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 delproblema

Analisi delsistema

DesignAlto livello

TDDFunctional

TestAcceptance

Test

Problem System Implementation