Sytuacja kobiet w IT w 2024 roku
19.03.20218 min
Grzegorz Chłopek

Grzegorz ChłopekQA Engineer

Testy wydajnościowe - jak zacząć, o czym pamiętać?

Chcesz rozpocząć pracę z testami wydajnościowymi? Sprawdź, od czego zacząć naukę, na co zwrócić szczególną uwagę oraz poznaj przydatne narzędzia.

Testy wydajnościowe - jak zacząć, o czym pamiętać?

Już sama nazwa testów wydajnościowych mówi nam na tyle dużo, że ktoś niezwiązany z branżą jest w stanie improwizować i zdefiniować je w miarę poprawny sposób. Jednak definicja to nie wszystko, a same testy wydajnościowe wymagają dobrej znajomości systemów i doświadczenia. Dlatego postaram się przybliżyć temat osobom początkującym.

Kategoryzacja testów wydajnościowych

Testy wydajnościowe (performance testing), podobnie jak testy bezpieczeństwa, należą do grupy testów niefunkcjonalnych. Oznacza to tyle, że obiektem ich badania nie są funkcje programów.

Testy wydajnościowe nie weryfikują, czy prawidłowo działają: pola, przyciski, formularze, rozwijalne listy etc., natomiast badają zachowanie aplikacji, serwisów w różnych warunkach obciążenia, wykorzystując wspomniane elementy do symulacji działań użytkownika.

Poprzez obciążenie można zrozumieć np. użytkowników korzystających z tej samej funkcji serwisu jednocześnie, np.:

  • wysyłających formularz reklamacyjny na stronie sklepu z butami, 
  • generujących rachunek telefoniczny w formie dokumentu na stronie jakiegoś operatora telekomunikacyjnego, 
  • sprawdzających wyniki zakładów w serwisie bukmacherskim.


Przykłady można mnożyć w nieskończoność. 

Rodzaje testów wydajnościowych 

Warto wspomnieć o tym, że testy wydajnościowe dzielimy na rodzaje ze względu na wielkość obciążenia, jaką będziemy stosować oraz ich cel, a więc rozróżniamy testy:

  • wydajnościowe, w których, stosuje się niskie oraz wysokie obciążenia (jednak nie maksymalne). Ten typ testów ma na celu wykazać słabe strony systemu i jest dedykowany do wyszukiwania elementów, które wykazują niższą sprawnością w stosunku do pozostałych „części” systemu (tzw. „wąskich gardeł”).
  • obciążeniowe, gdzie obciążenie jest bliskie maksymalnego, a test weryfikuje czy system jest w stanie prawidłowo funkcjonować w górnych granicach maksymalnego ustalonego obciążenia.
  • przeciążeniowe (stres testy) w których, obciążenie jest większe niż maksymalne założone, (zgodnie z nazwą) test tego typu weryfikuje zachowanie systemu w sytuacjach przeciążenia. Np. czy system uruchomił tryb awaryjny, przywrócił tryb normalny lub czy spełnia w takich warunkach normy bezpieczeństwa. 


Powyższe rodzaje testów można traktować jako przypadki testowe, mam na myśli to, że dobrze wykonane testy wydajnościowe powinny zawierać informacje o tym jak badany system zachowa się we wszystkich wariantach obciążenia (jednak nie jest to warunek konieczny).  

Niewykluczone, że będziesz pracować przy projekcie, który ograniczy się tylko jednego rodzaju badania (ze względu na oczekiwania biznesowe, wielkość budżetu lub rekomendację architekta systemu).

Jak zacząć?

Zanim rozpoczniesz tworzyć scenariusze testowe, musisz: 

  • Wiedzieć, jak działa komunikacja pomiędzy przeglądarka internetową i serwerem, poznać zasady działania protokołu HTTP, load balancera czy Content Delivery Network.
  • Poznać Kontekst biznesowy aplikacji.


W idealnym świecie dokumentacja projektu powinna rozwiązać problem, jednak w praktyce dobrze jest, gdy osoba odpowiedzialna za architekturę systemu wyjaśni wszelkie niuanse. Równie pomocne może być spotkanie z analitykiem systemu, a nawet zespołem developerów.

  • Poznać architekturę systemu, czyli schemat komunikacji pomiędzy jego komponentami.
  • Wiedzieć, jak wyglądają statystyki dla badanego systemu:
    - normalne obciążenie (średnia ilość użytkowników korzystających z serwisu)
    - maksymalne obciążenie (analogicznie maksymalna ilość użytkowników która korzystała z serwisu). 
  • Określić cel badania, czyli wskazać elementy systemu, które będę poddawane badaniu.
  • Znać możliwości maszyny testowej oraz posiadać do niej dostęp. Pamiętaj, że scenariusze testowe, stworzone lokalnie na komputerze, doraźnie będą uruchamiane za pośrednictwem zdalnej maszyny, która posiada dostateczne zasoby sprzętowe, aby móc pracować na dużej ilości wątków.  
  • Poznać podstawowe komendy terminala unix*. Samo uruchomienie testów, wstrzymanie lub ustalenie ich harmonogramu wymaga komunikacji ze zdalną maszyną za pomocą powłoki systemowej zwanej bash’em. Polecam zapoznać się z komendami: nawigacji pomiędzy katalogami, usuwanie plików, znajdowaniem plików, etc.


*Większość serwerów działa pod kontorolą Linuxa (Debian, CentOS, Ubuntu), ale równie popularnym rozwiązaniem są maszyny z systemami Microsoftu. 

W tym przypadku sterowanie serwerem jest trochę ułatwione, ponieważ mamy do dyspozycji różne typy zdalnych pulpitów np. RDP lub VNC, które nie różnią się bardzo od interfejsu twojego komputera z windowsem. 

Tak czy inaczej, nie unikniesz kontaktu z terminalem, ponieważ na którymś z etapów testów będziesz zmuszony do otworzenia PowerShella (terminal Microsoftu) i wprowadzenia swoich “rozkazów”. Dlatego gdy już będziesz widział, z jakiego typu maszyny będziesz korzystał, przygotuj sobie zestaw najczęściej używanych komend.

Framework testowy

Wybór jest bardzo duży, ale większość narzędzi występuje w płatnych wersjach, co może dyskwalifikować ich użycie w projekcie, dlatego skupię się na najpopularniejszym i darmowym rozwiązaniu, jakim jest Apache Jmeter.

Jmeter jest bardzo wszechstronny i prosty w użyciu, ale jednocześnie skomplikowany pod względem konfiguracji. Ilość jego dostępnych komponentów może być bardzo przytłaczająca dla osoby początkującej. Na szczęście twórcy aplikacji dostarczyli bardzo szczegółową dokumentację, która umożliwia „szybki start”.

O czym musisz pamiętać 

Przed ściągnięciem pliku Jmetera upewnij się, że posiadasz na swoim komputerze oraz zdalnym serwerze kompatybilne wersje Javy. Napisałem ściągnięciem, ponieważ Jmeter jest aplikacją Java i nie wymaga instalacji. 

Pamiętaj, aby upewnić się, że korzystasz z tej samej wersji Jmetara do tworzenia scenariuszy, jak i uruchamiania ich na zdalnej maszynie. Niespójność pomiędzy wersjami powoduje błędy w testach.

Pamiętaj o metryce testu, nie możesz zacząć badać wydajności bez określenia kryteriów prawidłowego działania serwisu. W innym przypadku nie będziesz w stanie stwierdzić, czy odpowiedź serwisu mieści się w zakresie ustalonych kryteriów. 

Ustal, jakie mają być wartości dla średniego czasu odpowiedzi serwisu, szczytowego czasu reakcji oraz kryteria błędów względem konkretnych ilości użytkowników, liczby requestów na sekundę i wydajności. 

Szybsze tworzenie scenariuszy i ich optymalizacja

Tworzenie scenariuszy testowych odbywa się poprzez zapisywanie ruchu sieciowego pomiędzy klientem (akcje użytkownika w przeglądarce sieciowej), a docelowym serwisem, dlatego bardzo pomocne może być wykorzystywanie narzędzi developerskich, wbudowanych w przeglądarkę. 

Jednak ręczne tworzenie każdego requestu może być bardzo pracochłonne, dlatego polecam wykorzystanie nagrywarek, np. darmowego narzędzia BlazeMeter. 

W poprzednim artykule krytykowałem nagrywarki testów i w tej kwestii nadal nic się nie zmieniło, ale kontekście testów funkcjonalnych są ok. Testy wydajnościowe to całkowicie odmienna tematyka w stosunku do testów selenium. 

Po pierwsze, nie korzystamy z wzorców projektowych. 

Budowa testów wydajnościowych odzwierciedla to, co się dzieje w przeglądarce od strony sieciowej (narzędzia developerskie sekcja „sieć” (F12)). Należy zachować kolejność requestów wysyłanych przez przeglądarkę. Przykładowo nic nie wyjdzie z próby pobrania ID sesji, zanim użytkownik zostanie rozpoznany w trakcie uwierzytelnienia za pomocą nazwy i unikalnego hasła.

Po drugie oszczędność czasu.

Nagrywarka wiernie zapisuje akcje użytkownika, a nagrany skrypt wymaga tylko drobnych modyfikacji, mam na myśli dodanie zmiennych.

Zmienne

Skoro wspomniałem o zmiennych, muszę też powiedzieć o tym, że nagrywany skrypt zawiera hardcode’owane wartości. Mowa o wprowadzanych danych, adresach URL, ciasteczkach, loginach. Należy je zastąpić zmiennymi, które będziesz mógł w prosty sposób modyfikować w dedykowanym miejscu Jmetera lub importować za pomocą plików csv. 

Inicjalizacja zmiennych odbywa się poprzez dodanie ich nazwy w elemencie User Defined Variables w planie testów lub w bliźniaczym elemencie dodanym z poziomu elementów konfiguracyjnych testu (Config element). 

Referencją zmiennych w skrypcie testowym jest: ${NAZWA_ZMIENNEJ}.

Scheduler

Badanie wydajności musi odbywać się w izolacji od ruchu sieciowego.  Jednak rzadko się zdarzy się, że otrzymasz dostęp do takiego środowiska na wyłączność, mimo, że według dobrych praktyk testy wydajnościowe powinny posiadać zarezerwowany czas na wykonanie z wykluczeniem innych prac.  

Rozwiązaniem takiej stacji może być prowadzenie testów w późnych porach nocnych. Wiem, jak to brzmi, kto chciałby zarywać noc przez testy?! 

Rozwiązaniem tego problemu jest skonfigurowanie automatycznego uruchamiania testów.

Wcześniej wspomniałem o konieczności poznania podstawowych komend terminala Linux. Możliwość automatycznego uruchamiania aplikacji na serwerze jest jednym z argumentów za tym, żeby poznać podstawowe komendy. 

Rozgrzewanie środowiska testowego

Zanim przejdziesz do uruchomienia testów wydajnościowych pamiętaj o rozgrzaniu środowiska, czyli uruchomieniu scenariuszy testowych z mniejszą ilością wątków (użytkowników). 

Po co to robić? 

Wiąże się to z działaniem kompilatorów kodu, np. Java posiada wbudowany optymalizator kodu, który działa na podstawie analizy użycia kodu. Słabą stroną tego mechanizmu jest niższa wydajność aplikacji przed dokonaniem optymalizacji. 

Aby wymusić optymalizację musisz zacząć korzystać z docelowego serwisu. Wstępne uruchomienie testu rozwiązuje ten problem.

Usuwanie wyników testów 

Wyniki testów są zapisywane w postaci plików csv z tytułem skryptu testowego w nazwie np. logowanie_uzytkonikow.csv. Przy każdym uruchamianiu Jmeter tworzy plik z wynikami o takiej samej nazwie, ale bez usunięcia poprzedniego. 

Prowadzi to do sytuacji, w której wyniki naszych testów są nadpisywane wynikami ostatniego testu, dlatego należy bezwzględnie przenosić pliki do innej lokalizacji i nadawać im nazwy umożliwiające ich identyfikacje np. 01_03_20_100_watkow_logowanie_uzytkownikow.csv

Pierwsze cyfry to data, 100 to ilość wątków, dalej mamy nazwę testu. Dodatkowo, jeśli jest taka potrzeba, można dodawać godziny wykonania testów, nazwy środowisk itd.

Analiza wyników

Wspomniałem, że wygenerowane przez Jmetera pliki csv z wynikami przebiegu testów są nieczytelnie. Dlatego też polecam skorzystać z dodatkowych narzędzi, które pomogą opracować ich analizę i wygenerować odpowiednie wykresy. 

Takich darmowych narzędzi jest wiele. Jednym z nich jest: BlazeMeter. Można z niego korzystać po wcześniejszym zalogowaniu poprzez usługi Google, GitHub lub utworzeniu konta w domenie BlazeMeter. 

Przydatne narzędzia

Na sam koniec wspomnę o przydatnych narzędziach, które na pewno ułatwią i przyśpieszą pracę.

Pierwszym z nich jest „PuTTy” klient TELNET i SSH. Mówiąc prościej, to program, który umożliwia zdalne bezpieczne połączenie z serwerem, na przykład takim jak maszyna testowa. Istnieje w wersji na maca i Windows

Kolejnym, które może się przydać, jest klient SFTP i FTP z interfejsem graficznym. Narzędzie tego typu służy do zarządzania plikami i przesłania ich pomiędzy maszyną lokalną i zdalną. 

Jest wiele darmowych wersji, na potrzeby testów wydajnościowych wystarczy (WinSC darmowy na Windows’a i Cyberduck w wersji MacOs). 

Wyrażenia regularne

To potężne narzędzie, które przyda się również przy tworzeniu scenariuszy testowych. 

Jmeter posiada wbudowany agregator wyrażeń regularnych, który ułatwia wyodrębnienie interesujących nas elementów z odpowiedzi serwisu. Możemy ich używać np. w celu przechwycenia wartości ciasteczek, tokenów, id sesji itp.

Aby upewnić się, że tworzone wyrażenia spełniają oczekiwania, możesz posłużyć się walidatorem wyrażeń online, np. regex101.

Beanshell

To język programowania wywodzący się od Javy i rozwijany przez Apache Software Foundation, twórców Apache Jmetera, który umożliwia napisanie kompletnego scenariusza testów wydajnościowych. Praktycznie jest wykorzystywany przez zaawansowanych testerów, posiadających doświadczenie w programowaniu. O ile znajomość Beanshella nie jest konieczna do tworzenia skryptów testowych, to może się okazać niezastąpiona w przypadku skomplikowanych mechanizmów badanego serwisu.

Podsumowanie

W powyższym tekście chciałem zebrać wszystkie elementy technologiczne, które determinują wykonanie profesjonalnych testów wydajnościowych. Zdaje sobie sprawę, że jest ich wiele, i ich poznanie może wymagać poświęcenia dużej ilości czasu.

Jednak musisz mieć świadomość, że testy wydajnościowe wymagają wiedzy komplementarnej z zakresu działania sieci, programowania, posługiwania się różnymi narzędziami. Wystawiają też na próbę Twoje umiejętności szybkiego zdobywania wiedzy, rozumienia schematów i rozwiązywania „łamigłówek” -może bardziej branżowym określeniem będzie debugowanie.

Zdobywając tak szeroki zakres wiedzy, wchodzisz na wyższy poziom zaawansowania, co na pewno przełoży się na korzyści związane z Twoją karierą zawodową. 

<p>Loading...</p>