1. Testy jednostkowe - PHPUnit
Czym są testy, dlaczego warto je pisać, podstawy frameworka PHPUnit.
Przygotował
Adam Dudel
Aurora Creation / PHP Developer
a.dudel@auroracreation.com
2. Testy jednostkowe - PHPUnit
Plan prezentacji
━━ Czym są testy jednostkowe?
━━ Po co piszemy testy?
━━ Wady i zalety
━━ PHPUnit
━━ Jak zacząć pracę z PHPUnit
━━ Trochę praktyki
3. Czym są testy jednostkowe?
Zadaniem testów jednostkowych jest testowanie logiki aplikacji. Aby
to było możliwe i jednocześnie testy były zrozumiałe dla programisty,
testowanie logiki odbywa się w małych częściach.
4. Po co piszemy testy?
Celem testów jednostkowych jest walidacja poprawnego działania małego fragmentu aplikacji. Pod
pojęciem małego fragmentu aplikacji rozumiemy najmniejszą możliwą jednostkę aplikacji.
W przypadku testów jednostkowych należy wspomnieć o izolacji testowanej jednostki od wpływu
czynników zewnętrznych. Ma to na celu skupić się w teście tylko i wyłącznie na konkretnej testowanej
funkcjonalności.
Tu z pomocą przychodzą Mocki, czyli “atrapy obiektów”. Mock jest imitacją obiektu podstawioną w miejsce
obiektu rzeczywistego.
5. Test Driven Development - technika
pisania testów składająca się z 3 etapów:
● RED
● GREEN
● REFACTOR
TDD
6. Zalety pisania testów jednostkowych
━━ sprawdzenie poprawności poszczególnych części kodu, poznawanie funkcjonalności
━━ uniknięcie komplikacji po merge’ach
━━ wymuszenie pisania kodu “testowalnego”
━━ większa kontrola nad własnym kodem
━━ szybsza refaktoryzacja
7. Wady pisania testów jednostkowych
━━ czas na naukę i pisanie testów
━━ wymagają pisania przemyślanego kodu
━━ nie każdy kod da się przetestować
8. Kiedy nie warto testować?
━━ w przypadku bardzo prostych aplikacji
━━ gdy aplikacja nie będzie dalej rozwijana
━━ prototypy
9. Framework PHPUnit
PHPUnit to framework testów jednostkowych, napisany przez Sebastiana Bergmanna. Tak jak w
przypadku podobnych bibliotek do testów używa on tzw. asercji, które sprawdzają jak zachowuje się kod
poddany testom.
10. Czym jest asercja?
W programowaniu asercja (ang.assertion) to predykat
(forma zdaniowa w danym języku, która zwraca prawdę lub
fałsz), umieszczony w pewnym miejscu w kodzie. Asercja
wskazuje, że programista zakłada, że predykat ów jest w
danym miejscu prawdziwy.
Źródło: Wikipedia
11. Najczęściej używane asercje
━━ assertTrue, assertFalse, assertSame
━━ assertIsArray,assertContains, assertCount, assertEmpty
━━ assertIsInt, assertIsNumber, assertIsFloat, assertIsObject, assertIsString
━━ expectException
12. Pokrycie kodu
PHPUnit oferuje nam narzędzie do generowania raportu z pokrycia kodu naszymi testami. Używa w tym
celu Xdebug. Jest to bardzo pomocne narzędzie, także w samym procesie pisania testów, dzięki któremu
możemy na bieżąco obserwować co jest faktycznie testowane.
Nie należy mocno sugerować się wskaźnikiem procentowego pokrycia kodu, jeśli testujemy przemyślany
kod to większe znaczenie ma pokrycie testami newralgicznych części systemu.
13. Jak zacząć pracę z PHPUnit?
━━ instalacja biblioteki za pomocą Composera
━━ przygotowanie pliku phpunit.xml
━━ testy prostej klasy do wysyłania wiadomości
17. Klasa Message
Klasa Message w konstruktorze oczekuje implementacji Mailera
oraz pozwala na ustalenie adresu e-mail.
18. Test metody sendMessage
Wynik wykonania testów:
Test wykonał się poprawnie mimo że
nie użyliśmy mocka dla klasy Mailer.
Metody z klasy Mailer nie powinny się
wykonywać - testujemy tylko klasę
Message.
19. Test metody sendMessage
Wynik wykonania testów:
Stworzyliśmy mocka, jednak testy
przestały działać. Mock nie jest
skonfigurowany.
20. Test metody sendMessage
Wynik wykonania testów:
Skonfigurowany mock na wartości
po których metoda send() powinna
zwrócić true.
21. Testy metody setEmail
Wynik wykonania testów:
Wynik wykonania testów:Test dla pustej wartości jest ok, jednak dla spacji jest błędny.
23. Testy metody setEmail z użyciem Data Provider
Wynik wykonania testów:
Aby nie pisać oddzielnego sprawdzania
dla każdego przypadku skorzystamy z
Data Providera.