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:
assertEquals(0, fib(0));
}
Scriviamo allora il minimo codice per far passare il test:
return 0;
}
Semplice, no? Proseguiamo aggiungendo il test successivo, fib(1) = 1:
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:
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:
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:
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:
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.
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):
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:
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!




Lascia un commento