Quindi diciamo che ho un test:
@Test
public void MoveY_MoveZero_DoesNotMove() {
Point p = new Point(50.0, 50.0);
p.MoveY(0.0);
Assert.assertAreEqual(50.0, p.Y);
}
Questo test quindi mi consente di creare la classe Punto :
public class Point {
double X; double Y;
public void MoveY(double yDisplace) {
throw new NotYetImplementedException();
}
}
Ok. Fallisce Buono. Quindi rimuovo l'eccezione e ottengo il verde. Grande, ma ovviamente ho bisogno di testare se cambia valore. Quindi scrivo un test che chiama p.MoveY (10.0) e controlla se p.Y è uguale a 60.0. Non funziona, quindi cambio la funzione in modo che appaia così:
public void MoveY(double yDisplace) {
Y += yDisplace;
}
Grande, ora ho di nuovo verde e posso andare avanti. Ho provato a non muovermi e muovermi nella direzione positiva, quindi naturalmente dovrei testare un valore negativo. L'unico problema con questo test è che se ho scritto il test correttamente, allora non fallisce all'inizio. Ciò significa che non ho adattato il principio di "Red, Green, Refactor."
Ovviamente, questo è un problema di primo mondo di TDD, ma ottenere un errore all'inizio è utile in quanto dimostra che il test può fallire. Altrimenti questo test apparentemente innocente che sta passando per ragioni errate potrebbe fallire in seguito perché è stato scritto male. Questo potrebbe non essere un problema se accadesse 5 minuti più tardi, ma cosa succederebbe se accadesse al povero-linfa che ha indotto il codice due anni dopo. Quello che sa è che MoveY non funziona con valori negativi perché è quello che il test gli sta dicendo. Ma, potrebbe davvero funzionare e solo essere un bug nel test.
Non penso che ciò accada in questo caso particolare perché l'esempio di codice è così semplice, ma se fosse un sistema complicato di grandi dimensioni potrebbe non essere il caso. Sembra pazzesco dire che voglio fallire i miei test, ma questo è un passo importante in TDD, per buone ragioni.