02 - mechanika tdd
DESCRIPTION
TRANSCRIPT
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ł
RED
Clock clock = new Clock();clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
✔MYŚLENIE✔PROJEKTOWANIE
FEEDBACK
✔JAKOŚĆ PROJEKTU✔TESTOWALNOŚĆ✔JAKOŚĆ TESTU
LISTA TESTÓW
● sprzedaż jednego produktu● brak kodu kreskowego● pusty kod kreskowy● ...
● zła nazwa „Storage”● duplikacja w CatalogItem
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
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
GREEN
Clock clock = new Clock();clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
class Clock {…}?
?
?
class Clock {…}
class Clock {…}
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
OBVIOUS IMPLEMENTATION
public static int[] generatePrimes(int maxValue) {if (maxValue >= 2) // the only valid case{
// declarationsint s = maxValue + 1; // size of arrayboolean[] f = new boolean[s];int i;// initialize array to true.for (i = 0; i < s; i++)
f[i] = true;// get rid of known non-primesf[0] = f[1] = false;// sieveint 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 resultfor (i = 0, j = 0; i < s; i++) {
if (f[i]) // if primeprimes[j++] = i;
}return primes; // return the primes
} else// maxValue < 2return new int[0]; // return null array if bad input.
}
TR
I AN
GU
LA
TE
integer7ShouldNotBeDivisibleBy3
public boolean isDivisible(int dividend, int divisor { return dividend % divisor == 0;}
integer6ShouldBeDivisibleBy3
public boolean isDivisible(int dividend, int divisor { return true;}
REFACTOR
Clock clock = new Clock();clock.set(6, 15);
wait.minutes(5);
assertClockAt(6, 20);
?
??
✔ PROJEKT (ŁATWOŚĆ)✔ TESTY (BEZPIECZEŃSTWO)
FEEDBACK
POZIOMY REFAKTORYZACJI
double basePrice = anOrder.basePrice();
return (basePrice > 1000);
return (anOr
der.basePric
e() > 1000);
[7,8,9] http://www.flickr.com/photos/thofik/3920097812[14,16] http://www.flickr.com/photos/29225114@N08/2778223048/ [14] http://www.flickr.com/photos/j-pocztarski/4226650088/ [22] http://www.flickr.com/photos/macca/204553997[22] http://www.courier-journal.com/blogs/vel05/uploaded_images/baby-names-720609.jpg
DZIĘKUJĘ
Zdjęcia: