BigThink

TDD con java: Fibonacci

Un paio di post fa ho parlato di Test Driven Development, sviluppare software scrivendo prima i test e poi il codice. Vi consiglio di leggerlo, prima di dedicarvi a questo.

Quest’oggi vi riporto un esempio per chiarirvi meglio le idee, tratto dal libro Test Driven Development by Example di Kent Beck: scriviamo un metodo che calcoli l’ennesimo numero della serie di Fibonacci.

Ovviamente iniziamo dai test.

Per prima cosa dobbiamo verificare che fib(0) = 0. Il primo test sarà quindi:

public void testFibonacci() {
    assertEquals(0, fib(0));
}

Scriviamo allora il minimo codice per far passare il test:

int fib(int n) {
    return 0;
}

Semplice, no? Proseguiamo aggiungendo il test successivo, fib(1) = 1:

public void testFibonacci() {
    assertEquals(0, fib(0));
    assertEquals(1, fib(1));
}

Il secondo test lo abbiamo inserito nello stesso metodo, inutile creare un test per ogni asserzione.
Facciamo ora in modo che anche questo test passi, modificando il metodo fib:

int fib(int n) {
    if (n == 0) return 0;
    return 1;
}

Ora, se continuiamo all’infinito ad aggiungere casi su casi al nostro test, il codice diventerà sempre più lungo e illeggibile. Decidiamo di parametrizzare il tutto, utilizzando un array che contenga l’input e l’output atteso. Per verificare anche il prossimo caso, ovvero fib(2) = 1, possiamo modificare il test in questo modo:

public void testFibonacci() {
    int cases[][]= {{0,0},{1,1},{2,1}};
    for (int i= 0; i < cases.length; i++)
        assertEquals(cases[i][1], fib(cases[i][0]));
}

Cosa succede? Il test passa!! Si, perchè fib ritorna 1, che in questo caso è corretto.
Non dobbiamo modificare nulla. Prossimo test allora:

public void testFibonacci() {
    int cases[][]= {{0,0},{1,1},{2,1},{3,2}};
    for (int i= 0; i < cases.length; i++)
        assertEquals(cases[i][1], fib(cases[i][0]));
}

Ok, stavolta fallisce. Come prima, possiamo andare avanti a scrivere:

int fib(int n) {
    if (n == 0) return 0;
    if (n <= 2) return 1;
    return 2;
}

Ma ora siamo pronti per generalizzare. In realtà 2 è possibile scriverlo come 1 + 1.

int fib(int n) {
    if (n == 0) return 0;
    if (n <= 2) return 1;
    return 1 + 1;
}

Ma il primo 1 in realtà sarebbe fib(n-1), mentre il secondo 1 è fib(n-2):

int fib(int n) {
    if (n == 0) return 0;
    if (n <= 2) return 1;
    return fib(n-1) + fib(n-2);
}

La stessa struttura funziona per fib(2) e successivi, quindi possiamo fare l’ultima modifica:

int fib(int n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    return fib(n-1) + fib(n-2);
}

Ed ecco il nostro Fibonacci, interamente derivato dai test!

Articolo scritto da Ghido

Fondatore di BigThink.it, si occupa dello sviluppo e del coordinamento dei progetti tecnologici. Specializzato nel Marketing su Facebook e nello sviluppo di Applicazioni Social, fa consulenza e formazione ad aziende ed agenzie.

Leggi anche...

Test Driven Development: prima i test, poi il codice

Test Driven Development: prima i test, poi il codice

Un metodo non tradizionale e agile per lo sviluppo e il design del software è il Test Driven Development (TDD): sviluppo guidato dai test. E' un'alternativa al solito metodo a cascata (waterfall), secondo il quale, dopo un'adeguata analisi e progettazione, si inizia a scrivere il codice e solo alla fine si passa al ...
Java: parsing di una pagina HTML

Java: parsing di una pagina HTML

Nella nostra carriera di programmatori, potrà capitarci di dover effettuare la lettura di dati da una pagina web: magari dobbiamo implementare uno spider per la ricerca di determinati link in una pagina, piuttosto che per raccogliere email o qualsiasi altra cosa che ci può essere utile estrapolare da una pagina HTML, in modo ...
PasteQuestion.com: aiuto gratis dagli esperti di programmazione

PasteQuestion.com: aiuto gratis dagli esperti di programmazione

Quante volte vi siete trovati in difficoltà, programmando un'applicazione o un sito web, e siete andati alla disperata ricerca della soluzione su Google? Quante volte vi siete fiondati sui forum di programmazione, sperando in un aiuto dai più esperti? Quante volte siete approdati su BigThink, chiedendomi aiuto per sistemare il vostro template o plugin WordPress ...

Lascia un commento

2 Citazioni