Testowanie wydajności oprogramowania - Software performance testing
W oprogramowania zapewniania jakości , testowania wydajności jest na ogół testowania praktyce przeprowadzane w celu określenia jak A systemowe wykonuje w warunkach reakcji i stabilności w ramach danego obciążenia. Może również służyć do badania, pomiaru, walidacji lub weryfikacji innych atrybutów jakościowych systemu, takich jak skalowalność , niezawodność i wykorzystanie zasobów.
Testowanie wydajności, podzbiór inżynierii wydajności , to praktyka informatyczna, której celem jest wbudowanie standardów wydajności we wdrażanie, projektowanie i architekturę systemu.
Rodzaje testów
Testowanie obciążenia
Testy obciążeniowe to najprostsza forma testowania wydajności. Test obciążenia jest zwykle przeprowadzany w celu zrozumienia zachowania systemu przy określonym oczekiwanym obciążeniu. Obciążeniem tym może być oczekiwana jednoczesna liczba użytkowników aplikacji wykonujących określoną liczbę transakcji w ustalonym czasie trwania. Ten test poda czasy odpowiedzi wszystkich ważnych transakcji o znaczeniu krytycznym dla firmy. Baza danych , serwer aplikacji itp. są również monitorowane podczas testu, co pomoże w identyfikacji wąskich gardeł w oprogramowaniu aplikacyjnym i sprzęcie, na którym oprogramowanie jest zainstalowane.
Test naprężeń
Testy obciążeniowe są zwykle używane do zrozumienia górnych granic wydajności w systemie. Ten rodzaj testu jest wykonywany w celu określenia odporności systemu pod względem ekstremalnego obciążenia i pomaga administratorom aplikacji określić, czy system będzie działał wystarczająco, jeśli bieżące obciążenie znacznie przekroczy oczekiwane maksimum.
Testowanie namaczania
Testy zanurzeniowe , znane również jako testy wytrzymałościowe, są zwykle wykonywane w celu ustalenia, czy system może wytrzymać ciągłe oczekiwane obciążenie. Podczas testów soak monitoruje się wykorzystanie pamięci w celu wykrycia potencjalnych wycieków. Również ważne, ale często pomijane, jest pogorszenie wydajności, tj. zapewnienie, że przepustowość i/lub czasy odpowiedzi po pewnym długim okresie ciągłej aktywności są tak dobre lub lepsze niż na początku testu. Zasadniczo wiąże się to z zastosowaniem znacznego obciążenia systemu przez dłuższy, znaczący okres czasu. Celem jest odkrycie, jak system zachowuje się w warunkach długotrwałego użytkowania.
Testowanie kolców
Spike testowanie odbywa się poprzez nagłe zwiększenie lub zmniejszenie obciążenia generowanego przez bardzo dużą liczbę użytkowników oraz obserwację zachowania systemu. Celem jest ustalenie, czy ucierpi wydajność, system ulegnie awarii, czy też będzie w stanie poradzić sobie z dramatycznymi zmianami obciążenia.
Testowanie punktu przerwania
Testowanie punktu przerwania jest podobne do testów warunków skrajnych. W miarę upływu czasu stosowane jest obciążenie przyrostowe, podczas gdy system jest monitorowany pod kątem określonych warunków awaryjnych. Testowanie punktów przerwania jest czasami nazywane testowaniem wydajności, ponieważ można powiedzieć, że określa maksymalną wydajność, poniżej której system będzie działał zgodnie z wymaganymi specyfikacjami lub umowami o poziomie usług. Wyniki analizy punktów przerwań zastosowane w środowisku stałym mogą być wykorzystane do określenia optymalnej strategii skalowania pod względem wymaganego sprzętu lub warunków, które powinny wyzwalać zdarzenia skalowania w środowisku chmurowym.
Testowanie konfiguracji
Zamiast testowania wydajności z perspektywy obciążenia, tworzone są testy w celu określenia wpływu zmian konfiguracji składników systemu na wydajność i zachowanie systemu. Typowym przykładem może być eksperymentowanie z różnymi metodami równoważenia obciążenia .
Testowanie izolacji
Testy izolacyjne nie są unikalne dla testów wydajnościowych, ale polegają na powtórzeniu wykonania testu, który spowodował problem z systemem. Takie testy często mogą wyizolować i potwierdzić domenę błędu.
Testy internetowe
Jest to stosunkowo nowa forma testowania wydajności, gdy globalne aplikacje, takie jak Facebook, Google i Wikipedia, są testowane pod kątem wydajności z generatorów obciążenia, które są umieszczone na rzeczywistym kontynencie docelowym, niezależnie od tego, czy są to maszyny fizyczne, czy maszyny wirtualne w chmurze. Testy te zwykle wymagają ogromnej ilości przygotowań i monitorowania, aby zostały pomyślnie wykonane.
Ustalanie celów wydajności
Testowanie wydajności może służyć różnym celom:
- Może wykazać, że system spełnia kryteria wydajności.
- Może porównać dwa systemy, aby znaleźć ten, który działa lepiej.
- Może mierzyć, które części systemu lub obciążenia powodują złe działanie systemu.
Wiele testów wydajności jest podejmowanych bez wyznaczania wystarczająco realistycznych, zorientowanych na cel celów wydajności. Pierwsze pytanie z perspektywy biznesowej powinno zawsze brzmieć: „dlaczego testujemy wydajność?”. Te rozważania są częścią uzasadnienia biznesowego testowania. Cele wydajności będą się różnić w zależności od technologii i przeznaczenia systemu, ale zawsze powinny obejmować niektóre z poniższych:
Współbieżność i przepustowość
Jeśli system identyfikuje użytkowników końcowych za pomocą jakiejś formy procedury logowania, wysoce pożądany jest cel współbieżności. Z definicji jest to największa liczba jednoczesnych użytkowników systemu, jaką system ma obsługiwać w danym momencie. Przepływ pracy transakcji skryptowej może mieć wpływ na rzeczywistą współbieżność, zwłaszcza jeśli część iteracyjna zawiera czynności logowania i wylogowania.
Jeśli w systemie nie ma pojęcia o użytkownikach końcowych, cel wydajności prawdopodobnie będzie oparty na maksymalnej przepustowości lub szybkości transakcji.
Czas odpowiedzi serwera
Odnosi się to do czasu potrzebnego na odpowiedź jednego węzła systemu na żądanie innego. Prostym przykładem może być żądanie HTTP „GET” od klienta przeglądarki do serwera WWW. Pod względem czasu odpowiedzi mierzą go wszystkie narzędzia do testowania obciążenia . Może być istotne ustalenie docelowego czasu odpowiedzi serwera między wszystkimi węzłami systemu.
Czas odpowiedzi renderowania
Narzędzia do testowania obciążenia mają trudności z mierzeniem czasu odpowiedzi na renderowanie, ponieważ generalnie nie mają pojęcia, co dzieje się w węźle, poza rozpoznawaniem okresu, w którym nie ma żadnej aktywności „na przewodzie”. Aby zmierzyć czas odpowiedzi renderowania, ogólnie konieczne jest uwzględnienie skryptów testów funkcjonalnych jako części scenariusza testu wydajności. Wiele narzędzi do testowania obciążenia nie oferuje tej funkcji.
Dane techniczne
Niezwykle ważne jest uszczegółowienie specyfikacji wydajności (wymagań) i udokumentowanie ich w dowolnym planie testów wydajności. Najlepiej byłoby, gdyby odbywało się to w fazie opracowywania wymagań dowolnego projektu rozwoju systemu, przed jakimkolwiek wysiłkiem projektowym. Zobacz Inżynieria wydajności, aby uzyskać więcej informacji.
Jednak testowanie wydajności często nie jest przeprowadzane zgodnie ze specyfikacją; np. nikt nie określi, jaki powinien być maksymalny akceptowalny czas odpowiedzi dla danej populacji użytkowników. Testowanie wydajności jest często używane jako część procesu dostrajania profilu wydajności. Chodzi o to, aby zidentyfikować „najsłabsze ogniwo” – nieuchronnie istnieje część systemu, która, jeśli zostanie zmuszona do szybszej reakcji, spowoduje, że cały system będzie działał szybciej. Czasami trudnym zadaniem jest zidentyfikowanie, która część systemu reprezentuje tę krytyczną ścieżkę, a niektóre narzędzia testowe zawierają (lub mogą mieć dodatki, które zapewniają) oprzyrządowanie działające na serwerze (agenci) i raportujące czasy transakcji, czasy dostępu do bazy danych , obciążenie sieci i inne monitory serwerów, które można analizować wraz z surowymi statystykami wydajności. Bez takiego oprzyrządowania ktoś musiałby pochylić się nad Menedżerem zadań Windows na serwerze, aby zobaczyć, jak duże obciążenie procesora generują testy wydajności (zakładając, że testowany jest system Windows).
Testy wydajności można przeprowadzać w Internecie, a nawet w różnych częściach kraju, ponieważ wiadomo, że czasy odpowiedzi samego Internetu różnią się regionalnie. Można to również zrobić we własnym zakresie, chociaż routery musiałyby być wtedy skonfigurowane, aby wprowadzić opóźnienie, które zwykle występuje w sieciach publicznych. Obciążenia należy wprowadzać do systemu z realistycznych punktów. Na przykład, jeśli 50% bazy użytkowników systemu będzie uzyskiwać dostęp do systemu za pośrednictwem połączenia modemowego 56K, a druga połowa przez T1 , to wstrzykiwacze obciążenia (komputery symulujące prawdziwych użytkowników) powinny albo wstrzykiwać obciążenie za pomocą tej samej kombinacji połączeń (idealnie) lub symulować opóźnienie sieciowe takich połączeń, zgodnie z tym samym profilem użytkownika.
Zawsze warto mieć zestawienie prawdopodobnej szczytowej liczby użytkowników, których można oczekiwać, że będą korzystać z systemu w godzinach szczytu. Jeśli istnieje również stwierdzenie, co stanowi maksymalny dopuszczalny 95-procentowy czas reakcji, wówczas konfiguracja wtryskiwacza może być wykorzystana do sprawdzenia, czy proponowany system spełnia tę specyfikację.
Pytania do zadania
Specyfikacje wydajności powinny zawierać co najmniej następujące pytania:
- Jaki jest szczegółowo zakres testów wydajności? Jakie podsystemy, interfejsy, komponenty itp. są objęte i poza zakresem tego testu?
- W przypadku zaangażowanych interfejsów użytkownika (UI), ilu jednoczesnych użytkowników oczekuje się dla każdego z nich (określić wartość szczytową lub nominalną)?
- Jak wygląda system docelowy (sprzęt) (określ wszystkie konfiguracje serwerów i urządzeń sieciowych)?
- Jaki jest miks obciążenia aplikacji każdego składnika systemu? (na przykład: 20% logowanie, 40% wyszukiwanie, 30% wybór pozycji, 10% kasa).
- Co to jest miks obciążenia systemu? [W jednym teście wydajności można symulować wiele obciążeń] (na przykład: 30% obciążenie A, 20% obciążenie B, 50% obciążenie C).
- Jakie są wymagania czasowe dla dowolnych/wszystkich procesów wsadowych zaplecza (określić wartość szczytową lub nominalną)?
Warunki wstępne
Stabilna budowa systemu, która musi jak najbardziej przypominać środowisko produkcyjne.
Aby zapewnić spójne wyniki, środowisko testowania wydajności powinno być odizolowane od innych środowisk, takich jak testy akceptacyjne użytkownika (UAT) lub programistyczne. Jako najlepszą praktykę zawsze wskazane jest posiadanie oddzielnego środowiska testowania wydajności, które w jak największym stopniu przypomina środowisko produkcyjne.
Test kondycji
W testowaniu wydajności często kluczowe jest, aby warunki testowe były podobne do oczekiwanego rzeczywistego użytkowania. Jednak w praktyce jest to trudne do zorganizowania i nie do końca możliwe, ponieważ systemy produkcyjne są poddawane nieprzewidywalnym obciążeniom. Obciążenia testowe mogą w miarę możliwości naśladować zdarzenia w środowisku produkcyjnym, ale tylko w najprostszych systemach można dokładnie odtworzyć tę zmienność obciążenia.
Luźno powiązane implementacje architektoniczne (np. SOA ) stworzyły dodatkowe komplikacje związane z testowaniem wydajności. Aby naprawdę odtworzyć stany podobne do produkcyjnych, usługi lub zasoby dla przedsiębiorstw, które mają wspólną infrastrukturę lub platformę, wymagają skoordynowanych testów wydajności, przy czym wszyscy konsumenci tworzą wolumeny transakcji podobne do produkcji i obciążają współdzieloną infrastrukturę lub platformy. Ponieważ czynność ta jest tak złożona i kosztowna pod względem czasu i pieniędzy, niektóre organizacje używają obecnie narzędzi do monitorowania i symulacji warunków zbliżonych do produkcji (zwanych również „hałasami”) w swoich środowiskach testowania wydajności ( PTE ), aby zrozumieć wymagania dotyczące pojemności i zasobów oraz weryfikować / zweryfikuj atrybuty jakości.
wyczucie czasu
Kluczowe znaczenie dla wydajności kosztowej nowego systemu ma to, aby wysiłki związane z testowaniem wydajności rozpoczynały się na początku projektu programistycznego i rozciągały się aż do wdrożenia. Im później wykryta zostanie wada wydajności, tym wyższy koszt naprawy. Dzieje się tak w przypadku testów funkcjonalnych, ale tym bardziej w przypadku testowania wydajnościowego, ze względu na kompleksowy charakter jego zakresu. Kluczowe znaczenie ma jak najszybsze zaangażowanie zespołu testów wydajnościowych, ponieważ zdobycie i przygotowanie środowiska testowego oraz innych kluczowych wymagań wydajnościowych jest czasochłonne.
Narzędzia
Testowanie wydajności dzieli się głównie na dwie główne kategorie:
Skrypty wydajności
Ta część testowania wydajności zajmuje się głównie tworzeniem/skryptowaniem przepływów pracy kluczowych zidentyfikowanych procesów biznesowych. Można to zrobić za pomocą szerokiej gamy narzędzi.
Każde z narzędzi wymienionych na powyższej liście (która nie jest wyczerpująca ani kompletna) wykorzystuje język skryptowy (C, Java, JS) lub jakąś formę reprezentacji wizualnej (przeciągnij i upuść) do tworzenia i symulacji przepływów pracy użytkownika końcowego. Większość narzędzi pozwala na coś, co nazywa się "Record & Replay", gdzie w testerze wydajności uruchamia narzędzie testujące, podłącza je do przeglądarki lub grubego klienta i przechwytuje wszystkie transakcje sieciowe, które mają miejsce między klientem a serwerem. W ten sposób powstaje skrypt, który można ulepszać/modyfikować, aby emulować różne scenariusze biznesowe.
Monitoring wydajności
To stanowi drugą stronę testowania wydajności. Dzięki monitorowaniu wydajności obserwuje się zachowanie i charakterystykę odpowiedzi testowanej aplikacji. Poniższe parametry są zwykle monitorowane podczas wykonywania testu wydajnościowego
Parametry sprzętowe serwera
- Zużycie procesora
- Wykorzystanie pamięci
- Wykorzystanie dysku
- Wykorzystanie sieci
Jako pierwszy krok, wzorce generowane przez te 4 parametry stanowią dobrą wskazówkę, gdzie leży wąskie gardło. Aby określić dokładną pierwotną przyczynę problemu, inżynierowie oprogramowania używają narzędzi, takich jak profilery, aby zmierzyć, które części urządzenia lub oprogramowania najbardziej przyczyniają się do niskiej wydajności, lub ustalić poziomy przepustowości (i progi) w celu utrzymania akceptowalnego czasu odpowiedzi.
Technologia
Technologia testowania wydajności wykorzystuje jeden lub więcej komputerów PC lub serwerów Unix do działania jako wstrzykiwacze, z których każdy emuluje liczbę użytkowników i każdy uruchamia zautomatyzowaną sekwencję interakcji (zapisywaną jako skrypt lub serię skryptów emulujących różne typy użytkowników interakcji) z hostem, którego wydajność jest testowana. Zwykle oddzielny komputer PC działa jako przewodnik testowy, koordynując i zbierając metryki z każdego z wtryskiwaczy oraz zestawiając dane dotyczące wydajności do celów raportowania. Zwykła sekwencja polega na zwiększeniu obciążenia: zacząć od kilku wirtualnych użytkowników i zwiększać ich liczbę do z góry określonego maksimum. Wynik testu pokazuje, jak wydajność zmienia się w zależności od obciążenia, wyrażona jako liczba użytkowników w stosunku do czasu odpowiedzi. Do przeprowadzenia takich testów dostępne są różne narzędzia. Narzędzia z tej kategorii zazwyczaj wykonują zestaw testów, które emulują rzeczywistych użytkowników w systemie. Czasami wyniki mogą ujawnić osobliwości, na przykład, że chociaż średni czas odpowiedzi może być akceptowalny, istnieją wartości odstające kilku kluczowych transakcji, których wykonanie trwa znacznie dłużej – coś, co może być spowodowane nieefektywnymi zapytaniami do bazy danych, zdjęciami itp.
Testy wydajności można połączyć z testami warunków skrajnych , aby zobaczyć, co się stanie, gdy zostanie przekroczone dopuszczalne obciążenie. Czy system ulega awarii? Jak długo trwa regeneracja w przypadku zmniejszenia dużego obciążenia? Czy jego awaria powoduje szkody uboczne?
Modelowanie wydajności analitycznej to metoda modelowania zachowania systemu w arkuszu kalkulacyjnym. Model zasilany jest pomiarami zapotrzebowania na zasoby transakcyjne ( CPU , dyskowe I/O, LAN , WAN ), ważonymi przez mieszankę transakcji (transakcje biznesowe na godzinę). Ważone zapotrzebowania na zasoby transakcji są sumowane w celu uzyskania godzinowych zapotrzebowań na zasoby i dzielone przez godzinowe zdolności produkcyjne zasobów w celu uzyskania obciążeń zasobów. Korzystając ze wzoru na czas odpowiedzi (R=S/(1-U), R=czas odpowiedzi, S=czas obsługi, U=obciążenie), czasy odpowiedzi można obliczyć i skalibrować na podstawie wyników testów wydajności. Analityczne modelowanie wydajności umożliwia ocenę opcji projektowych i rozmiaru systemu w oparciu o rzeczywiste lub przewidywane wykorzystanie biznesowe. Jest zatem znacznie szybszy i tańszy niż testowanie wydajności, choć wymaga dokładnego zrozumienia platform sprzętowych.
Zadania do wykonania
Zadania do wykonania takiego testu obejmowałyby:
- Zdecyduj, czy do wykonania testów użyć zasobów wewnętrznych, czy zewnętrznych, w zależności od posiadanej wiedzy (lub jej braku).
- Zbierz lub uzyskaj wymagania dotyczące wydajności (specyfikacje) od użytkowników i/lub analityków biznesowych.
- Opracuj plan wysokiego poziomu (lub kartę projektu), w tym wymagania, zasoby, ramy czasowe i kamienie milowe.
- Opracuj szczegółowy plan testów wydajności (w tym szczegółowe scenariusze i przypadki testowe , obciążenia, informacje o środowisku itp.).
- Wybierz narzędzie (a) testowe .
- Określ potrzebne dane testowe i wysiłek związany z czarterem (często pomijane, ale niezbędne do przeprowadzenia prawidłowego testu wydajności).
- Opracuj skrypty sprawdzające koncepcję dla każdej testowanej aplikacji/komponentu, korzystając z wybranych narzędzi i strategii testowych.
- Opracuj szczegółowy plan projektu testów wydajności, w tym wszystkie zależności i powiązane terminy.
- Zainstaluj i skonfiguruj wtryskiwacze/sterownik.
- Skonfiguruj środowisko testowe (idealnie identyczny sprzęt z platformą produkcyjną), konfigurację routera, cichą sieć (nie chcemy zakłócać wyników przez innych użytkowników), wdrożenie oprzyrządowania serwerowego, opracowane zestawy testowe baz danych itp.
- Testy na sucho - przed faktycznym wykonaniem testu obciążenia z predefiniowanymi użytkownikami, wykonywany jest test w celu sprawdzenia poprawności działania skryptu.
- Wykonaj testy – prawdopodobnie wielokrotnie (iteracyjnie), aby sprawdzić, czy jakikolwiek nieuwzględniony czynnik może wpłynąć na wyniki.
- Przeanalizuj wyniki - albo zaliczono/nie udało się, albo zbadanie ścieżki krytycznej i zalecenie działań naprawczych.
Metodologia
Testowanie wydajności aplikacji internetowych
Według Microsoft Developer Network Metodologia testowania wydajności składa się z następujących działań:
- Zidentyfikuj środowisko testowe. Zidentyfikuj fizyczne środowisko testowe i produkcyjne, a także narzędzia i zasoby dostępne zespołowi testowemu. Środowisko fizyczne obejmuje konfiguracje sprzętu, oprogramowania i sieci. Dogłębne zrozumienie całego środowiska testowego na początku umożliwia bardziej wydajne projektowanie i planowanie testów oraz pomaga identyfikować wyzwania testowe na wczesnym etapie projektu. W niektórych sytuacjach proces ten musi być powtarzany okresowo przez cały cykl życia projektu .
- Określ kryteria akceptacji wyników. Określ czas odpowiedzi, przepustowość oraz cele i ograniczenia dotyczące wykorzystania zasobów. Ogólnie rzecz biorąc, czas odpowiedzi jest problemem dla użytkownika, przepustowość jest kwestią biznesową, a wykorzystanie zasobów dotyczy systemu. Dodatkowo, zidentyfikuj kryteria sukcesu projektu, które mogą nie być objęte tymi celami i ograniczeniami; na przykład użycie testów wydajności do oceny, która kombinacja ustawień konfiguracyjnych zapewni najbardziej pożądane parametry wydajności.
- Testy planowania i projektowania. Zidentyfikuj kluczowe scenariusze , określ zmienność wśród reprezentatywnych użytkowników i dowiedz się, jak symulować tę zmienność, zdefiniuj dane testowe i ustal metryki, które mają być zbierane. Skonsoliduj te informacje w jeden lub więcej modeli użytkowania systemu, które zostaną zaimplementowane, wykonane i przeanalizowane.
- Skonfiguruj środowisko testowe. Przygotuj środowisko testowe, narzędzia i zasoby niezbędne do wykonania każdej strategii, gdy funkcje i komponenty staną się dostępne do testów. Upewnij się, że środowisko testowe jest odpowiednio oprzyrządowane do monitorowania zasobów.
- Implementuj projekt testów. Opracuj testy wydajności zgodnie z projektem testu.
- Wykonaj test. Uruchamiaj i monitoruj swoje testy. Sprawdź poprawność testów, danych testowych i zbierania wyników . Wykonywanie zwalidowanych testów do analizy podczas monitorowania testu i środowiska testowego.
- Analizuj wyniki, dostrój i powtórz test. Analizuj, konsoliduj i udostępniaj wyniki. Dokonaj zmiany strojenia i przetestuj ponownie. Porównaj wyniki obu testów. Każde wprowadzone ulepszenie zwróci mniejsze ulepszenie niż poprzednie ulepszenie. Kiedy przestajesz? Kiedy dojdziesz do wąskiego gardła procesora, możesz wybrać ulepszenie kodu lub dodanie większej ilości procesora.
Zobacz też
- Benchmark (obliczenia) – Porównywanie względnej wydajności komputerów poprzez uruchomienie tego samego programu na wszystkich z nich
- Testowanie serwerów WWW
- Pomiar odpowiedzi aplikacji