Blog
17/01/2024
EP

Przewodnik po testach wydajnościowych

Dla przedsiębiorstw niezwykle istotne jest, aby oferowane usługi były niezawodne. Najkrótsza przerwa w działaniu serwisów może wygenerować ogromne straty finansowe. Nawet w najbardziej krytycznych momentach, takich jak problemy z siecią, cyberataki lub zagrożenia wirtualne, aplikacje i witryny powinny działać nieprzerwalnie. Wykorzystując różne typy testów wydajności możliwe jest odnalezienie niedoskonałości infrastruktury i poprawę ich, dzięki czemu przedsiębiorstwo jest w stanie zagwarantować odporność i niezawodność swoich usług.

Pozytywy przeprowadzania testów wydajności w liczbach
Nieoczywistym powodem, dla którego należy testować wydajność systemów informatycznych jest
wpływ na przychody. Zgodnie z badaniami, które przeprowadziła firma The Financial Times Ltd. liczba
przeczytanych artykułów zamieszczonych na stronie przedsiębiorstwa spadła o 7,9% przez opóźnienia w trzech
pierwszych sekundach ładowania strony internetowej. Ponadto użytkownicy witryny czytają mniejszą liczbę
publikacji, w przypadku gdy wydajność systemu jest niska. W związku z tym realizatorzy badań zaznaczyli,
że 20% klientów, realizujących zakupy online porzuci koszyk internetowy, ze względu na niewydajny proces
zakupowy. Ma to ogromny wpływ na sprzedaż i przychody firm koncentrujących się na sprzedaży e-commerce.
Zgodnie z badaniami 79% użytkowników, jest mniej skłonne do ponownych zakupów, jeśli na witrynie
występowały opóźnienia [1].
Badanie oparte na anonimowych danych Google Analytics, DoubleClick AdExchange oraz WebPagetest
pozwoliły dojść do wniosku, iż witryny, których czas ładowania wynosił do 5 sekund, zanotowały dwukrotnie
większe przychody, niż witryny o czasie ładowania do 19 sekund. Ponadto przeprowadzona analiza wykazała,
że 53% klientów rezygnuje z korzystania z systemu informatycznego, gdy czas ładowania przekracza 3 sekundy.
Witryny dbające o wydajność mają o 70% większe długości sesji użytkowników [2].

Typy testów wydajności
Planowanie skutecznej strategii testów wydajnościowych jest złożone, ponieważ wyróżnia się wiele
wyspecjalizowanych typów tego rodzaju testów. Każdy z nich umożliwia analizę odmiennego aspektu systemu,
w zależności od wybranych warunków obciążenia.

Testy obciążenia
Jednym z głównych typów testów wydajności są testy obciążenia (ang. load testing). Charakteryzują
się one tym, że liczba jednoczesnych użytkowników, wykonujących określony scenariusz testowy
jest zwiększana stopniowo, aż do osiągnięcia ustalonej wartości progowej. Przy pomocy tego rodzaju testów
możliwe jest wykrycie wąskich gardeł systemu informatycznego, które przykładowo mogą objawiać się przez
opóźnienia systemu lub problemy z załadowaniem się stron internetowych. Istotne jest, aby przed
przystąpieniem do testów, określone zostały wymagania, na które składa się maksymalna liczba jednoczesnych
użytkowników, skok o jaki ich liczba będzie zwiększana oraz akceptowalne czasy odpowiedzi. Testy obciążenia
przeprowadzane są w kontrolowanych warunkach, a ich rezultaty potrafią odpowiedzieć na pytanie,
czy system ma możliwość bezawaryjnej obsługi założonej w specyfikacji projektu ilości jednoczesnych
użytkowników?

  Rysunek 1. Wykres liczby jednoczesnych użytkowników w czasie podczas testów obciążenia.
                                                                          Źródło własne

Testy przeciążenia
W przypadku potrzeby sprawdzenia górnych granic systemu w kontekście wydajności,
przeprowadzane są testy przeciążenia (ang. stress testing). Dzięki temu rodzajowi testów weryfikowana
jest stabilność oprogramowania, w momencie gdy zasoby, takie jak: pamięć, miejsce na dysku, procesor
nie są wystarczające. Testy przeciążenia pozwalają również na sprawdzenie, w jaki sposób zachowa się system
informatyczny, gdy obciążenie spadnie do ilości jednoczesnych użytkowników, którą system bezawaryjnie
obsługuje. Dzięki temu twórcy oprogramowania mają możliwość określenia, czy po awarii spowodowanej dużą
liczbą klientów, system powróci do prawidłowego działania sprzed niesprawności. Testy przeciążenia
pozwalają również na weryfikację, czy nie nastąpiły wycieki pamięci, uszkodzenia danych lub awarie
bezpieczeństwa. Przed wykonaniem tego rodzaju testów ważne jest wyznaczenie ilości wirtualnych
użytkowników, dzięki której możliwe będzie przekroczenie limitów infrastruktury.

    Rysunek 2. Wykres liczby jednoczesnych użytkowników w czasie podczas testów przeciążenia.
                                                                        Źródło własne

Testy skalowalności
Testy skalowalności (ang. scalability testing) przeprowadzane są w celu określenia możliwości rozwoju
systemu informatycznego. Wiele firm stosuje w swoich rozwiązaniach dynamicznie rozwijające
się oprogramowanie. W związku z tym przedsiębiorstwo pokrywa koszty wyłącznie za zasoby, które faktycznie
zostały wykorzystane. To rozwiązanie jest korzystne, jeśli zapotrzebowanie na moc obliczeniową nie jest stałe.
Przedsiębiorcy nie są zmuszeni inwestować w dodatkowy sprzęt, a uzupełniające zasoby przydzielane
są automatycznie, w związku z czym nie ma konieczności stałego monitoringu infrastruktury przez
pracowników. Skalowanie najczęściej wykorzystywane jest w rozwiązaniach chmurowych lub bazach danych.
Dzięki realizacji testów skalowalności, dostawcy usług mają możliwość identyfikowania przyczyn przerwania
skalowania się infrastruktury.

W przeciwieństwie do testów obciążenia i przeciążenia, dla tego typu testów nie jest konieczne
określenie dokładnych wolumenów. Testy skalowalności zazwyczaj przeprowadzane są do momentu,
gdy system informatyczny nie ma już możliwości rozszerzenia, co jest przyczyną jego awarii.
Istotnymi pomiarami, na które należy zwrócić uwagę podczas testów skalowalności jest wykorzystanie
procesora, pamięci, sieci i bazy danych. Mniejszą wartość mają w tym przypadku metryki, takie jak: obsłużona
liczba jednoczesnych użytkowników i liczba transakcji na sekundę.
Testy skalowalności pomagają też w ocenie, czy podczas spadku ilości jednoczesnych użytkowników,
system informatyczny skaluje się w dół, aż do osiągnięcia ustalonego minimum zasobów. W trakcie takich
testów należy się upewnić, czy zasoby są zwalniane, koszty infrastruktury maleją i nie występują przy tym
problemy z wyciekami pamięci, co jest częstym przypadkiem.

Testy skokowe
W ocenie zdolności aplikacji do obsługi nagłych wzrostów obciążenia służą testy skokowe (ang. spike
testing). Charakteryzują się one bardzo dużym wzrostem ilości jednoczesnych użytkowników w krótkim czasie
i powrotem do wcześniejszego, stabilnego stanu. Testowana jest dzięki temu awaryjność systemu w przypadku
nagłego wzrostu obciążenia oraz zdolność do poprawnego funkcjonowania po tym wzroście. Testy skokowe
uznawane są za weryfikację warunków skrajnych.
Z definicji testy skokowe przypominają testy przeciążenia. Różnica polega na tym, że nagłych wzrostów
ilości jednoczesnych użytkowników w testach skokowych w trakcie jednej sesji testów jest kilka. Pomiędzy
kolejnymi skokami obciążenia system potrzebuje czasu na stabilizację i powrót do optymalnego działania.
Czas regeneracji systemu powinien być jak najkrótszy.

           Rysunek 3. Wykres liczby jednoczesnych użytkowników w czasie podczas testów skokowych.
                                                                          Źródło własne

Testy wytrzymałościowe
Testy wytrzymałościowe (ang. endurance testing) pozwalają na ocenę wydajności systemu
informatycznego w przypadku długotrwałego obciążenia. Przeprowadzane są one zazwyczaj w ciągu kilku dni
lub nawet kilku miesięcy. Ten typ testów pozwala na weryfikację stabilności systemu informatycznego,
poddanego dużemu obciążeniu w zadanym okresie czasu. Ponadto istnieje możliwość sprawdzenia,
czy nie wystąpiły awarie związane z pojemnością zasobów, jak na przykład wycieki pamięci oraz wykorzystanie
puli wątków mających dostęp do baz danych. Obserwacje zarejestrowane podczas testów
wytrzymałościowych mogą posłużyć do udoskonalania parametrów badanych komponentów.
Często jednak trudno jest określić, ile czasu powinien trwać test wytrzymałościowy. W tym wypadku
nie istnieją jednoznaczne wytyczne ani sugestie. Czas trwania może zależeć od dostępnego budżetu
lub sprecyzowanych wymagań. Testy wytrzymałościowe mogą przyczynić się do wystąpienia awarii systemu
informatycznego, które mogą spowodować znaczne zakłócenia. Testowanie na środowisku produkcyjnym
niesie ze sobą ryzyko, że odbiór produktu dla klientów będzie utrudniony, natomiast na środowisku testowym
może mieć negatywny wpływ na programistów i testerów, wykonujących swoją pracę z jego wykorzystaniem.
Odizolowanie środowiska tylko w celach przeprowadzenia długotrwałych testów wytrzymałościowych
jest niezwykle kosztowne. Dlatego też realizacja tego typu testów może przynieść więcej strat niż zysków.

Testy współbieżności
Błędy związane ze współbieżnością są bardzo trudne do znalezienia podczas testów manualnych
czy automatycznych. W związku z tymi problemami wykonuje się testy współbieżności (ang. concurrency
testing). Polegają one na tym, że określona liczba jednoczesnych użytkowników wykonuje zadany scenariusz
testowy w tym samym czasie. Dzięki temu możliwa jest ocena zachowania systemu informatycznego przy
dużym obciążeniu, które skupia się na jednym, wybranym procesie.
Testowanie systemu współbieżnego jest trudniejsze niż systemu sekwencyjnego ze względu na brak
determinizmu i problemów z synchronizacją. Testy takich procesów pomagają, na przykład, w identyfikacji
skutków jednoczesnego dostępu do tych samych rekordów bazy danych, modułów lub kodu projektu. Ponadto
testy współbieżności pozwalają na zidentyfikowanie i zmierzenie poziomu zakleszczeń, blokad oraz ograniczeń
w dostępie do współdzielonych zasobów.

Testy przepustowości
Testy przepustowości (ang. capacity testing) pozwalają na weryfikację, czy system informatyczny
będzie działał stabilnie przy ilościach jednoczesnych użytkowników i ilościach transakcji, do obsługi których
został zaprojektowany. Dzięki przeprowadzeniu tego typu testów można również odpowiedzieć na pytanie,
kiedy należy zwiększyć zasoby środowiska, tak, aby zapotrzebowanie zostało zaspokojone?
Realizacja testów przepustowości pomaga w poznaniu ograniczeń oprogramowania, co może
być motywacją do wprowadzenia usprawnień procesów, rozwoju infrastruktury, aby była bardziej wydajna.
W odróżnieniu od testów obciążenia, które skupione są na weryfikacji zachowania oprogramowania
pod obciążeniem, testy przepustowości polegają na sprawdzeniu doświadczeń użytkownika, tak,
aby w rezultacie zapewnić jak najlepszy odbiór produktu przez klientów.


Każdy typ testów wydajnościowych reprezentuje różne scenariusze, dotyczące rozłożenia ruchu
użytkowników, korzystających jednocześnie z systemu informatycznego w zadanym czasie. To, który rodzaj
testów należy wykonać, powinno zostać zdefiniowane na poziomie doprecyzowania wymagań. W przypadku
rozwoju istniejących już systemów informatycznych, do oceny wyboru typu testów wydajnościowych mogą
posłużyć historyczne dane, o ile w projekcie wdrożona jest analityka i monitoring. Bywają jednak sytuacje,
kiedy trudno jest jednoznacznie określić, jaki rodzaj testów powinien zostać przeprowadzony. W takich
przypadkach często realizowane jest kilka różnych typów testów wydajności w trakcie odrębnych sesji
testowych.
                                                                                                                                                   Paulina Stelmasiak, Inżynier Testów

Bibliografia
[1]  
https://speedy.site/how-does-page-load-time-affect-your-site-revenue/

[2] https://www.marketingdive.com/news/google-53-of-mobile-users-abandon-sites-that-take-over-3-seconds-to-load/426070/

 

Zobacz też...