Asercje i testowanie kodu

Wiadomym jest, że codzienna praktyka kodera PHP polega bardzo często na napisaniu w ciągu dnia kilkanaście  (jeśli nie kilkadziesąt) razy kombinacji różnych alertów, die’ów czy inszych echo celem podejrzenia działania programu w konkretnym momencie, lub też zwracanej wartości. Praktyka codziennego stosowania w pracy testów jednostkowych jakoś się w webdeveloperskim świecie nie do końca przyjęła, a jeśli już, to w formie ostatecznych testów przed wypuszczeniem aplikacji do poważnego użycia (trochę upraszczam, wiem).

W Javie mamy osławiony JUnit, framework do tworzenia testów jednostkowych, o których nota bene książka czeka w kolejce na przeczytanie. Jednakże na szybko należy wspomnieć o innym ciekawym rozwiązaniu, które w praktyce jest dla programistów całkiem miłym ułatwieniem. Konkretnie chodzi o asercje. Mówiąc krótko jest to taki warunek logiczny, którego niespełnienie (fałsz) powoduje przerwanie wykonywania programu. Jest to element języka, zatem nie trzeba od razu zatrudniać całej machiny testów jednostkowych, wystarczy wklepać w kod raptem jedną linijkę. Oto przykład:


public static void main(String[] args) { int licznik = 2;
int dzielnik = 0; // To jest zabronione
int wynik;
assert dzielnik != 0 : "Ty no nie dzieli się przez zero";
wynik = licznik/dzielnik; }

Oczywiście przykład jest bardzo prosty i ostry, w normalnych warunkach bez składni assert wyrzucony zostałby  ArithmeticException. Jednakże w tym przypadku zostanie uprzednio zgłoszony wyjątek AssertionError wraz z komunikatem, który podaliśmy zaraz po warunku. Niby nic, a jednak wiele – jakie są zyski z używania asercji?

Zasadniczo to dwa. Pierwszy jest taki, że wyrzucanie wyjątków asercji jest domyślnie wyłaczone!!! By uruchomić tę opcję należy wywoływać kompilator z parametrem -ea. NetBeans wystarczy kliknąć prawym przyciskiem myszy na projekcie i Set Configuration->customize. I w okienku uruchomieniowym w rubryce VMOptions wpisać owo -ea.  Od tej pory przy kompilacji asercje będą brane pod uwagę. Jest to o tyle dobre, że dzięki jednej opcji, można bez problemu w ciągu jednej chwili przestawić aplikację ze stanu docelowego na developerski. Nie trzeba zakomentowywać masy kodu, wystarczy zmienić argument wywołania VM.

Drugim plusem jest informacja dla innych (poważne projekty to raczej nie domena 1 osoby) o założeniach dotyczących danego fragmentu kodu. Oczywiście na podanym przeze mnie przykładzie tego może i nie widać, za to przy dużych projektach, kiedy zależności między klasami zaczynają przypominać labirynt asercje pokazują swoją przydatność. O wiele łatwiej jest przeczytać w kodzie (lub wyniku kompilacji) “Kierowniku tutaj nie powinno być NULL”, niż przedzierać się przez gąszcz plików w poszukiwaniu klasy, z której pochodzi feralna metoda powodująca wyrzucenie wyjątku. Mała rzecz, a cieszy.

Advertisements

One thought on “Asercje i testowanie kodu

  1. Piotr Kaczmarski

    Witam:)
    Mam dwie uwagi:
    1)
    Pan Andrew Hunt w swojej książce “Pragmatyczny programista” zaleca, żeby włączać asercje nawet w środowisku docelowym. I moim zdaniem ma rację, gdyż fakt, że projekt został wdrożony nie oznacza końca pracy nad nim i końca testowania.
    Co, jeśli jakiś błąd w środowisku docelowym mógł zostać wykryty przez asercje a nie został? Może potem napsuć komuś krwi.

    Ktoś może mówić o narzucie związanym z asercjami. Ale czy rzeczywiście jest taki duży? Czy stać nas na oszczędzanie w tym przypadku? To zależy oczywiście od założeń projektu.

    Tak czy inaczej, wielkie firmy produkujące oprogramowanie i tak już rezygnują z maksymalizacji wydajności, stosując troszkę mniej wydajne rozwiązania architektoniczne by na przykład łatwiej zarządzać projektem i zwiększyć jego szanse powodzenia. W końcu lepiej dostać wolniejszy program niż nie dostać go w ogóle.

    2)
    Moja druga uwaga dotyczy semantyki. W drugim akapicie piszesz:
    “W Javie mamy osławiony JUnit” – osławiony w języku polskim oznacza “okryty złą sławą”. Nie słyszałem, żeby JUnit był okryty złą sławą, przeciwnie, zdaję mi się, że większość użytkowników bardzo go sobie ceni. Czy miałeś może na myśli, że w Javie mamy sławny JUnit?

    Pozdrawiam,
    Piotrek

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s