WIELKOPOLSKIE POZNAŃ NOWE MIASTO ID_LOKALIZACJA ID_WOJEWÓDZTWO ID_MIASTO ID_DZIELNICA 1 14 220 34 2 14 220 35 WOJEWÓDZTWA MIASTA DZIELNICE Co jesli dwa miasta o tej samej nazwie?
do przetestowania 3. Spraw aby kod był testowalny 4. Napisz testy 5. Dokonaj zmiany 33 1. Dokonaj zmiany 2. Módl się vs. 1. Jakie zmiany musimy wprowadzic? 2. Skad bedziemy wiedziec, ze dokonalismy poprawnych zmian? 3. Skad bedziemy wiedziec, ze nic nie popsulismy?
getBar() { global $user; return $user[‘name’]; } } 37 class Foo { private $user; public function __construct($user) { $this->user = $user; } public function getBar() { return $this->user[‘name’]; } }
który sprawdza tylko wynik działania metody, powinieneś to zrobić • Jeśli możesz napisać test funkcjonalny albo integracyjny, który oddziałuje na baze danych, połączyenie sieciowe, czy system plików, powinieneś to zrobić • Jeśli możesz napisać luźny test jednostkowy, który testuje konkretne klasy (bez pełnej izolacji), powinieneś to zrobić • Jeśli możesz napisać prawidłowy test, który wykorzystuje imitacje testowe (test doubles), żeby w pełni odizolować testowaną klasę, powinieneś to zrobić An imperfect test today is better than a perfect test someday.
) { $this->db = $db; } public function getBar($id) { $sql = “SELECT * FROM bar WHERE id = :id”: return $db->fetchRow($sql, [‘:id’ => $id]); } } 44 class Foo { private $gateway; public function __construct( BarGateway $gateway ) { $this->gateway = $gateway; } public function getBar($id) { return $this->gateway ->findById($id); } } ...
) { $this->db = $db; } public function getBar($id) { $sql = “SELECT * FROM bar WHERE id = :id”: return $db->fetchRow($sql, [‘:id’ => $id]); } } 45 ... class BarGateway { private $db; public function __construct( Db $db ) { $this->db = $db; } public function findById($id) { $sql = “SELECT * FROM bar WHERE id = :id”: return $db->fetchRow($sql, [‘:id’ => $id]); } }
BookingService(); $service>book(); $service = new BookingServiceV2( new BookingService(); ); $service>bookItem(); class BookingServiceV2 { ... public function bookItem() { $this->legacyService->book(); } } BookingServiceV2 +bookItem() +cancelItemBooking() ...
BookingServiceV2(); $service>bookItem(); class BookingServiceV2 { ... public function bookItem() { // new implementation } } BookingServiceV2 +bookItem() +cancelItemBooking() ...
new BookingService( $isNewBookingFeatureActive ); $service>book(); class BookingService { ... public function book() { if ($this ->isNewBookingFeatureActive) { return ... } ... } }
nim żyć! Nie działaj chaotycznie! - Korzystaj ze strategii Do it right the second time! - jesli dostarczasz zbyt szybko - zaplanuj refaktoryzację! zmiana 1. 2. 3.