Dobre praktyki programistyczne – Testy Jednostkowe

Ponieważ pracuję z programistami i z kodem już ponad 10 lat, pomyślałem sobie że warto opisać trochę dobrych praktyk programistycznych. Oczywiście niektóre pochodzą z moich przyzwyczajeń i opinii, niektóre udało mi się nabyć od moich szacownych kolegów które wynieśli je zachodnich firm (Nokia & Siemens).

Jest to pierwszy artykuł z serii, które postaram się tutaj opublikować. Oczywiście w ramach dostępnego czasu.

Przekonany też jestem, że pojawią trole które napiszą „jesteś głupi i się znasz” – ale chciałbym  żeby poparte było to otwartą konstruktywną dyskusją. Tutaj, lub na forum.

Zaczynamy… Na pierwszy ogień – Testy Jednostkowe zwane w oryginale: Unit Testing

1. Testy jednostkowe są Twoim przyjacielem

Wielu o nich słyszało, niewielu go używe ich w praktyce. Dlaczego? bo to strata czasu pisać najpierw test, a potem właściwy kod. Prawda jest taka, że ja nie widzę innej możliwości. Jeśli posiadasz rozbudowany kod, który ma wykonywać określone złożone zadanie – dużo łatwiej jest przetestować jedną metodę niż uruchamiać całą sekwencję zdarzeń powodującą uruchomienie danej metody (kliknij na login, wprowadź hasło i zobacz jaki komunikat się pokazuje).

Idealnie też nadają się do testowania kodu który ma formatować, albo wyłapywać skrajne sytuacje lub warunki. Formatowanie łańcuchów, czy poprawianie danych w tablicach – dużo łatwiej solidnie to przetestować gdy możesz sam wprowadzić swoje dane.

Nakład pracy poświęcony na przygotowanie „frontu” robót zwraca się gdy zaczynają się zmiany w kodzie. Wyobraź sobie, że masz metodę z której korzystasz w 10 miejscach. Nagle potrzebujesz coś zmienić w tej metodzie, bo jedno z tych „miejsc” ma potrzebę pobierania danych w innej formie. Skąd wiesz, że zmiana nie wyspie pozostałych funkcji ? Jeśli napisałeś testy – wystarczy je uruchomić po zmianie. Jeśli ich nie masz – sprawdzasz wszystkie 10 miejsc.

Druga sprawa to Pokrycie Kodu Korzystając z PHPUnit możesz w łatwy sposób sprawdzić ile twojego kodu się faktycznie wykonuje, a które miejsca są martwe. Dzięki temu kod można łatwo wyczyścić, ewentualnie popracować nad jego wydajnością. Oczywiście nasz ulubiony CodeIgniter nie jest w tyle i ma swoje Testy Jednostkowe. Jeśli więc PHPUnit wydaje Ci się zbyt skomplikowany – możesz użyć wbudowanych funkcji.

Trzeci i najważniejszy aspekt to możliwość łatwego refaktorowania kodu. Często pracujemy z kodem który odziedziczyliśmy po kimś inny, Zwykle nie wiadomo co się z nim i w nim dzieje. Refaktorowanie warto zacząć od napisania testów. Potem można zacząć poprawiać i czyścić kod bez obawy że zmieniamy wynik działania danej funkcji.

Kilka przydatnych źródeł:

https://github.com/kitsunde/CIUnit – CodeIgniter 2.2.1

https://github.com/kenjis/ci-phpunit-test – CodeIgniter 3.0

 

A jak wy testujecie swoje oprogramownie ?

3 thoughts on “Dobre praktyki programistyczne – Testy Jednostkowe

  1. Niestety nie testuję i bardzo żałuję, dopiero się przymierzam, zastanawiam się, jak umieścić testy wewnątrz aplikacji codeignitera, czy może w środku struktury application, np katalog tests? I z tego co oglądałem i czytałem, to powinno się robić test dla każdego kontrolera i każdej jego metody. W jaki sposób przetestować metodę wyświetlającą elementy kolekcji i korzystającą z paginacji. No i pytanie czy jeśli sam się mylę w metodzie i wykonuję test, czy to nie będzie wprowadzanie kogoś w błąd?

    Pozdrawiam i czekam na więcej takich artykułów :)

    • Gdzie umieścić testy – to zależy. Jeżeli korzystasz z wbudowanych testów CI – to muszą siedzieć jako kolejny kontroller. Jeżeli PHPUnit to wygodniej jest to trzymać na zewnątrz w katalogu „test/controllers”, „test/models” itd… uzupełniłem tekst o linki do przykładów

  2. Szczerze to nie testuje swojego kodu, głównie dlatego iż nie wypuszczam strony w świat, ale gdy będę robił to zawodowo to zapewne zacznę. Miło wiedzieć iż mój ulubiony frameowrk posiada wbudowane funkcje, które ułatwiają pracę. Czekam na więcej wpisów, oczywiście jeśli czas pozwoli. :)

Dodaj komentarz

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.