Testowanie wydajności API w środowisku rozproszonym. Część 1. Teoria wydajności

Testowanie wydajności API w środowisku rozproszonym. Część 1. Teoria wydajności
Celem niniejszej publikacji jest przedstawienie i rozwiązanie problemu testowania wydajności aplikacji internetowej opartej na REST API w środowisku rozproszonym.

W opracowaniu przedstawiono kompleksowe podejście do problemu jakim jest sprawdzenie wydajności systemu – od analizy aplikacji testowanej poprzez implementacje testów aż do przedstawienia wyników i wniosków. 

W celu przedstawienia rozwiązania technicznego wybranego zagadnienia zaimplementowano testy z wykorzystaniem narzędzia w modelu open source JMeter. Zgodnie z najnowszymi standardami w świecie informatyki całość rozwiązania technicznego oparta jest o zarządzanie zdalne. Rozwiązanie to pozwala na większą elastyczność i możliwość dystrybucji testów na większą liczbę maszyn, dzięki czemu testowaną aplikację można jeszcze bardziej obciążyć, nie zużywając zasobów własnego komputera.

Testy wydajności

W międzynarodowej normie oceny jakości oprogramowania ISO 25010 jako jedną z opisanych charakterystyk wymienia się wydajność. W testach wydajności, czynności na których należy się skupić, to głównie weryfikacja czy system lub moduł jest zdolny do generowania odpowiedzi na żądania użytkownika lub innego systemu w określonym czasie przy zdefiniowanych warunkach. 

Testy wydajnościowe są automatyzowane ze względu na to, że wykonanie ich ręcznie jest niemożliwe lub bardzo trudne. Polegają głównie na wygenerowaniu obciążenia i obserwacji zachowania systemu pod względem czasu działania (czasu odpowiedzi) oraz zużywania zasobów. 
Wydajność można mierzyć na różne sposoby. W przypadku pojedynczych modułów pomiarom mogą podlegać cykle procesora, a dla klienckiego systemu wydajność może być wyrażona poprzez czas odpowiedzi na konkretne żądania użytkownika. Jeśli mowa o systemach, gdzie architektura obejmuje wiele komponentów, np. serwery, bazy danych, oprogramowanie klienckie, to pomiary wydajności zawierają również informacje o transakcjach między wybranymi komponentami w celu rozpoznania tzw. wąskich gardeł.

W niniejszej pracy analizie poddaje się system wg następujących typów testów wydajności. Forma ich realizacji została opisana w Planie Testów w rozdziale 2.3, który stanowi opis zaplanowanych czynności testowych w tej pracy inżynierskiej.

Test linii podstawowej (ang. baseline testing) - Jednym z pierwszych testów wykonanych w niniejszej pracy jest test linii podstawowej (ang. baseline testing). Polega on na sprawdzeniu jak zachowa się system w warunkach zbliżonych do zwykłego działania. Zebrane w ten sposób metryki takie jak czas odpowiedzi serwera czy zużycie zasobów sprzętowych posłużą jako punkt odniesienia dla następnych testów. Testy linii podstawowej pozwalają ustalić ogólną wydajność aplikacji m.in. za pomocą wskaźnika APDEX. Jeśli podczas testów przyjęta została granica satysfakcji oraz frustracji, to można wyliczyć dzięki temu pewien standard i wyznaczyć ogólną ocenę wydajności aplikacji. W przypadku niniejszej pracy, zaczynając od najniższych obciążeń aplikacji maksymalnie 10 jednoczesnymi wątkami dla danego przypadku testowego wyznaczono podstawową wydajność aplikacji, która posłuży w dalszym etapie jako punkt odniesienia. W planie testów, test linii podstawowej jest testem wzorcowym (ang. Benchmark) dla wszystkich pozostałych testów. Można go również traktować jako test dymny (ang. Smoke test, czyli sprawdzenie podstawowych funkcjonalności ) i w przypadku jego niepowodzenia uznać, że również pozostałe testy nie mogą zakończyć się testem pozytywnym. Wybrany poziom 10 jednoczesnych wątków jest teoretycznym założeniem dokonanym na potrzeby tej pracy, by zweryfikować absolutne minimum wydajnościowe aplikacji. 

Testy obciążeniowe (ang. load testing) - jest to typ testów wydajności, w którym główny nacisk położony jest na sprawdzaniu jak duży poziom obciążenia w postaci równolegle pracujących użytkowników i / lub transakcji na sekundę moduł lub system jest w stanie przetworzyć. Przykładowa zależność ilości użytkowników od czasu trwania testu obrazującą istotę testów obciążeniowych przedstawiono na rys. 4.

testowanie-wydajności-api-w-środowisku-rozproszonym-rys-4.png

Rys. 4 Testy obciążeniowe
(źródło: https://abstracta.us/blog/performance-testing)


Kluczowym aspektem podczas wykonania tego testu w ramach pracy jest zweryfikowanie jaki jest maksymalny poziom obciążenia aplikacji, który jednocześnie pozawala na otrzymywanie odpowiedzi z systemu w akceptowalnym czasie. Ponieważ dla samego systemu nie określono maksymalnego poziomu użytkowników lub wątków, przeprowadzone testy mają doprowadzić do określenia tych progów.  

Testowanie przeciążające (ang. Stress testing) w swojej idei jest podobne do testowania obciążeniowego, przy czym w testowaniu przeciążającym idziemy jeszcze dalej, obciążając system do momentu, w którym nie jest on w stanie poprawnie funkcjonować. Pozwala na znalezienie punktu krytycznego, tzn. maksymalnej wartości obciążenia, przy którym system działa na zadowalającym nas poziomie (np. odpowiada w odpowiednio krótkim czasie lub zużywa odpowiednią ilość zasobów). Przykładowa zależność liczby użytkowników od czasu trwania testu prawdziwą dla testów obciążeniowych przedstawiono na rys. 5.

testowanie-wydajności-api-w-środowisku-rozproszonym-rys-5.png

Rys. 5 Testy przeciążeniowe
(źródło: https://abstracta.us/blog/performance-testing)

Opisane w planie testów i przeprowadzone testy przeciążające mają na celu nie tylko przekroczenie limitów akceptowalnych czasów odpowiedzi, ale przede wszystkim określenie jak system zachowuje się po przeciążeniu.

Część drugą pracy znajdziesz tutaj.

*) Od autora pracy: 
"Z niniejszej publikacji usunięto wstęp związany ściśle z zagadnieniem samego testowania oprogramowania. Nacisk tej publikacji skierowany jest na testy wydajności wraz ze sprawozdaniem z przebiegu wykonania tych prac. Pomysł na temat obrony dyplomu i publikacji tego artykułu był prosty – ja jako autor chciałem nauczyć się nowej umiejętności w moim testerskim przyborniku, a z wami czytelnikami chciałem podzielić się efektem mojej kilkumiesięcznej pracy, na którą złożyła się nauka testowania wydajności od zupełnych podstaw, przez implementację rozwiązania w JMeter, a także stworzenie raportu. Cel został osiągnięty poprzez znalezienie wielu źródeł w postaci teorii testowania wydajności, a przede wszystkim znalezieniu informacji na temat dobrych praktyk i przykładów jak zaplanować i wykonać tego typu testy. Puentą jest to, jak to w projekcie informatycznym, czyli dostarczenie pewnej wartości w postaci przeprowadzenia i wykonaniem testów wydajności wraz z raportem i wnioskami. Z perspektywy czasu wiele rzeczy bym zmienił, natomiast myślę, że ten artykuł może komuś jeszcze posłuży."

*) Publikacja ta jest skróconą wersją pracy dyplomowej.
Autor: Michał Zacharuk
Tytuł pracy: "Testowanie wydajności API w środowisku rozproszonym"
Uczelnia: Politechnika Łódzka, Wydział Elektrotechniki, Elektroniki, Informatyki i Automatyki
Instytut Informatyki Stosowanej
Opis: Przedstawienie i rozwiązanie problemu testowania wydajności aplikacji internetowej opartej na REST API w środowisku rozproszonym. Skrócona wersja pracy dyplomowej.

To powinno Cię zainteresować