Co to jest testowanie jednostkowe?
Testowanie jednostkowe jest zrozumiałym słowem, jeśli się rozumie, co rozumie się przez Unit. Jednostka jest najmniejszym możliwym fragmentem kodu, który można logicznie odizolować od systemu. Oznacza to, że każdy fragment kodu, który może przyjmować dane wejściowe, wykonywać zadania i generować dane wyjściowe, nawet jeśli jest niezależny od całego systemu lub rozwiązania, można nazwać Jednostką. Testowanie tego fragmentu kodu w celu wygenerowania oczekiwanego wyniku na danym zestawie danych nazywa się testowaniem jednostkowym.
Rodzaje testów jednostkowych
Omówmy niektóre rodzaje testów jednostkowych.
1) Testowanie ręczne
Ręczne testowanie kodu wymaga od programisty ręcznego debugowania każdego wiersza kodu i przetestowania go pod kątem dokładności. Może to wymagać zestawu instrukcji krok po kroku, jeśli funkcjonalność jest złożona.
2) Automatyczne testowanie
W testach automatyzacji programista zapisuje kod w celu przetestowania kodu. Jest to generalnie wspomagane przez ramy testów jednostkowych, które nie są wdrażane w produkcji. Innym razem programista może napisać kod testowy bez frameworka i ręcznie skomentować go przed wdrożeniem.
Testowanie ręczne w większości przypadków wydaje się czasochłonne. Ale w niektórych przypadkach, gdy pisanie automatycznych przypadków testowych na każdy scenariusz nie jest możliwe, często preferowaną metodą jest instrukcja.
Dlaczego testowanie jednostkowe jest ważne?
Aby zrozumieć znaczenie testów jednostkowych, musimy spojrzeć na szerszy obraz. Jest to część cyklu życia oprogramowania. Zobaczmy pokrótce pozostałe części, aby lepiej zrozumieć rolę testów jednostkowych.
Powyższy obraz jest prostą ilustracją normalnego cyklu życia oprogramowania i związanych z nim procesów testowania. Nie trzeba dodawać, że w zależności od struktury projektu cały proces zmienia się wraz z dodawaniem i usuwaniem niektórych składników. Proces testowania z pewnością obejmuje jednak cztery typy opisane poniżej:
- Testowanie jednostkowe - podstawowy poziom całego procesu testowania. Jest to wykonywane przez twórcę komponentu lub dowolnego z jego rówieśników. W tym drugim przypadku jest on często określany jako testowanie równorzędne w świecie oprogramowania.
- Testy integracyjne - Testowanie komponentu jednostki za pomocą jego bezpośredniego modułu nadrzędnego. Celem jest sprawdzenie, czy komponent jednostki dobrze integruje się z innymi komponentami i nie spowodował nieprawidłowego działania żadnego innego komponentu.
- Testowanie systemów - Testowanie całego systemu, gdy element urządzenia zostanie umieszczony w swoim położeniu.
- Testy akceptacyjne - zwykle przeprowadzane przez firmy / klientów, sprawdzają, czy wynik jest zgodny z funkcjonalnością oczekiwaną przez użytkownika końcowego.
Zatem bardzo dobrze widać, że wszystkie procesy testowe opierają się na elementarnym poziomie testowania. Jeśli podstawowy poziom testowania nie zostanie przeprowadzony, wszystkie inne testy mogą spowodować daremność.
Powiedzmy, że masz kod, który składa się z dwóch części
- Oblicz odsetki złożone.
- Dodaj odsetki do kwoty głównej i oblicz zasiłek z tytułu zapadalności.
Załóżmy, że nie testowałeś jednostek żadnego z tych komponentów i przeszedłeś bezpośrednio do testowania systemu. Podczas testowania systemu pojawia się błąd, że wartość dojrzałości jest nieprawidłowa. Teraz która część kodu zawiera błąd?
- Może być w obliczaniu odsetek.
- Może to być zastosowanie logiki złożonej.
- Może to być dodatek odsetek do kwoty głównej.
Zobacz, jak to teraz zwiększa wysiłek. Można by tego wszystkiego uniknąć, gdyby oba komponenty kodu zostały przetestowane jednostkowo.
Dlaczego testowanie jednostkowe jest ważne?
- Naprawia błędy tylko na wczesnym etapie rozwoju. Oszczędza to dużo czasu, wysiłku i kosztów. Wyobraź sobie, że gdyby nie przeprowadzono testów jednostkowych, kod trafiłby do i od zespołu zapewniania jakości w przypadku bardzo prostych problemów.
- Dobre testy jednostkowe służą również do szczegółowej dokumentacji. Gdy programista pisze przypadki testów jednostkowych, nieumyślnie pisze oczekiwaną funkcjonalność kodu. Jest to po prostu dokumentacja wyjaśniająca działanie kodu.
- Ułatwia modyfikację i utrzymanie kodu. Po wprowadzeniu jakichkolwiek zmian w kodzie, uruchom ponownie testy i viola, wszystkie wady zostaną wykryte bez żadnych problemów.
- Wymusza również modułowość. Testy jednostkowe są uruchamiane na poszczególnych komponentach, co oznacza, że kod musi być jak najbardziej szczegółowy. Zapewnia to trafne podzielenie kodu na moduły.
Druga strona medalu
Ma też pewne wady. Chociaż zalety przewyższają wady i zawsze zaleca się testowanie kodu w jednostce, warto jednak znać obie strony tej samej monety.
- Testy jednostkowe, jak bardzo dokładne, mogą czasami nie wychwycić wszystkich błędów w najbardziej trywialnym kodzie. Po prostu nie można ocenić wszystkich ścieżek wykonania. Dlatego testy jednostkowe są często prostymi i negatywnymi scenariuszami.
- Wymaga to od programisty natychmiastowego myślenia i próby złamania kodu. Jest to często trudne, ponieważ postrzeganie programisty staje się stronnicze w stosunku do kodu.
Narzędzia do testowania jednostek
W branży dostępnych jest kilka narzędzi pomocnych przy automatycznych testach jednostkowych. Ułatwiają one pisanie i wykonywanie przypadków testów jednostkowych dla programisty. Świat programistów testujących jednostki jest opracowywany przez deweloperów. Niektóre z najpopularniejszych i najczęściej używanych narzędzi są wymienione poniżej.
JUnit
JUnit to bezpłatne narzędzie do testowania Java. Jest on automatycznie uwzględniany w wielu szablonach projektów dostępnych z różnymi IDE do programowania Java. Tym, co wyróżnia JUnit, jest to, że najpierw testuje dane, a następnie testuje kod po wstawieniu do niego danych. Zapewnia również stwierdzenia pozwalające zidentyfikować metody testowe.
NUnit
NUnit jest dla .Net, podobnie jak JUnit dla Java. Ma wszystkie istotne cechy JUnit, ale do programowania w języku programowania .Net. Obsługuje również równoległe uruchamianie testów.
PHPUnit
Podobnie jak JUnit i NUnit, PHPUnit to narzędzie dla programistów PHP. Obsługuje również wszystkie podstawowe funkcje dobrego narzędzia do testowania.
XUnit
Innym szkieletem, który jest bardziej ogólny niż jego odpowiedniki, jest XUnit. Obsługuje wiele języków, takich jak C ++, C #, ASP.Net itp. Posiada również funkcje podobne do innych narzędzi dostępnych na rynku.
Jtest
Parasoft Jtest to wtyczka innej firmy, która wykorzystuje frameworki open source, takie jak JUnit i dodaje rozwiązania jednym kliknięciem, aby ułatwić życie. Dzięki Jtest możesz automatycznie wygenerować kody testowe dla swojego kodu za pomocą zaledwie kilku kliknięć. Automatyzując te zadania, programista może swobodnie pracować nad logiką biznesową przypadków testowych.
QUnit
Bardzo popularny framework do testowania jednostek JavaScript. Może testować kod JavaScript zarówno po stronie klienta, jak i serwera.
Jaśmin
Kolejne bardzo szeroko stosowane narzędzie do testowania frameworków JavaScript. Ma duże wsparcie społeczności dla Angular, React itp.
JMockIt
JMockIt to narzędzie typu open source, które obsługuje także kpiny z wywołań API za pomocą składni nagrywania i weryfikacji.
Przykład przypadku testu jednostkowego
Bardzo podstawowym wymogiem każdego przypadku testowania jednostkowego jest testowany kod. Załóżmy, że mamy funkcję, która sprawdza, czy numery telefonów są poprawne (pod względem formatu), czy nie. W zależności od położenia geograficznego kryterium to może się również różnić. Nie będziemy więc podkreślać kryteriów. Zamiast tego skupimy się na przypadku testowym jednostki.
public class PhoneValidator
(
public bool IsPhoneValid(string phone)
(
/* write some code to verify if the phone is valid or not. return true, if the phone is valid. return false, if invalid. */
)
)
Teraz musimy przetestować ten fragment kodu.
Możemy to przetestować ręcznie, wprowadzając różne wartości i weryfikując dane wyjściowe. Na pierwszy rzut oka może się to wydawać łatwe, ale będzie to powtarzane zadanie, jeśli w kodzie zostaną wprowadzone jakiekolwiek zmiany.
Alternatywnie możemy napisać test jednostkowy, który może służyć jako mój walidator, o ile logika biznesowa pozostaje taka sama. Przypadek testowy jednostki nie zmieni się, nawet jeśli zmienimy kod. Napiszmy więc test jednostkowy dla powyższego kodu.
public void TestPhoneValidator()
(
string validPhone = "(123) 456-7890";
string invalidPhone = "123 45"
PhoneValidator validator = new PhoneValidator();
Assert.IsTrue(validator.IsPhoneValid(valid phone));
Assert.IsFalse(validator.IsPhoneValid(invalidPhone));
)
Jak działa powyższy kod testu jednostkowego? Zwróć uwagę na dwie instrukcje Assert. Upewniają się, że test przebiegnie pomyślnie tylko wtedy, gdy dwie linie otrzymają wartość true i false z odpowiednich wywołań funkcji IsPhoneValid.
Zapytałbyś, jakie są korzyści z napisania tego przypadku testowego? Cóż, jeśli masz tysiące numerów telefonów do sprawdzenia w dowolnym scenariuszu w świecie rzeczywistym, nie musisz ręcznie weryfikować za każdym razem, gdy debugger uderzy w kod. Wystarczy wywołać kod testowy tysiące razy, a dowiesz się, które testy przeszły, a które nie. Teraz musisz tylko sprawdzić te, które zakończyły się niepowodzeniem.
Wskazówki dotyczące testowania jednostek
- Zawsze używaj narzędzia lub frameworka obsługującego Twój język. Narzędzia ułatwiają tworzenie jednostkowych przypadków testowych. W przeciwnym razie możesz włożyć dodatkowe wysiłki.
- Chociaż jest to zalecane do wszystkiego, czasami wygodnie jest pomijać kody, które są proste i nie wpływają bezpośrednio na zachowanie systemu. Na przykład kody pobierające i ustawiające mogą być mniej skoncentrowane.
- Nigdy nie pomijaj kodów, które bezpośrednio wpływają na system lub są kluczowe dla implementacji logiki biznesowej.
- Użyj danych testowych, które przypominają dane produkcyjne.
- Izoluj swój kod. Jeśli kod zależy od danych z bazy danych, nie pisz testowego przypadku, aby wywołać bazę danych i uzyskać wartości. Zamiast tego utwórz interfejs i wyśmiewaj się z API i wywołań bazy danych.
- Przed naprawieniem błędu wynikającego z testów jednostkowych napisz skrzynkę testową, która ujawnia usterkę. Istnieją trzy powody:
- Będziesz mógł wychwycić wady regresji wynikające z Twojej poprawki.
- Twój przypadek testowy jest teraz bardziej wyczerpujący.
- Często programista jest zbyt leniwy, by po napisaniu zaktualizować swoje przypadki testowe.
- Oprócz pisania przypadków testowych weryfikujących logikę biznesową, pisz przypadki testujące również wydajność kodu. Szczególnie, gdy kody wymagają zapętlenia, wydajność jest obszarem najbardziej dotkniętym.
Rzeczy do zapamiętania
- Przypadki testów jednostkowych powinny być niezależne od
- Kod do przetestowania - Jakakolwiek zmiana w kodzie nie powinna wymagać zmiany w jednostkowym przypadku testowym, chyba że zmieni się sama logika biznesowa. Na przykład, jeśli logika wymaga teraz, aby prawidłowy numer telefonu zawsze zaczynał się od „+”, przypadek testowy urządzenia musi zostać zmieniony, w przeciwnym razie nie.
- Drugi kod - Nie powinno być żadnej interakcji ani zależności z żadnym innym fragmentem kodu lub wartością bazy danych lub czymkolwiek podobnym. Jednostka powinna być izolowana podczas testowania.
- Przestrzegaj jasnych i spójnych konwencji nazewnictwa dla przypadków testowych. Ułatwia śledzenie scenariuszy. Możesz również użyć narzędzi kontroli wersji do śledzenia przypadków testowych.
- Nigdy nie przesyłaj kodu do następnej fazy, dopóki nie zostanie to zrobione, błędy zostaną naprawione i ponownie przetestowane.
- Co najważniejsze, uczyń z tego nawyk. Jest to praktyka kodowania, którą należy wprowadzić. Im więcej kodujesz bez testowania jednostkowego, tym bardziej podatny jest na błędy.
Kariera w testowaniu jednostkowym
Chociaż testowanie jednostkowe nie jest polem jako całością, jest dodatkową strzałką w kołczanie. Jest to dobra praktyka kodowania i kiedy dobre kodery nie są preferowane?
Wniosek
Bezdyskusyjnie można stwierdzić, że testowanie jednostkowe może być czasem proste, a innym razem skomplikowane. Wtedy narzędzia i ramy przychodzą Ci z pomocą. Nawet po przeprowadzeniu testów jednostkowych kod nie jest całkowicie odporny na błędy. Właśnie wtedy rozpoczynają się procedury testowania na wyższym poziomie. Spośród tych wszystkich niepewności jedyną pewną rzeczą jest to, że konieczne jest testowanie jednostkowe.
Polecane artykuły
To był przewodnik po testach jednostkowych. Tutaj omówiliśmy znaczenie, porady, narzędzia, karierę i rodzaje testów jednostkowych wraz z ich przykładami. Możesz także przejrzeć nasze inne sugerowane artykuły, aby dowiedzieć się więcej -
- Testowanie pytań do wywiadu
- Aplikacja do testowania stron internetowych
- Cykl życia defektu w testowaniu oprogramowania
- Kariery w testowaniu oprogramowania
- Lista ram testowania dla Java