test if: 1. It talks to a database 2. It communicates across the network 3. It touches the file system 4. You have to do things to your environment to run it (eg, change config files) Tests that do this are integration tests Michael Feathers
Runs all the tests 1. Expresses every idea that we need to express 2. Contains no duplication 3. Has the minimum number of classes and functions (In this order) Adapted from Extreme Programming Installed by Ron Jeffries et al.
testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); } } public class Adder { public int add(int a, int b) { return 0; } } Expected 5, was 0
public void testTwoPlusThree() { Adder a = new Adder(); assertEquals(5, a.add(2, 3)); } } public class Adder { public int add(int a, int b) { return a+b; } }
refactoring • Refactoring is when I do design • I don’t claim I can guess the right design at first • Design emerges, with thought, care and small steps
ogni frame il giocatore ha due possibilità di abbattere 10 birilli (pins). Il punteggio per il frame è il numero di birilli abbattuti, più i bonus per stike o spare. Uno spare è quando il giocatore abbatte 10 birilli in due tiri. Il bonus per quel frame è il numero di birilli abbattuti al tiro successivo. Nel frame 3 dell'esempio, il punteggio è 10 (i birilli abbattuti) più il bonus di 5 (abbattuti nel tiro successivo.) Uno strike è quando il giocatore abbatte tutti i birilli in un solo tiro. Il bonus per quel frame è il numero di birilli abbattuti nei due tiri successivi Nel decimo frame, se il giocatore fa uno strike o spare può fare i tiri necessari per completare il frame. In ogni caso, al decimo frame non vengono fatti più di tre tiri.
• void roll(int pins); call when the player rolls a ball. The argument is the number of pins knocked down. • int score(); called when the game is ended. Returns the final score.
che serve veramente (no gold plating) • good enough! quando il test passa so che posso fermarmi • perché penso al codice come un cliente di questo codice • perché ottengo codice testabile, e il codice testabile • ha uno scopo preciso • è disaccoppiato dal resto del sistema • è più generale • il design emerge mano a mano che capisco meglio il problema
design nel tempo si imbastardisce • fare il design prima significa farlo nel momento peggiore: quando ne so di meno • molto meglio fare design mentre sviluppo