Questo è in sintesi il metodo TDD:
- Scrivi un test
- controlla se il test fallisce
- scrivi il codice di produzione
- esegui test
Penso che il TDD come presentato funzioni solo in circostanze ideali. Prenderò un semplice esempio:
Specification : Scrivi un programma che calcola la radice quadrata di un numero, l'utente deve inserire un numero. Se il numero è negativo, il programma dovrebbe visualizzare un errore e se il numero è positivo o zero il programma dovrebbe visualizzare il numero di cui è inserito il numero o il numero decimale il cui quadrato è il più vicino al numero inserito.
Scrittura test
class SquareRootTest {
private SquareRoot squareRoot;
public void testNegativeNumber() {
assertException(squareRoot.execute(-5);
}
public void testIntegerSquareRoot() {
assertEqual(squareRoot.execute(9),3);
}
public void testDecimalSquareRoot() {
assertEqual(squareRoot.execute(3),1.732);
}
}
avvia test non riuscito
scrittura del codice di produzione:
class SquareRoot {
public double execute(Number number) {
if(number < 0)
throw exception;
if(number < 1)
return squareRootLessThanOne(number);
else
return squareRootGreaterThanOne(numner);
}
//private methods....
}
questo è quando scrivi un codice di produzione, trovo che devo trattare con numeri inferiori a uno in modo diverso da quelli maggiori di 1. Quindi devo aggiornare i miei test per riflettere questo.
Aggiornamento test
class SquareRootTest {
public void testNegativeNumber() {
assertException(squareRoot.execute(-5));
}
public void testIntegerSquareRoot() {
assertEqual(squareRoot.execute(9),3);
}
public void testDecimalSquareRoot() {
assertEqual(squareRoot.execute(3),1.732);
}
public void testNumberLowerThanOne() {
assertEqual(squareRoot.execute(0.04),0.200);
}
}
Se avessi trovato un singolo algoritmo per calcolare la radice quadrata, non avrei modificato i miei test.
Il metodo TDD si concentra esclusivamente sui test delle specifiche, tuttavia ci sono test derivati dall'implementazione, in particolare tutte le istruzioni condizionali e tutte le istruzioni controllate da loop dovrebbero normalmente essere testate. Questi casi di test non possono essere rilevati al momento della specifica.
La mia domanda: in che modo TDD si occuperà di questa situazione? o è efficacemente una debolezza del TDD?