W Internecie możemy znaleźć wiele poradników i artykułów dydaktycznych dla testerów. Jednak czy po ich przeczytaniu na pewno dowiedzieliśmy się tego, czego chcieliśmy?

W serii naszych edukacyjnych postów chcemy przekazać wam wiedzę w zrozumiały i przystępny sposób. Zależy nam, abyście z naszych tekstów wynieśli jej najwięcej, a w przyszłości decydując się na pracę w IT jako testerzy oprogramowania, byli solidnie przygotowani.

Dziś prezentujemy wam testy jednostkowe: czym są, co mają na celu, kto powinien je pisać i jak się je wykonuje? Przekonajmy się!

 

laptop kod biurko okulary

 

Test jednostkowy to metoda testowania tworzonego oprogramowania poprzez wykonywanie testów weryfikujących poprawność działania pojedynczych elementów (jednostek) programu – np. metod lub obiektów w programowaniu obiektowym, lub procedur w programowaniu proceduralnym. Testowany fragment programu poddawany jest testowi, który wykonuje go i porównuje wynik (np. zwrócone wartości, stan obiektu, zgłoszone wyjątki) z oczekiwanymi wynikami – tak pozytywnymi, jak i negatywnymi (niepowodzenie działania kodu w określonych sytuacjach również może podlegać testowaniu).

To jedna z wielu definicji, które możemy znaleźć w Internecie. A co tak naprawdę się pod tym kryje?

Najprościej mówiąc test jednostkowy to fragment kodu, który w kontrolowanych warunkach sprawdza, czy pojedyncze elementy programu takie jak metody, funkcje lub obiekty wykonują swoje zadania poprawnie, czyli zgodnie z oczekiwaniami programisty. Aby zweryfikować czy wyizolowana funkcja działa prawidłowo, symulujemy konkretne sytuacje w określonych przez nas warunkach, a następnie porównujemy ich rezultaty, biorąc pod uwagę również wszystkie negatywne zwroty.

Testy jednostkowe wykonuje głównie programista. Jego kod krok po kroku jest przez niego na bieżąco sprawdzany poprzez testowanie poszczególnych metod i tworzenie dla nich różnych scenariuszy. Pozwoli to na natychmiastową naprawę błędów i wyeliminowanie tych, które w przyszłości mogą wpłynąć na całościowe działanie programu. Chyba nikt nie chciałby po tygodniach wracać do poszukiwań tej jednej funkcji, która odnosi się do innej, a nie zakładała wcześniej związanej z tym opcji, przez co narobiła sporego bigosu… Sprawdzenie jednej metody czy obiektu jest bezpieczniejsze i nie zmusza do uruchamiania całego napisanego dotychczas programu. To ogromna zaleta, bo zawsze zyskujemy na tym czas.

Typy testów jednostkowych

Testy jednostkowe (nazywane też testami modułowymi lub po angielsku „unit test”) można podzielić na kilka typów:

  • Analiza ścieżek

Polega na wyznaczeniu początkowego i końcowego punktu dla przeprowadzenia testów, a następnie zbadaniu przebiegu ścieżek pomiędzy nimi. Przy takim podejściu istnieją dwie opcje: każdą ścieżkę w funkcji można przetestować lub są one niemożliwe do sprawdzenia ze względu na występowanie pętli. Wówczas stosowane są dwa rodzaje testów: Boundary test (nie wykonuje się działań w pętli lub narzuca się jednorazowe wykonanie działania) oraz Interior test (działania w pętli uważa się za zweryfikowane w momencie, gdy wszystkie ścieżki zostały wykonane przy dwukrotnym powtórzeniu pętli).

  • Klasy równoważności

Do przeprowadzenia testu wybieramy jedynie kilka losowych elementów, zakładając, że jeżeli wszystkie z nich będą działać zgodnie z założeniem, pozostałe również powinny. Klasy równoważności możemy podzielić na: poprawności i niepoprawności. Przewidujemy dla nich poprawne lub błędne wykonanie programu. Jeżeli na przykład funkcja ma wyświetlić konkretną ilość elementów między 1 a 1000, to naszymi przypadkami testowymi mogą być: (1, 3, 69, 482, 997).

  • Wartości brzegowe

Aby rozwinąć testy z użyciem klas równoważności, możemy wykorzystać testowanie wartości brzegowych. Polega ono na zweryfikowaniu działania funkcji przy wprowadzeniu brzegowych wartości dolnej i górnej granicy zakresu jej wykonywania. Przykładowo, gdy funkcja ma wyświetlić konkretną ilość elementów między 1 a 1000, przypadki testowe prezentują się w następujący sposób: (0, 1, 2, 999, 1000, 1001).

  • Testowanie składniowe

Polega na sprawdzaniu danych wejściowych, które są wprowadzane do systemu, na przykład wymuszone wartości pól lub autokorekty. Przy takim typie testowania należy pamiętać o zasadzie „garbage in – garbage out”, która zadziała przy braku mechanizmu walidacji danych na wejściu i testów na tolerancję systemu na błędne dane.

Niektóre języki programowania bezpośrednio wspierają testowanie jednostkowe. Ich składnia pozwala na stworzenie deklaracji bez użycia dodatkowych bibliotek.

pisanie notatki laptop

Zalety i wady testowania jednostkowego

Należy pamiętać, że wszystko ma swoje mocne i słabe strony. Nie inaczej sytuacja wygląda w przypadku testowania jednostkowego. Na początek skupmy się na zaletach.

Testy jednostkowe pozwalają na wykrycie problemu na wczesnym etapie cyklu rozwojowego oprogramowania. Obejmuje to zarówno błędy w implementacji programisty, jak i braki w specyfikacji poleceń. Pisanie testów zmusza autora do tego, aby dokładnie przeanalizował dane wejściowe i wyjściowe oraz precyzyjnie określił pożądane zachowanie danej jednostki. Koszt znalezienia i naprawienia błędu przed lub na początku kodowania jest mniejszy niż jego późniejsza identyfikacja i korekta.

Poprawnie działający kod umożliwi w przyszłości programistom odtworzenie go lub uaktualnienie bibliotek systemowych oraz da im pewność, że moduły wciąż działają poprawnie.

Testy jednostkowe mogą zmniejszyć niepewność samych jednostek i być stosowane w podejściu typu „bottom-up” (programista tworzy „sterownik”, który zakańcza przypadki testowe na inny kawałek kodu do późniejszego raportowania i monitorowania wyników).

Testowanie jednostkowe dostarcza pewnego rodzaju „żywej” dokumentacji systemu. Programiści, którzy chcą dowiedzieć się jaką funkcjonalność zapewnia dana jednostka i jak z niej korzystać, mogą przyjrzeć się testom, aby uzyskać podstawową wiedzę na temat interfejsu urządzenia (API).

A jakie są wady testowania jednostkowego? Przede wszystkim nie jest ono w stanie przechwycić wszystkich błędów w programie, ponieważ nie może ocenić każdej ścieżki wykonania. Testowanie jednostkowe z definicji sprawdza jedynie funkcjonalność samych jednostek, w związku z tym, nie będzie wychwytywało nieprawidłowości na poziomie całego systemu, gdzie funkcje mogą być wykonywane w jednostkach. Aby zagwarantować prawidłowe zachowanie dla każdej ścieżki wykonania i wszystkich możliwych danych wejściowych oraz zapewnić brak błędów, wymagane są niestety inne techniki.

Rozbudowana hierarchia testów jednostkowych nie jest jednoznaczna z testowaniem integracji. Powinna być uwzględniona w testach integracyjnych, które w dużej mierze opierają się na testowaniu manualnym. Testy na wysokim poziomie mogą być trudne do zautomatyzowania, a ręczne testowanie wydaje się w tym przypadku szybsze i tańsze.

Do tego wszystkiego dochodzą jeszcze różnice pomiędzy platformami. Oprogramowanie tworzone jest najczęściej na innej platformie niż ta, na której ostatecznie zostanie uruchomione. Ciężko uruchomić program testowy w rzeczywistym środowisku wdrażania i nie jest to możliwe tak jak w przypadku programów komputerowych.

Należy również przechowywać dokładne zapisy przeprowadzanych testów w całym kodzie źródłowym, inaczej test nie będzie wykonywany w realistycznym kontekście, co zmniejszy wiarygodność testów.

Niezbędne jest również wdrożenie zrównoważonego procesu zapewniającego regularne kontrolowanie niepowodzeń przypadków testowych i ich rozwiązanie. Jeśli taki proces nie zostanie wprowadzony i uwzględniony w obiegu pracy zespołu, aplikacja będzie ewoluować niezsynchronizowana z zestawem testów jednostkowych, zwiększając liczbę fałszywych alarmów i zmniejszając skuteczność zestawu testów.

Mamy nadzieję, że ten krótki tekst przybliżył wam trochę zagadnienie testów jednostkowych. Jeśli chcecie przeczytać więcej na ten temat, zapraszamy do zapoznania się z lekturą Sylabusa ISTQB Poziomu Podstawowego, która z pewnością uzupełni waszą wiedzę 😊.

40
  •  
    4
    Shares
  • 4
  •  
  •  
  •