02 - Mechanika TDD

578 views

Published on

  • Be the first to comment

  • Be the first to like this

02 - Mechanika TDD

  1. 1. Plan na dziś 1.Powtórzenie 2.Red 3.Green 4.Refactor
  2. 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ł
  3. 3. CYKL TDD RED GREEN REFACTOR spraw aby test przechodził napisz nieprzechodzący test refaktoryzuj
  4. 4. RED Clock clock = new Clock(); clock.set(6, 15); wait.minutes(5); assertClockAt(6, 20);
  5. 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. 6. LISTA TESTÓW ● sprzedaż jednego produktu ● brak kodu kreskowego ● pusty kod kreskowy ● ... ● zła nazwa „Storage” ● duplikacja w CatalogItem
  7. 7. DOSTOSUJ SZYBKOŚĆ
  8. 8. CO SIĘ STANIE?
  9. 9. WIELKOŚĆ KROKU BIEGŁOŚĆ W TDD ZŁOŻONOŚĆ PROBLEMU ZNAJOMOŚĆ DZIEDZINY
  10. 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. 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. 12. GREEN Clock clock = new Clock(); clock.set(6, 15); wait.minutes(5); assertClockAt(6, 20); class Clock { … } ? ? ? class Clock { … } class Clock { … }
  13. 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
  14. 14. FAKE IT OBVIOUS IMPLEMENT ATION TRIANGULATE
  15. 15. FAKE IT public int getSize { return 12; }
  16. 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. }
  17. 17. TRIANGULATE integer7ShouldNotBeDivisibleBy3 public boolean isDivisible(int dividend, int divisor { return dividend % divisor == 0; } integer6ShouldBeDivisibleBy3 public boolean isDivisible(int dividend, int divisor { return true; }
  18. 18. REFACTOR Clock clock = new Clock(); clock.set(6, 15); wait.minutes(5); assertClockAt(6, 20); ? ? ?
  19. 19. REFACTOR Clock clock = new Clock(); clock.set(6, 15); wait.minutes(5); assertClockAt(6, 20); ? ? ? ✔ PROJEKT (ŁATWOŚĆ) ✔ TESTY (BEZPIECZEŃSTWO) FEEDBACK
  20. 20. REFAKTORYZACJA ZMIANA WEWNĘTRZNEJ STRUKTURY KODU BEZ ZMIANY ZEWNĘTRZNEGO ZACHOWANIA
  21. 21. POZIOMY REFAKTORYZACJI double basePrice = anOrder.basePrice(); return (basePrice > 1000); return (anOrder.basePrice() > 1000);
  22. 22. 2 NAJWAŻNIEJSZE ZASADY REMOVE DUPLICATION (DRY) IMPROVE NAMES
  23. 23. GREEN REFACTOR UTRZYMUJ TESTY ZIELONE
  24. 24. [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:

×