Rozwój oparty na testach z JUnit 5
Streszczenie: W tej serii artykułów pokażemy, jak tworzyć bezpieczne, elastyczne aplikacje przy użyciu programowania sterowanego testami (TDD).
Streszczenie: W tej serii artykułów pokażemy, jak tworzyć bezpieczne, elastyczne aplikacje przy użyciu programowania sterowanego testami (TDD). Technika, która może znacznie przyspieszyć rozwój i wyeliminować większość koszmarów związanych z debugowaniem — wszystko z pomocą JUnit 5 i jego funkcji. Wskażemy główne koncepcje związane z TDD i zastosujemy je w opracowaniu aplikacji Java, która implementuje logikę biznesową do zarządzania lotami i pasażerami oraz przestrzega zestawu zasad. Skoncentrujemy się na jasnym wyjaśnieniu TDD i udowodnieniu jego korzyści poprzez pokazanie, jak zastosować ją w praktyce, krok po kroku.
1. Główne pojęcia TDD
Programowanie sterowane testami to praktyka programistyczna, która wykorzystuje krótki, powtarzający się cykl programistyczny, w którym wymagania są konwertowane na przypadki testowe, a następnie program jest modyfikowany w celu przejścia testów:
- Napisz test zakończony niepowodzeniem przed napisaniem nowego kodu.
- Napisz najmniejszy fragment kodu, który sprawi, że nowy test przejdzie pomyślnie.
Rozwój tej techniki przypisuje się amerykańskiemu inżynierowi oprogramowania Kentowi Beckowi. TDD wspiera proste projekty i inspiruje bezpieczeństwo: szuka “czystego kodu, który działa”.
Różni się to od tradycyjnego tworzenia oprogramowania, w którym kod można dodawać bez konieczności sprawdzania, czy spełnia on wymagania. W klasycznym podejściu tworzenie programu oznacza, że piszemy kod, a następnie wykonujemy testy, obserwując jego zachowanie. Tak więc konwencjonalny cykl rozwoju wygląda mniej więcej tak: [kod, test, (powtórz)]
TDD używa zaskakującej odmiany: [test, kod, (powtórz)]
Test kieruje projektem i staje się pierwszym klientem metody.
Korzyści TDD obejmują:
- Piszemy kod, który kieruje się jasnymi celami i upewniamy się, że adresujemy dokładnie to, czego potrzebuje nasza aplikacja.
- Wprowadzenie nowej funkcjonalności jest znacznie szybsze. Z jednej strony testy prowadzą nas do implementacji kodu, który robi to, co powinien. Z drugiej strony testy zapobiegną wprowadzaniu błędów do istniejącego działającego kodu.
- Testy służą jako dokumentacja aplikacji. Możemy ich przestrzegać i zrozumieć, jakie problemy ma rozwiązać nasz kod.
Powiedzieliśmy, że TDD używa tego cyklu rozwojowego: [test, kod, (powtórz)]. W rzeczywistości wygląda to tak: [test, kod, refaktoryzacja, (powtórz)].
Refaktoryzacja to proces modyfikowania systemu oprogramowania w sposób, który nie wpływa na jego zewnętrzne zachowanie, ale poprawia jego wewnętrzną strukturę. Aby mieć pewność, że nie wpłynie to na zachowanie zewnętrzne, musimy polegać na testach.
Kiedy otrzymujemy specyfikacje, aby dodać nową funkcjonalność do aplikacji, musimy najpierw je zrozumieć, zanim będziemy mogli dodać je do kodu. A jeśli najpierw zaimplementujemy test, który pokaże nam, co mamy zrobić, a potem pomyślimy, jak to zrobić? To jedna z podstawowych zasad TDD.
Kiedy zaczynamy pracę nad aplikacją, musimy przynajmniej zrozumieć podstawową ideę tego, co oprogramowanie ma robić. Ale jeśli chcemy sprawdzić, jakie klasy lub metody robią, nasze możliwości są ograniczone: przeczytaj dokumentację lub poszukaj przykładowego kodu, który wywołuje tę funkcjonalność. Większość programistów woli pracować z kodem. A dobrze napisane testy jednostkowe robią dokładnie to: wywołują nasz kod iw konsekwencji dostarczają działającą specyfikację funkcjonalności kodu. W rezultacie TDD skutecznie pomaga zbudować znaczną część dokumentacji technicznej aplikacji.
Interesujesz się JUnit? Sprawdź nasze szkolenia
Catalin Tudose
Java and Web Technologies Expert
Originally published at https://www.luxoft-training.pl.