Przejdź do treści

Testy Wydajnościowe 🛠. Podstawy 🔍

Hej.

Ten wpis jest pierwszym z artykułów o testach wydajnościowych. Jeżeli dopiero zaczynasz w tym temacie to bardzo dobrze trafiłeś. W trakcie tej serii poznasz podstawy i razem ze mną napiszesz pierwsze zautomatyzowane testy sprawdzające wydajność twojej aplikacji.


W dzisiejszym wpisie dowiesz się:

✅ czym są testy wydajności
✅ po co testować wydajność
✅ jakie są rodzaje testów wydajności
✅ jak wygląda flow pisania takich testów
✅ jakie metryki można zbierać
✅ przykładowe przypadki testowe

 

Zaczynajmy… 🔥🔥🔥


Czym są testy wydajności

znak-zapytania

Celem testów wydajności jest – tak jak w każdym innym rodzaju testów – sprawdzenie czy nasz program działa zgodnie z oczekiwaniami. Natomiast w tego rodzaju testach weryfikujemy nieco inne metryki. Do takich metryk mogą należeć np. szybkość, czas odpowiedzi, niezawodność, wykorzystanie zasobów czy też skalowalność programu przy oczekiwanym obciążeniu.

Testując określoną metrykę zawsze robimy jakieś założenie. Weźmy na przykład testowanie niezawodności aplikacji. Chcemy zweryfikować, że nasza aplikacja zachowuje się odpowiednio przy określonej ilości żądań do naszego serwera (zakładamy że to aplikacja webowa). Obecnie do naszego serwera trafia około 100 requestów / min. Możemy zrobić założenie ok.. a co się stanie jak zaczniemy dostawać 400 req/min? Czy nasza aplikacja dalej będzie stabilna?

Inny przykład – testowanie skalowalności. Nasz średni ruch na stronie wynosi 50 unikalnych użytkowników / min. Biznes zakłada, że w najbliższych miesiącach ruch na stronie może zwiększyć się nawet 10-krotnie. Co teraz?

Na oba powyższe przypadki nie możemy jednoznacznie odpowiedzieć, że wszystko będzie dobrze bo u kolegów którzy mają podobną aplikację działa. Musimy to jakoś zweryfikować i właśnie do tego przydadzą nam się testy wydajnościowe.

Podałem tutaj przykłady typowo webowe. Ale testowanie wydajności to nie tylko web – możemy także testować bazy danych, sieć czy też zasoby systemu operacyjnego. Co jest ważne i kluczowe do zapamiętania – celem testów wydajnościowych nie jest znalezienie usterek funkcjonalnych ale wyeliminowanie wąskich gardeł w naszym oprogramowaniu.


Po co testować wydajność

Performance Testing

Większość aplikacji na rynku komercyjnym ma lub będzie mieć klientów. Większa czy mniejsza skala – nie ważne – ważne, że ktoś polega na naszym produkcie, czymkolwiek to jest. Aplikacje biznesowe powstają dla biznesu – chyba nie muszę Cię o tym przekonywać?

Skoro aplikacje jakie tworzymy są lub mają być sprzedawane to naszym obowiązkiem jest zapewnienie, aby działały prawidłowo. Mając testy wydajnościowe w naszych aplikacjach jesteśmy w stanie zweryfikować ich działanie. Dzięki testom możemy także zakomunikować biznesowi potencjalne problemy. Będziemy też umieli odpowiedzieć na pytania z jakimi ludzie od biznesu mogą do nas przyjść, np. czy może stać się coś złego jeżeli wypuścimy nasze oprogramowanie w 3 kolejnych państwach? Bez testów wydajności ciężko nam będzie na to odpowiedzieć – a na pewno nie damy sobie za to ręki uciąć (choć dobrze radzę, nawet jak mamy takie testy to i tak nie dawajmy tej ręki).

Badanie wydajności aplikacji określi czy nasze oprogramowanie spełnia wymagania dotyczące prędkości, skalowalności czy też stabilności przy spodziewanym obciążeniu. Należy pamiętać, że produkt cechujący się niską wydajnością zyskuje złą reputację – a ten parametr cieżko jest odbudować w dzisiejszym świecie, gdzie konkurencja jest ogromna.

Ostatnim ważnym aspektem są jeszcze pieniądze. Choć mam nadzieję, że zrozumiałeś przesłankę z biznesem o której wspominałem wyżej – to mimo wszystko pamiętajmy, że każdy produkt pracuje i w jakiś sposób ma zarabiać pieniądze. Niedostępność aplikacji tylko dlatego, że źle ustawiliśmy jakiś parametr i na naszą stronę może wejść maksymalnie 10 użytkowników jednocześnie może sporo kosztować. A co by tu dużo gadać – jak w większości sytuacji wyglądają testy manualne naszych aplikacji? Kilku testerów i deweloperów nie oddają tego co się dzieje na produkcji (choć czasami może i tak).


Rodzaje testów wydajności

rodzaje testow wydajnosci

Testowanie obciążenia – sprawdza zdolność aplikacji do działania przy przewidywanym obciążeniu użytkowników. Celem jest zidentyfikowanie wąskich gardeł wydajnościowych zanim aplikacja zostanie uruchomiona.

Stress testy – polegają na testowaniu aplikacji przy ekstremalnym obciążeniu, aby sprawdzić, jak radzi sobie z dużym ruchem lub przetwarzaniem danych. Celem jest zidentyfikowanie punktu przerwania pracy aplikacji.

Testy wytrzymałościowe (endurance tests) – są wykonywane w celu upewnienia się, że oprogramowanie jest w stanie obsłużyć oczekiwane obciążenie przez długi okres czasu.

Spike testy – testuje reakcję oprogramowania na nagłe duże skoki obciążenia generowanego przez użytkowników.

Volume testy – testują zachowanie aplikacji kiedy aplikacja posiada ogromną ilość zgromadzonych danych (np. w bazie danych). Monitorowane jest ogólne zachowanie systemu. Celem badania jest sprawdzenie wydajności aplikacji pod różnym 'obciążeniem’ danych.

Testowanie skalowalności – celem testowania skalowalności jest określenie w jakim stopniu „skalowalna” jest aplikacja w przypadku wzrostu obciążenia przez użytkowników..


Flow pisania testów wydajnościowych

flow testów wydajności

  1. Zidentyfikuj środowisko testowe – określ swoje fizyczne środowisko na którym będziesz odpalać testy. Środowisko powinno być maksymalnie zbliżone do produkcyjnego (z punktu widzenia testów najlepiej gdyby to była produkcja – ale tak raczej nigdy nie będzie). Dobrze by było gdybyś poznał szczegóły dotyczące konfiguracji środowiska na jakim stoi twoja aplikacja. Pomoże to tworzyć bardziej wydajne testy. Może to również pomóc zidentyfikować i rozwiązać możliwe wyzwania i problemy które można napotkać podczas pisania testów.
  2. Określ kryteria akceptacji – jakie dokładnie są cele i ograniczenia. Przykładem może być metryka czasu odpowedzi – aplikacja ma odpowiadać zawsze w przeciągu 0.2 sekundy. Im szybciej tym lepiej ale jeżeli czasy odpowiedzi przekraczają 0.2 sekundy to nasze kryterium nie jest spełnione a więc trzeba coś poprawić.
  3. Zaplanuj i zaprojektuj testy – określ jak użycie aplikacji może się różnić pomiędzy końcowymi użytkownikami i na tej podstawie ułóż kluczowe scenariusze testowe. Konieczne jest przeprowadzenie symulacji różnych użytkowników końcowych, zaplanowanie danych jakie będą wykorzystywane podczas testów wydajnościowych oraz określenie jakie metryki zostaną zebrane.
  4. Skonfiguruj środowisko testowe – przygotuj środowisko testowe przed wykonaniem testów. Dodatkowo, należy również przygotować narzędzia wspomagające testy i inne przydatne zasoby (pliki z konfiguracjami).
  5. Napisz testy – stwórz testy zgodnie z planem testów.
  6. Przeprowadź testy – poza samym przeprowadzeniem pamiętaj o monitorowaniu testów.
  7. Analizuj, dostrajajaj i testuj ponownie – analizuj wyniki testów (warto także dzielić się tą informacją z zespołem co by wiedzieli jak się sprawy mają). Następnie dostrajaj aplikację i testuj ponownie aby sprawdzić czy nastąpiła poprawa czy spadek wydajności. Ponieważ ulepszenia na ogół maleją wraz z każdym ponownym testem, zatrzymaj się, gdy wąskie gardło jest spowodowane przez CPU. Wtedy możesz rozważać zwiększenie mocy serwerów.

Jakie metryki można zbierać

jakie metryki zbierać

  • Zużycie procesora – ilość czasu, jaką procesor poświęca na wykonywanie wątków.
  • Zużycie pamięci – ilość pamięci fizycznej dostępnej dla procesów na komputerze.
  • Czas na dysku (disk time) – ilość czasu, przez jaki dysk jest zajęty wykonywaniem żądania odczytu lub zapisu.
  • Przepustowość – bity na sekundę używane przez interfejs sieciowy.
  • Przerwania CPU na sekundę – średnia liczba sprzętowych przerwań, które procesor odbiera i przetwarza co sekundę.
  • Czas odpowiedzi – czas od momentu wprowadzenia żądania przez użytkownika do otrzymania pierwszego znaku odpowiedzi.
  • Wydajność – szybkość, z jaką komputer lub sieć odbiera żądania w ciągu sekundy.
  • Wielkość puli połączeń – im więcej żądań zostanie zrealizowanych przez połączenia w puli, tym lepsza będzie wydajność.
  • Maksymalna liczba aktywnych sesji – maksymalna liczba sesji, które mogą być aktywne na raz.
  • Liczba wywołań na sekundę (hits per second) – liczba uderzeń na serwerze WWW podczas każdej sekundy testu obciążeniowego.
  • Nadjłuższe czasy oczekiwania – są monitorowane w celu określenia, jakie czasy oczekiwania mogą być skrócone.
  • Liczenie wątków – stan aplikacji może być mierzony na podstawie liczby działających i aktualnie aktywnych wątków.
  • GC (garbage collection) – ma to związek z przywracaniem niewykorzystanej pamięci z powrotem do systemu. GC musi być monitorowany pod kątem wydajności.

Przykładowe przypadki testowe

  • Sprawdzenie czy czas reakcji nie przekracza 2 sekund gdy 3000 użytkowników jednocześnie używa aplikacji.
  • Zweryfikowanie maksymalnej liczby użytkowników których aplikacja może obsłużyć zanim się wyłoży.
  • Jak zachowuje się nasza baza danych, gdy jednocześnie odczytywanych/zapisywanych jest 1000 rekordów.
  • Sprawdzenie zużycia procesora i pamięci aplikacji oraz serwera bazy danych w warunkach szczytowego obciążenia.
  • Zmierzenie czasów reakcji aplikacji w warunkach niskiego, średniego i dużego obciążenia.

Podczas rzeczywistego wykonywania testów wydajności, niejasne stwierdzenia jak np. duże obciążenie, jak zachowuje się xxx, itp. są zastępowane przez konkretne liczby. Osoba wykonująca testy powinna ustawić te liczby zgodnie z wymaganiami biznesowymi i możliwościami technicznymi aplikacji.


Podsumowanie

Przed wprowadzeniem na rynek jakiegokolwiek produktu oprogramowania konieczne zalecane jest przeprowadzenie testów wydajności. Zapewnia to satysfakcję klienta i chroni biznes przed awarią produktu. Koszty testowania wydajności są wysokie– bo należy zatrudnić do tego ekspertów, posiadać i dostroić odpowiednio środowisko, zaangażować biznes oraz deweloperów do wymiany wiedzy. Mimo wszystko, poniesione koszty są zazwyczaj nadrobione dzięki poprawie zadowolenia klienta. A jeżeli klient jest zadowolony to może do nas wrócić lub nas polecić.


Za tydzień

Skoro już wiemy czym są testy wydajnościowe, dlaczego warto je pisać i jakie metryki zbierać, za tydzień ogarniemy narzędzie JMeter. Opiszę jego najważniejsze funkcjonalności i jak się nim posługiwać. Standardowo w sobotę o 12.

Ps. jeżeli doszedłeś do tego miejsca – daj znać w komentarzu czy na swoich projektach piszesz testy wydajnościowe? Jak tak – to jakich narzędzi używacie. A jak nie – to możesz napisać że czekasz na kontynuację bo chcesz to ogarnąć i zwiększyć swoją wiedzę. Dzięki 🙂

5 5 votes
Article Rating
Subscribe
Powiadom o
guest
1 Komentarz
najnowszy
najstarszy oceniany
Inline Feedbacks
View all comments
Kinga
Kinga
4 lat temu

Świetny artykuł!

1
0
Would love your thoughts, please comment.x