Co zrobić, gdy zgubisz się w testowaniu API?

(12 maja 2020 r.)

Jeśli nie piszesz jeszcze testów, powinieneś zacząć. Testy poprawią jakość Twojego kodu, zmniejszą liczbę błędów i prawdopodobnie zmusią Cię do zastanowienia się nad projektem i jakością. Właściwie najtrudniej jest zacząć i dowiedzieć się, jakiego typu testy napisać.

Więc zaczynasz googlować i znajdujesz wiele typów testów: jednostkowy, integracyjny, akceptacyjny, funkcjonalny, systemowy, dymny, e2e… Niektóre zasoby mówią, że musisz mieć 100\% pokrycia, inne powiedzą, że pełne pokrycie nie oznacza, że ​​twój kod jest w pełni przetestowany. Nawet jeśli zdecydujesz, jakiego rodzaju testów użyć, może być trudno zdecydować, jak przetestować określoną logikę w Twojej aplikacji.

Nie poddawaj się! Mamy kilka wskazówek, których nauczyliśmy się po drodze i miejmy nadzieję, że ułatwi Ci to życie.

Nie próbuj testować wszystkiego za pomocą samych testów funkcjonalnych

To jest błąd numer jeden programiści robią w testowaniu. Więc wyjaśnijmy to najpierw.

Testy funkcjonalne w REST Api oznaczałyby wysłanie żądania na jeden punkt końcowy i potwierdzenie jego odpowiedzi. Jeśli Twoja trasa ma wiele różnych przypadków, w których może działać logika domeny, musisz napisać osobny test dla każdego przypadku, aby upewnić się, że wszystkie działają.

Może to działać nawet w bardzo małej aplikacji, ale tak jak Gdy Twoja aplikacja się rozrośnie, będzie to bardzo trudne w utrzymaniu i będzie bardzo powolne. W pewnym momencie zaczniesz tracić więcej czasu na naprawianie i konserwowanie testów niż na faktyczną pracę nad aplikacją. Nie o to chodzi w testach. Dowiedzieliśmy się tego na własnej skórze.

Piramida testowa

Piramida testowa to wykres informujący nas, ile testów należy napisać na każdej warstwie.

Dolne warstwy są szybsze i dlatego musimy jak najwięcej objąć testami jednostkowymi i integracyjnymi. Im wyższy poziom uzyskasz, tym mniej testów powinieneś mieć. Usłyszysz różne nazwy dla poszczególnych warstw, ale logika stojąca za nimi jest taka sama.

Piramida testowa

Testy jednostkowe

Zacznijmy więc od początku – testy jednostkowe. Oto definicja:

Testowanie jednostkowe to poziom testowania oprogramowania, na którym testowane są poszczególne jednostki / składniki oprogramowania. Celem jest sprawdzenie, czy każda oddzielna jednostka oprogramowania działa zgodnie z oczekiwaniami. Jednostka jest najmniejszą możliwą do przetestowania częścią dowolnego oprogramowania.

Oznacza to, że należy testować każdą metodę oddzielnie i kpić z wszystkich innych metod.

To nie jest testy jednostkowe, to Ty!

Testy jednostkowe są dobre nie tylko do upewnienia się, że Twój kod działa, ale także do przeprowadzenia pewnych zmian. Powinny być łatwe do napisania. Jeśli masz problemy z testowaniem określonego fragmentu kodu, oznacza to, że Twój kod jest źle napisany i powinien zostać ponownie przetworzony. Pomogą Ci w tym SOLIDNE zasady . SOLID to zbiór zasad projektowania do pisania czystego, eleganckiego i czytelnego kodu. Jeśli napiszesz solidny kod, testy jednostkowe będą bułką z masłem.

Zasadniczo dzięki testom jednostkowym upewniasz się, że każda izolowana metoda w kodzie działa tak, jak powinna. Oznaczałoby to, że cały kod działa zgodnie z oczekiwaniami, prawda? Nie całkiem. Musisz również upewnić się, że poszczególne komponenty dobrze ze sobą współpracują. I tu właśnie przychodzą testy integracji.

Testy integracji

Testowanie integracyjne to faza testowania oprogramowania, w której poszczególne moduły oprogramowania są łączone i testowane jako grupa.

Dobrym przykładem, gdy test jednostkowy nie wystarczy, jest zapytanie do bazy danych budowniczych. W testach jednostkowych możesz upewnić się, że wywołałeś warunki, które chcesz w zapytaniu, ale jeśli zapytanie jest bardziej skomplikowane, nie możesz mieć pewności, że użyte warunki zwrócą oczekiwany wynik, dopóki nie wykonasz rzeczywistego wywołania bazy danych. Więc to tutaj powinien pojawić się test integracji, który uruchamia zapytanie w testowej bazie danych i potwierdza oczekiwane wyniki.

Przypadki, w których potrzebujesz testów integracji:

  • Weryfikacja poprawnej integracji z 3 biblioteki stron lub interfejsy API
  • Weryfikacja dwóch lub więcej modułów, które mają testy jednostkowe, działają razem zgodnie z oczekiwaniami

Testy funkcjonalne

Testowanie funkcjonalne definiuje się jako testowanie pełnej funkcjonalności jakiejś aplikacji.

Są znacznie prostsze do napisania w API w porównaniu z aplikacjami z interfejsem użytkownika. Testy funkcjonalne dla API powinny polegać na wysyłaniu rzeczywistych żądań do punktów końcowych API i sprawdzaniu formatu odpowiedzi. Powinieneś przetestować każdą trasę pod kątem pomyślnej odpowiedzi i błędu.

Ale nie rób tego przesadnie, nie potrzebujesz testu dla każdego możliwego błędu. Powinno to już być objęte testami jednostkowymi i integracyjnymi.Tutaj chcesz się tylko upewnić, że Twoja trasa zwraca prawidłowy format odpowiedzi na błąd. Jeśli Twoje trasy mają różne role, powinieneś również przetestować odpowiedź na błąd bezpieczeństwa.

Oto kilka pomocnych narzędzi, które ułatwią pisanie testów funkcjonalnych:

  • PHP Matcher – Biblioteka, która umożliwia sprawdzenie odpowiedzi pod kątem wzorców. Możesz ustawić oczekiwany wzorzec dla każdego pola w swojej odpowiedzi, zamiast potwierdzać rzeczywiste wartości w bazie danych. W ten sposób możesz przetestować tylko format odpowiedzi i typy pól bez obawy, że w testowej bazie danych zmieni się jakiś ciąg lub liczba.
  • Testy listonosza – możesz napisać swoje testy funkcjonalne w programie Postman, co jest bardzo przydatne dla zespołu frontendowego, będą mogli sprawdzić i wypróbuj punkty końcowe API. Będzie jak interaktywna dokumentacja API. Możesz zintegrować testy Postmana z Newman – programem uruchamiającym z wiersza poleceń, który umożliwia uruchamianie testów w wierszu poleceń i integrowanie ich w Ciągła integracja (CI) .
  • Faker – biblioteka do generowania fałszywych danych dla twojej testowej bazy danych

Idź o krok dalej

Teraz, gdy wiesz, że Twój kod działa, możesz sprawdzić jego wydajność.

Testowanie obciążenia

Testowanie obciążenia sprawdza, czy Twoje API reaguje zgodnie z oczekiwaniami na różnych serwerach.

Testy warunków skrajnych

Sprawdzanie, czy API działa zgodnie z oczekiwaniami, gdy odbiera dużą liczbę żądań w tym samym czasie.

Czy muszę mieć 100\% pokrycia?

100\% pokrycia nie gwarantuje, że Twój kod będzie w pełni przetestowany i działający. Oznacza to tylko, że testy wykorzystywały każdą linię Twojego kodu, ale z pewnością pomocne jest sprawdzenie pokrycia kodu, aby sprawdzić, czy nie udało Ci się uwzględnić niektórych części kodu.

Dowiedzieliśmy się, że pisanie nie przynosi korzyści testy prostych metod, takich jak metody pobierające i ustawiające. Ich napisanie i utrzymanie zajmuje trochę czasu, zwłaszcza w przypadku dużych projektów.

Chociaż testy wyeliminują większość potencjalnych błędów, nadal będą istnieć pewne skrajne przypadki, o których nie pomyślałeś. Jeśli pojawi się błąd, pamiętaj, aby najpierw odtworzyć go za pomocą nowych testów, a następnie naprawić kod. W ten sposób poprawi się Twój zasięg i będziesz mieć pewność, że objęłaś tę sprawę. Może to być również świetny sposób na rozpoczęcie pracy z dotychczasowymi projektami, które nie mają jeszcze testów.

Oto kilka przydatnych narzędzi do sprawdzania jakości kodu i testów:

  • Infekcja – narzędzie do testowania mutacji. Testowanie mutacji ocenia jakość istniejących testów. Testowanie mutacji modyfikuje program w niewielkim stopniu i oczekuje, że testy zakończą się niepowodzeniem, co oznacza, że ​​mutant zostanie zabity. Po każdym zdanym teście mutant pozostaje żywy. Zestawy testów są mierzone odsetkiem zabitych mutantów. Testowanie mutacji zapewnia kryterium testowania zwane wskaźnikiem mutacji (MSI) . MSI mierzy skuteczność zestawu testowego pod względem jego zdolności do wykrywania błędów. Możesz także zintegrować go z CI i ustawić minimalne MSI wymagane do pomyślnego przejścia CI.
  • PHPStan – PHPStan skupia się na znajdowaniu błędów w kodzie bez jego uruchamiania. Wyłapuje całe klasy błędów jeszcze przed napisaniem testów dla kodu. Zbliża PHP do języków kompilowanych w tym sensie, że poprawność każdego wiersza kodu można sprawdzić przed uruchomieniem właściwego wiersza.
  • Ciągła integracja (CI) – umożliwia uruchamianie testów na git przy każdym zatwierdzeniu. Zapobiegnie to połączeniu PR z negatywnymi testami.

Podsumowanie

Łatwo jest zagubić się we wszystkim, co odkrywasz o pisaniu testów. Głównym celem testowania powinno być upewnienie się, że kod działa i jest łatwy w utrzymaniu. Jeśli dopiero zaczynasz testować, może się wydawać, że zajmują one zbyt dużo czasu, ale nie poddawaj się, gdy już je opanujesz, znacznie ułatwi to i przyspieszy twoje życie związane z kodowaniem. 🙂

Ta twórczość została pierwotnie opublikowana na Locastic.com – https://locastic.com/blog/what-to-do-when- zgubisz-w-testowaniu-api /

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *