Testy jednostkowe

"Dochodzenie do mistrzostwa wymaga dwóch elementów: wiedzy i pracy." - Robert C. Martin

Testy jednostkowe

testy jednostkowe

Testy jednostkowe jest to zbiór testów, które pozwalają na weryfikację jednostki kodu produkcyjnego. Jednostką takiego kodu może być  klasa, moduł, metoda. Ważne jest, aby jeden test weryfikował tylko jedną funkcjonalność. Każdy test powinien składać się z trzech podstawowych sekcji: „given”, „when”, „then”. Sekcja „given” powinna zawierać tzw. scenariusz, a więc utworzenie obiektu klasy z określonymi parametrami. Sekcja „when” powinna zawierać np. wywołanie testowanej metody. Z kolei ostatnia sekcja „then” powinna zawierać najwyżej kilka assercji, które porównują wyniki otrzymane metodą testowaną z wynikami oczekiwanymi. Poniżej został przedstawiony przykładowy test dla programu konwertującego cyfry rzymskie na cyfry arabskie.


//given
RomanNumeral roman = new RomanNumeral("XIV");

//when
int number = roman.convert();

//then
Assert.assertEquals(14, number);

Testy jednostkowe są nieodłączną częścią jednej ze zwinnych technik tworzenia oprogramowanie jakim jest TDD, a więc Test Driven Development. Tworzenie oprogramowania tą techniką sprowadza się do trzech podstawowych kroków. Najpierw programista pisze test sprawdzający nową funkcjonalność bez jej implementacji, na tym etapie test powinien się nie udać. Dalej programista implementuje tą funkcjonalność, test powinien się udać. W ostatnim kroku programista dokonuje refaktoryzacji kodu. Według tej techniki programowania kod testowy jest tak samo ważny jak kod produkcyjny.

Po co piszemy testy? Odpowiedź jest prosta – aby uniknąć błędów! Niedostatecznie przetestowane oprogramowanie, może mieć fatalne skutki, które nie często sprowadzają się tylko do frustracji użytkownika, ale również do straconych pieniędzy! Pisanie testów na bieżąco pozwala nie tylko na uniknięcie błędów, ale również pomaga wyeliminować tzw. regresję – w miarę rozwoju aplikacji, dodawane są nowe funkcjonalności i to co wcześniej działało poprawnie, może po prostu przestać działać.

Pisanie testów często zajmuje niemal tyle samo czasu co pisanie kodu produkcyjnego. Niemniej jednak pisanie testów pozwala na wczesne wychwycenie błędów i poprawę ich jeszcze na etapie tworzenia, a nie po wypuszczeniu programu do użytku. Czas stracony na pisaniu testów w przypadku każdej nowej funkcjonalności jest niczym w porównaniu do czasu straconego na debugowaniu całego programu, zawierającego tysiące różnych funkcjonalności w poszukiwaniu jednego bug’a. Każdy programista oddając aplikację do użytku powinien być pewny, że działa ona poprawnie!