Programowanie sterowane testami
Test Driven Development (TDD) to podejście do tworzenia oprogramowania, w którym przypadki testowe są opracowywane w celu określenia i sprawdzenia, co zrobi kod. Mówiąc prościej, przypadki testowe dla każdej funkcjonalności są tworzone i testowane jako pierwsze, a jeśli test się nie powiedzie, wówczas nowy kod jest napisany w celu przejścia testu i uczynienia kodu prostym i wolnym od błędów.
Programowanie sterowane testami rozpoczyna się od zaprojektowania i stworzenia testów dla każdej małej funkcjonalności aplikacji. TDD instruuje programistów, aby pisali nowy kod tylko wtedy, gdy automatyczny test zakończy się niepowodzeniem. Pozwala to uniknąć powielania kodu. Pełna forma TDD to rozwój oparty na testach.
Prostą koncepcją TDD jest napisanie i poprawienie testów zakończonych niepowodzeniem przed napisaniem nowy kod (przed opracowaniem). Pomaga to uniknąć powielania kodu, ponieważ piszemy niewielką ilość kodu na raz, aby przejść testy. (Testy to nic innego jak wymagania, które musimy przetestować, aby je spełnić).
Programowanie sterowane testami to proces tworzenia i uruchamiania zautomatyzowanego test przed faktycznym rozwojem aplikacji. Stąd TDD czasami nazywane także Test First Development.
W tym samouczku dowiesz się więcej o –
- Jak przeprowadzić test TDD
- TDD Vs. Testowanie tradycyjne
- Co to jest TDD akceptacji i TDD programisty
- Skalowanie TDD za pomocą Agile Model Driven Development (AMDD)
- Test Driven Development (TDD) vs. Agile Model Driven Development (AMDD)
- Przykład TDD
- Zalety TDD
Jak przeprowadzić test TDD
Poniższe kroki określają, jak przeprowadzić test TDD,
- Dodaj test.
- Uruchom wszystkie testy i zobacz, czy jakikolwiek nowy się nie powiedzie.
- Napisz kilka
- Uruchom testy i refaktoryzuj kod.
- Powtórz.
Cykl TDD definiuje
- Napisz test
- Uruchom go.
- Zmień kod aby to naprawić, np. Refaktoryzuj.
- Powtórz proces.
Kilka wyjaśnień na temat TDD:
- TDD nie dotyczy „testowania” ani o „Projektowaniu”.
- TDD nie oznacza „napisać kilka testów, a następnie zbudować system, który przejdzie testy.
- TDD nie oznacza„ wykonywać wiele testów. „
TDD kontra tradycyjne testy
Podejście TDD to przede wszystkim technika specyfikacji. Zapewnia, że kod źródłowy jest dokładnie testowany w poziom.
- W przypadku tradycyjnego testowania pomyślny test znajduje co najmniej jeden błąd. To jest to samo, co TDD. Kiedy test się nie powiedzie, osiągnąłeś postęp, ponieważ wiesz, że musisz rozwiązać problem.
- TDD zapewnia, że Twój system faktycznie spełnia zdefiniowane dla niego wymagania. Pomaga budować zaufanie do systemu.
- W TDD większy nacisk kładzie się na kod produkcyjny, który weryfikuje, czy testowanie będzie działać poprawnie. W tradycyjnym testowaniu większy nacisk kładzie się na projektowanie przypadków testowych. Czy test wykaże prawidłowe / niewłaściwe wykonanie aplikacji w celu spełnienia wymagań.
- W TDD uzyskujesz test pokrycia 100%. Testowana jest każda linia kodu, w przeciwieństwie do tradycyjnego testowania.
- Połączenie zarówno tradycyjnego testowania, jak i TDD prowadzi do tego, że ważniejsze jest testowanie systemu, a nie doskonalenie systemu.
- W Modelowanie zwinne (AM), należy „testować w celu”. Powinieneś wiedzieć, dlaczego coś testujesz i na jakim poziomie powinno to zostać przetestowane.
Co to jest TDD akceptacji i TDD dewelopera
Istnieją dwa poziomy TDD
- Acceptance TDD (ATDD): Za pomocą ATDD piszesz pojedynczy test akceptacyjny. Ten test spełnia wymagania specyfikacji lub potwierdza zachowanie systemu. Następnie napisz wystarczającą ilość kodu produkcyjnego / funkcjonalnego, aby spełnić ten test akceptacyjny. Test akceptacyjny koncentruje się na ogólnym zachowaniu systemu. ATDD był również znany jako Behavioral Driven Development (BDD).
- Developer TDD: Za pomocą Developer TDD piszesz pojedynczy test programisty, tj. test jednostkowy, a następnie tylko tyle kodu produkcyjnego, aby wykonać ten test. Test jednostkowy skupia się na każdej małej funkcjonalności systemu. Deweloper TDD jest po prostu nazywany TDD.
Głównym celem ATDD i TDD jest określenie szczegółowych, wykonywalnych wymagań dla rozwiązania na zasadzie just in time (JIT). JIT oznacza branie pod uwagę tylko tych wymagań, które są potrzebne w systemie. Więc zwiększ wydajność.
Skalowanie TDD za pomocą Agile Model Driven Development (AMDD)
TDD jest bardzo dobry w szczegółowej specyfikacji i walidacji. Nie udaje mu się przemyśleć większych problemów, takich jak ogólny projekt, użytkowanie systemu lub interfejs użytkownika.AMDD rozwiązuje problemy ze skalowaniem Agile, których nie rozwiązuje TDD.
Dlatego AMDD używane do większych problemów.
Cykl życia AMDD.
W przypadku projektowania opartego na modelach (MDD) obszerne modele są tworzone przed kod źródłowy. Którzy z kolei mają zwinne podejście?
Na powyższym rysunku każde pole reprezentuje czynność programistyczną.
Przewidywanie to jeden z procesów TDD polegający na przewidywaniu / wyobrażaniu sobie testów, które zostaną przeprowadzone w pierwszym tygodniu projektu. Głównym celem wizualizacji jest określenie zakresu systemu i architektury systemu. Wysokopoziomowe wymagania i modelowanie architektury są wykonywane w celu pomyślnego przewidywania.
Jest to proces, w którym nie jest wykonywana szczegółowa specyfikacja oprogramowania / systemu, ale badanie wymagań oprogramowania / systemu określa ogólną strategię projektu.
- Iteracja 0: Wyobrażanie
Istnieją dwie główne podaktywacje.
- Wstępne przewidywanie wymagań.
Zidentyfikowanie wymagań wysokiego poziomu i zakresu systemu może zająć kilka dni. Głównym celem jest zbadanie modelu użycia, początkowego modelu domeny i modelu interfejsu użytkownika (UI).
- Wstępne wyobrażenia architektoniczne.
Również zidentyfikowanie architektury systemu zajmuje kilka dni. Pozwala na wyznaczenie technicznych kierunków projektu. Głównym celem jest eksploracja diagramów technologicznych, przepływu interfejsu użytkownika (UI), modeli domeny i przypadków zmian.
- Modelowanie iteracyjne:
Tutaj zespół musi zaplanować pracę, która zostanie wykonana dla każdej iteracji.
- Proces zwinny jest używany dla każdej iteracji, tj. podczas każdej iteracji nowy element pracy będzie dodawany z priorytetem.
- Najpierw o wyższym priorytecie praca zostanie uwzględniona. Dodane elementy pracy można w dowolnym momencie zmienić priorytety lub usunąć ze stosu elementów.
- Zespół omawia sposób realizacji każdego wymagania. W tym celu wykorzystywane jest modelowanie.
- Modelowanie analizy i projektowanie jest wykonywane dla każdego wymagania, które będzie wdrażane w tej iteracji.
- Modelowanie:
Jest to również znane jako modelowanie just in time.
- Tutaj sesja modelowania obejmuje zespół 2/3 członków, którzy omawiają problemy na papierze lub tablicy.
- Jeden członek zespołu zapyta drugiego modelować z nimi. Ta sesja modelowania zajmie około 5 do 10 minut. Gdzie członkowie zespołu zbierają się, aby dzielić się tablicą / papierem.
- Eksplorują problemy, dopóki nie znajdą głównej przyczyny problemu. W samą porę, jeśli jeden z członków zespołu zidentyfikuje problem, którego chce w celu rozwiązania, szybko skorzysta z pomocy innych członków zespołu.
- Inni członkowie grupy następnie zbadają problem, a następnie wszyscy kontynuują jak poprzednio. Nazywa się to również modelowaniem stojącym lub sesjami kontroli jakości z klientami .
- Test Driven Development (TDD).
- Promuje testowanie potwierdzające kodu aplikacji i szczegółową specyfikację.
- Zarówno testy akceptacyjne (szczegółowe wymagania), jak i testy programistyczne (testy jednostkowe) są danymi wejściowymi dla TDD.
- TDD sprawia, że kod jest prostszy i przejrzysty. Pozwala programiście zachować mniej dokumentacji. li>
- Recenzje.
- Jest to opcjonalne. Obejmuje inspekcje kodu i recenzje modeli.
- Może to być zrobione dla każdej iteracji lub dla całego projektu.
- Jest to dobra opcja, aby wyrazić opinię o projekcie.
Test Driven Development (TDD) vs. Agile Model Driven Development (AMDD)
Przykład TDD
W tym przykładzie zdefiniujemy hasło klasy. Dla tej klasy postaramy się spełnić następujące warunki.
Warunek akceptacji hasła:
- Hasło powinno mieć od 5 do 10 znaków.
Najpierw piszemy kod który spełnia wszystkie powyższe wymagania.
Scenariusz 1: Aby uruchomić test, tworzymy klasę PasswordValidator ();
Będziemy działać powyżej klasy TestPassword ();
Wynik jest ZALICZONY, jak pokazano poniżej;
Wynik:
Scenariusz 2: Tutaj możemy zobacz w metodzie TestPasswordLength () nie ma potrzeby tworzenia instancji klasy PasswordValidator. Instancja oznacza utworzenie obiektu klasy w celu odniesienia się do elementów członkowskich (zmiennych / metod) tej klasy.
Usuniemy z kodu klasę PasswordValidator pv = new PasswordValidator (). Możemy wywołać metodę isValid () bezpośrednio przez PasswordValidator. IsValid („Abc123”).(Zobacz obrazek poniżej)
Więc dokonujemy refaktoryzacji (zmiany kodu) jak poniżej:
Scenariusz 3: Po refaktoryzacji dane wyjściowe pokazują stan błędu (patrz ilustracja poniżej), dzieje się tak, ponieważ usunęliśmy instancję. Nie ma więc odniesienia do niestatycznej metody isValid ().
A więc musimy zmienić tę metodę, dodając słowo „static” przed wartością logiczną jako public static boolean isValid (hasło typu String). Refaktoryzacja klasy PasswordValidator () w celu usunięcia powyższego błędu i zaliczenia testu.
Wynik:
Po wprowadzeniu zmian w klasie PassValidator () jeśli uruchomimy test, wyjście zostanie ZALICZONE, jak pokazano poniżej.
Zalety TDD
- Wczesny błąd powiadomienie.
Programiści testują swój kod, ale w świecie baz danych często składa się to z testów ręcznych lub jednorazowych skryptów. Korzystając z TDD, z biegiem czasu tworzysz zestaw automatycznych testów, które Ty i każdy inny programista możecie ponownie uruchomić w dowolnym momencie.
- Lepiej zaprojektowany, czystszy i bardziej rozszerzalny kod.
- Pomaga zrozumieć, w jaki sposób kod będzie używany i jak współdziała z innymi modułami.
- Skutkuje lepszą decyzją projektową i łatwiejszym w utrzymaniu kodem.
- TDD pozwala na pisanie mniejszego kodu z jedną odpowiedzialnością zamiast monolitycznych procedur z wieloma obowiązkami. To sprawia, że kod jest łatwiejszy do zrozumienia.
- TDD wymusza również pisanie tylko kodu produkcyjnego, aby przejść testy w oparciu o wymagania użytkownika.
- Zaufanie do Refactor
- Jeśli refaktoryzujesz kod, mogą wystąpić przerwy w kodzie. Tak więc mając zestaw testów automatycznych, możesz naprawić te przerwy przed wydaniem. Odpowiednie ostrzeżenie zostanie wyświetlone, jeśli wykryte zostaną przerwy podczas używania testów automatycznych.
- Używanie TDD powinno skutkować szybszym, bardziej rozszerzalnym kodem z mniejszą liczbą błędów, które można zaktualizować przy minimalnym ryzyku.
- Dobre do pracy zespołowej
W przypadku braku jakiegokolwiek członka zespołu, inni członkowie zespołu mogą łatwo odebrać kod i pracować nad nim. Pomaga także w dzieleniu się wiedzą, zwiększając w ten sposób ogólną efektywność zespołu.
- Dobre dla programistów
Chociaż programiści muszą spędzać więcej czasu na pisaniu przypadków testowych TDD, debugowanie i opracowywanie nowych funkcji zajmuje dużo mniej czasu. Napiszesz czystszy, mniej skomplikowany kod.
Podsumowanie:
- TDD oznacza rozwój oparty na testach. Jest to proces modyfikowania kodu w celu przejścia wcześniej zaprojektowanego testu.
- Większy nacisk kładzie się na kod produkcyjny, a nie na projektowanie przypadków testowych.
- Programowanie sterowane testami to proces modyfikowania kodu w celu przejścia wcześniej zaprojektowanego testu.
- W inżynierii oprogramowania jest to czasami znane jako „Najpierw testowanie”.
- TDD obejmuje refaktoryzację kodu, tj. zmianę / dodanie pewnej ilości kodu do istniejącego kodu bez wpływu na zachowanie kodu.
- TDD, gdy jest używany, kod staje się bardziej przejrzysty i prosty do zrozumieć.
Ten artykuł jest autorstwa Kanchana Kulkarni