Wprowadzenie do testów jednostkowych

Unit test mem

17 Stycznia 2018

Wow… trochę czasu minęło od ostatniego wpisu. Trochę szczerze mówiąc wstyd, ale cóż, nie ma co płakać, a trzeba pracować 😁.

Do rzeczy – każdy z nas w nowy rok wchodzi z jakimiś postanowieniami. Wiecie… schudnę, zacznę biegać itp 💪. Dokładnie tak samo każdy z nas – programistów – wchodzi w nowy rok m.in. z postanowieniem pisania czystego, nieskazitelnego kodziwa (Jeśli nie masz takich planów to ok, najwyraźniej jesteś już PRO 😁).

No tak, tylko tak naprawdę od słów do czynów daleka droga, a już w programowaniu to chyba nie muszę się tutaj zbytno produkować. Wszystko, co nie jest natywnie zaimplementowane w strukturze języka, a ma pomagać w pisaniu czystego i zrozumiałego kodu – wcale na początku się takie nie wydaje.

I właśnie – na przykładzie mojego deweloperskiego życia tak było z… tak, z testami jednostkowymi 😅.

Dlatego w kontekście dobrego wejścia w nowy rok postanowiłem ruszyć z kolejną serią wpisów, tym razem dotyczącą testów jednostkowych. Rozkład jazdy wygląda następująco:

  • Wprowadzenie do testów jednostkowych – czym są, o co chodzi itp.
  • Metodologie pracy bazujące na testach jednostkowych
  • Testy w Swift – wprowadzenie
  • Testy w Swift – zaawansowane + narzędzia

Ok, mamy to. Dzisiaj trochę teorii – tak więc do dzieła 🚀!

Unit tests – co to takiego?

Unit test – czyli po polskiem test jednostkowy to po prostu kawałek kodu wykonujący inny kawałek kodu w celu weryfikacji poprawności jego działania. Stąd też nazwa jednostkowy (unit), ponieważ pozwala on nam na sprawdzenie każdego, najmniejszego kawałka kodu w naszej aplikacji. W dodatku całość odbywa się bez ingerencji samego programisty – oczywiście oprócz napisania testu 😅. Na przykład w programowaniu obiektowym będziemy chcieli przetestować działanie naszej metody:


func sum(a: Int, b: Int) -> Int {
    return a + b
}

Pisząc test jednostkowy chcemy sprawdzić, czy jeżeli jako parametry przekażemy odpowiednio liczby 1 i 2, to czy wynik naszej metody będzie 3.

Oczywiście testom podlegać mogą również inne elementy oprogramowania, takie jak klasy, stany obiektów czy rzucane wyjątki.

Co ważne, testy jednostkowe winny nie tylko badać oczekiwany rezultat, czyli tzw. happy path, ale także wykrywać zupełnie nieoczekiwane zachowania. Przykładowo co stanie się, kiedy zostaną przekazane błędne parametry do metody, lub jakiś parametr okaże się nil’em.

Testy jako forma “designu” aplikacji

Kiedyś gdzieś przeczytałem takie mądre zdanie (nie pamiętam już u kogo na blogu, jeśli to jesteś Ty to napisz do mnie to podrzucę do Ciebie link 😅) że testy jednostkowe kreują design naszej aplikacji. I oczywiście nie chodzi o UI, ale o architekturę naszego programu. Zatem pisząc dobrej jakości testy decydujemy o tym, w jaki sposób nasz system zostanie zbudowany. To powoduje również, że przed napisaniem jakiejś nowej funkcji deweloper zastanowi się kilka razy nad różnymi sposobami implementacji, tak aby funkcja ta była testowalna.

NOTE: Tak, nie wszystko co napiszesz jest testowalne…

Mówi o tym róznież metodyka TDD (Test Driver Design o czym w następnej części) – należy pisać kod w oparciu o napisane testy. Od razu w Twojej głowie powinna zaświecić się lampka – “aha, czyli że najpierw mam napisać testy? Do kodu którego nie ma?” 👉😁…

Regression Bug

Testy jednostkowe okazują się bardzo przydatne w wykrywaniu tzw. Regression Bugs, czyli błędów regresji oprogramowaniu. Jeśli jesteś świadomym programistą to wiesz napewno, że raz napisany kod w 99,9% przypadków nie będzie działał wiecznie. Świat się zmienia, a świat technologii to prawdziwa rewolucja i każda nowa wersja systemu (tutaj nieważne czy to iOS czy coś innego) może spowodować, że twoja aplikacja nie będzie działała poprawnie.

Tu z pomocą przychodzą testy, dzięki którym możemy bardzo szybko reagować na zmiany i w bardzo szybki sposób wykryć przyczynę, co w naszej aplikacji nie dostało wsparcia.

To kolejny argument za tym, że warto uczyć się pisania testów i stosować je w prawdziwych projektach. Może w pierwszych dwóch sprintach będziesz trochę do tyłu (jeżli PM dowalił Ci za dużo tasków💥), ale później będziesz sam sobie dziękował.

Testy 〉dokumentacja

Dobrze napisane testy są lepsze od dobrze napisanej dokumentacji 😁. Niektórzy mogą się ze mną nie zgodzić, ale kod który ➡️ weryfikuje inny kod nie potrzebuje reklamy. Jeżeli opatrzymy wszystko dobrym komentarzem, to możemy być pewni że doświadczona osoba z łatwością zrozumie nasze wypociny.

Testy jednostkowe jako dokomentacja do kodu to dość innowacyjny sposób, ale od kiedy nauczyłem się w miarę testować swój kod, to jest to jeden z rezultatów jaki za to otrzymuję 💪.

Testy w iOS? Kto to robi…

A może zamiast pytać “Kto to robi” powinieneś zapytać ➡️ Dlaczego programiści iOS tego nie robią? 🤔
No właśnie… przyznam że w naszym światku często spotykam się z opinią że pisanie testów to w przypadku iOS strata czasu.

Przecież wszystko widać jak na dłoni, można sobie rezultat wypluć do debuggera i wtedy wiadomo czy dany element działa.

Taaa… To np. spróbuj przetestować ręcznie rozgrywkę w swojej grze ➡️ 1000 razy. Może być ciężko. Lub np. kiedy testowana funkcjonalność potrzebuje zmiany w czasie (np. coś ma stać się w środę, a mamy piątek).

Uważam, że jako środowisko bardzo zaniedbujemy pisanie testów – co potem wpływa nie tylko na samą czytelność kodu, ale róznież na szybkość wykrywania błędów czy wydajność.

Konkluzje

Ok, dzisiaj trochę teorii na temat testów jednostkowych. Myślę że jak na okres poświąteczny i ponoworoczny to odpowiednia ilość materiału.

Mam nadzieję że coś dla siebie znalazłeś w tym wpisie i że cała seria będzie dla Ciebie ciekawa.

Tymczasem jak zawsze bardzo serdecznie zaczęcam Cię do dzielenia się spostrzeżeniami ze światem i (oczywiście) ze mną 😊.

Daj znać na portalach

Twitter
Instagram
Snapchat
Lub wpadnij na fanpage na Facebook’u!

Dzięki i do następnego wpisu!
@jkornat


5 Komentarzy

Ewa · Marzec 4, 2018 o 12:31

Wytłumaczyłbyś w jednym z kolejnych postów Linkedlisty? Byłabym wdzięczna 🙂

    Jakub Kornatowski

    Jakub Kornatowski · Marzec 18, 2018 o 20:28

    Ewa,
    Pojawi się wpis w przyszłym tygodniu.
    Pozdrawiam 😁

Lukasz · Maj 15, 2018 o 08:03

Więcej, więcej, więcej wpisów plisss 🙂

Mateusz · Lipiec 31, 2018 o 13:34

Hej, czy będziesz dalej rozwijał temat czy blog “umiera” :)?
Pzdr

    Jakub Kornatowski

    Jakub Kornatowski · Sierpień 1, 2018 o 07:14

    Cześć Mateusz,

    Fakt, ostatnio było tutaj cicho, ale wracamy z nową porcją wiedzy. W weekend powinno pojawić się coś nowego i mam nadzieję uda się już iść w miarę regularnie, a pisać jest o czym :).

    Pozdrawiam 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *