2. 3 PRAWA TDD wg UNCLE BOBA
1.Nie pisz żadnego kodu produkcyjnego jeśli nie
ma nieprzechodzącego testu
2.Pisz tylko tyle testu, aby zademonstrować, że
nie przechodzi
3.Pisz tylko tyle kodu produkcyjnego, aby test
przeszedł
4. RED
Clock clock = new Clock();
clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
5. RED
Clock clock = new Clock();
clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
✔MYŚLENIE
✔PROJEKTOWANIE
FEEDBACK
✔JAKOŚĆ PROJEKTU
✔TESTOWALNOŚĆ
✔JAKOŚĆ TESTU
6. LISTA TESTÓW
● sprzedaż jednego produktu
● brak kodu kreskowego
● pusty kod kreskowy
● ...
● zła nazwa „Storage”
● duplikacja w CatalogItem
10. TESTY JEDNOSTKOWE
● Muszą uruchamiać się szybko
● Test nie jest testem jednostkowym jeśli:
● komunikuje się z bazą danych
● korzysta z sieci
● dotyka systemu plików
● musisz coś zmienić w środowisku aby go
uruchomić
Michael C. Feathers, Working Effectively with Legacy Code
11. DOBRE TESTY JEDNOSTKOWE
● F ast
● I solated
● R epeatable
● S elf-validating
● T imely
● tysiące / sekundę
● wskazuje błąd
● nieważna kolejność ani czas
● brak ręcznego sprawdzania
● napisane przed kodem
12. GREEN
Clock clock = new Clock();
clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
class Clock
{
…
}
?
?
?
class Clock
{
…
}
class Clock
{
…
}
13. GREEN
Clock clock = new Clock();
clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
class Clock
{
…
}
?
?
?
class Clock
{
…
}
class Clock
{
…
}
FEEDBACK
✔ POPRAWNOŚĆ
✔ REGRESJA
✔ WIELKOŚĆ KROKU
16. OBVIOUS
IMPLEMENT
ATION
public static int[] generatePrimes(int maxValue) {
if (maxValue >= 2) // the only valid case
{
// declarations
int s = maxValue + 1; // size of array
boolean[] f = new boolean[s];
int i;
// initialize array to true.
for (i = 0; i < s; i++)
f[i] = true;
// get rid of known non-primes
f[0] = f[1] = false;
// sieve
int j;
for (i = 2; i < Math.sqrt(s) + 1; i++) {
if (f[i]) // if i is uncrossed, cross its multiples.
{
for (j = 2 * i; j < s; j += i)
f[j] = false; // multiple is not prime
}
}
// how many primes are there?
int count = 0;
for (i = 0; i < s; i++) {
if (f[i])
count++; // bump count.
}
int[] primes = new int[count];
// move the primes into the result
for (i = 0, j = 0; i < s; i++) {
if (f[i]) // if prime
primes[j++] = i;
}
return primes; // return the primes
} else
// maxValue < 2
return new int[0]; // return null array if bad input.
}