W poprzednim artykule wyjaśniliśmy, czym są testy wydajnościowe, po co się wykonuje, jak je dzielimy i jaki typ zastosować w określonej sytuacji. Teraz możemy przejść do kolejnych etapów testowania, podczas których trzeba odpowiedzieć sobie na kilka istotnych pytań. Najpierw skupimy się na przygotowaniu testów, potem na ich przeprowadzaniu, a na koniec postaramy się wyciągnąć wnioski.
Najczęściej zadawane pytania na temat testowania wydajności
Do czego stworzony jest produkt i w jaki sposób jest wykorzystywany przez użytkowników?
Każdy produkt ma swoją specyfikę i może służyć do innych celów. Są produkty, które jedynie wyświetlają treść dla użytkownika (np. blog, strona informacyjna dla potencjalnych klientów), a są też takie, które umożliwiają wykonywanie akcji innych niż tylko odczyt gotowych danych (np. założenie konta, logowanie, dokonanie zakupu, wygenerowanie raportu). Czy uwzględniamy tylko stronę www albo dedykowaną aplikację na telefon, czy może obie wersje jednocześnie? Z perspektywy tego, co użytkownicy robią, warto wcielić się w jednego z nich i spróbować przewidzieć jego zachowania.
Jak jest zbudowany produkt i jakie technologie się pojawiają?
Warto zagłębić się w szczegóły i zweryfikować, czy frontend, backend oraz infrastruktura są odpowiednio przygotowane. Do tego powinno się sprawdzić, jak poszczególne elementy są połączone ze sobą. Czy wykorzystywane technologie są przestarzałe? Czy korzystają z nieaktualnych i niezoptymalizowanych komponentów, które mogą obciążać system?
Jakie są zależności między procesami i funkcjonalnościami?
Wykonując nawet podstawowe czynności jako użytkownik, można zauważyć pewne zależności. Jeżeli interesuje nas jakiś przedmiot i zastanawiamy się nad zakupem, chcemy odwiedzić stronę produktu. Na stronie produktu widzimy 10 zdjęć, a dodatkowo wyświetla się 10 miniaturek. Miniaturki powstają w zależności – czy korzystamy z komputera, czy też smartfona – i potrafią się odpowiednio dostosować. Czy 100 osób odwiedzających ten sam przedmiot będzie mogło przeglądać wszystkie zdjęcia? Czy za każdym razem podczas odwiedzin strony miniaturki generują się na nowo? Czy jest proces, który kontroluje powstawanie miniaturek lub przygotowuje je wcześniej, aby były szybciej dostępne?
Kolejny przykład: jeżeli składamy zamówienie na ten przedmiot, system musi wygenerować i wysłać 3 maile. Zakładając, że aktualnie jest X użytkowników składających zamówienie, to wymusza potrzebę wysłania 3X maili do wszystkich zainteresowanych. Czy jest możliwe, aby wysłać wszystkie maile jednocześnie? Czy jest proces, który kontroluje wysyłanie maili i potrafi je odłożyć na bok?
Warto nawet rozrysować sobie te zależności, aby lepiej ocenić złożoność procesów.
Źródło: https://c4model.com/
Źródło: https://c4model.com/
Jakie funkcjonalności mogą sprawiać problem?
Jako użytkownik produktu możesz codziennie spotykać się z sytuacjami, gdy zauważalnie pewne funkcjonalności trwają za długo. Generowanie faktury albo raportu finansowego z całego miesiąca mogą być operacjami, które potrzebują więcej zasobów serwera niż inne operacje. Przy testach wydajnościowych warto sprawdzić, czy występują działania użytkownika np. pobieranie dużej liczby danych, agregowanie danych i sortowanie wyników czy bezpośredni odczyt danych z dysku.
Czy w prosty sposób można uzyskać dostęp do testowanego środowiska?
Do środowiska testowego zazwyczaj można dostać się przez mechanizmy zabezpieczające np. VPN albo .htaccess. Należy sprawdzić, czy te zabezpieczenia nie będą wpływać na przebieg testów.
Czy testy będą bezproblemowo działały z lokalnej maszyny?
W przypadku prostych testów i małej liczby wysyłanych danych korzystanie z własnej maszyny nie powinno stanowić problemu. Jeśli natomiast są tworzone bardziej wymagające testy, zastanów się nad przeniesieniem testów na mocniejszy sprzęt lub wykorzystanie usługi w chmurze, aby dodatkowe czynniki nie miały wpływu na otrzymane wyniki testów.
Czy są jakieś założenia co do oczekiwanych wyników?
Założenia mogą wynikać z obserwacji (statystyki) lub wymagań biznesowych.
Pierwszym podejściem jest zbieranie danych, które pomogą posłużyć jako wytyczne w testach. Gdy zaczynamy planować testy wydajnościowe, warto mieć do dyspozycji po prostu jakieś dane do porównania. Idealnie by było, gdyby testy wydajnościowe już kiedyś były przeprowadzone. Można wówczas wrócić do dokumentacji z poprzednich testów i zweryfikować informacje w niej zawarte. Oczywiście trzeba pamiętać, że założenia testu oraz specyfikacja produktu mogły ulec zmianie, więc należy dostosować nowe testy do nowych wymagań.
Jeżeli takiej dokumentacji nie posiadamy i testy dopiero powstają, to również jest na to sposób. Potrzebne dane uzyskamy z różnych popularnych narzędzi analitycznych, np. obserwujemy średni ruch użytkowników z ostatniego miesiąca, a dane pochodzą z narzędzi analitycznych typu Google Analytics, Hotjar, HubSpot. Można także sprawdzić, jakim zainteresowaniem cieszył się sklep podczas ostatniego Black Friday lub podczas całego okresu świątecznego. W razie gdyby przytrafiały nam się z tego powodu problemy – w trakcie trwania wyprzedaży padł serwer – analiza tego wydarzenia również może dać nam sporo informacji na temat tego, jak powinny wyglądać nasze testy.
Innym podejściem do określenia założeń jest otrzymanie ich od biznesu. Wymagania są dokładnie określone w dokumentacji projektu – przykładowo API musi odpowiadać w czasie < 50 ms. Oznacza to, że wyniki muszą spełniać wymagania niezależnie od liczby użytkowników, nowych funkcjonalności czy zmian w architekturze systemu.
Na jakim środowisku wykonywać testy?
Testy najlepiej wykonywać na środowisku innym niż produkcyjne, ponieważ zazwyczaj nie chcemy wpływać na działanie produktu. Błędna konfiguracja testu może doprowadzić do nieoczekiwanych skutków. Jeżeli musimy lub chcemy wykonywać testy na środowisku produkcyjnym, należy omówić to z zespołem. Środowisko musi być bardzo zbliżone do produkcyjnego, aby wyniki były wiarygodne. Zadbaj również o konfigurację środowiska, aktualną wersję kodu oraz kopię bazy danych z produkcji.
Ważne jest, aby:
▶ konfiguracja środowiska była podobna, chociaż część procesów może ulec zmianie;
▶ wersja kodu była odpowiednio przygotowana (aby nie było przypadkowych zmian);
▶ baza danych miała taki sam zakres danych co produkcyjna (przykładowo liczba zarejestrowanych użytkowników lub dostępnych produktów nie powinna się różnić);
▶ podczas kopii dokonać anonimizacji; jeśli tego nie zrobimy, może dojść np. do zasypania mailami prawdziwych klientów.
O czym trzeba pamiętać?
▶ Gdy rozpoczynasz przygotowania, musisz zastanowić się nad celem testów i dlaczego chcesz je wykonać. Pamiętaj, że testy mogą dotyczyć istniejącego produktu lub całkowicie nowego.
▶ Oprócz tego istotna jest informacja, czy nowy produkt spełnia pewne wstępne założenia lub czy istniejący produkt nie pogorszył swoich poprzednich wyników.
▶ Nie możemy przy tym rezygnować z analizy, która ma ogromne znaczenie zarówno dla zespołu wykonującego testy, jak i dla osób, które podejmują ewentualne decyzje biznesowe.
▶ Weryfikacja wydajności odbywa się pod względem np. poprawności odpowiedzi, optymalizacji zapytań do bazy danych, szybkości oraz stabilności systemu. Zadanie to należy do testerów, deweloperów lub DevOps.
▶ Wynik to nie tylko wartość liczbowa, ale przede wszystkim realny wpływ produktu na Customer Experience. Osiągnięty rezultat jest ważny z biznesowego punktu widzenia, ponieważ pozwala stwierdzić, czy Twój produkt jest już gotowy, aby spełnić oczekiwania użytkowników.
▶ Symulacja naturalnego funkcjonowania serwisu w długim czasie czy nagła zmiana standardowego obciążenia? Przeanalizuj kilka scenariuszy, które pomogą Ci wybrać odpowiedni typ testu.
▶ Najprostsza i zarazem najważniejsza uwaga – pamiętaj, że użytkownik chętnie będzie korzystał z nowej funkcjonalności, ale jeśli praca z nią będzie utrudniona, to poszuka on lepszego rozwiązania u konkurencji.
Co dobrze zrobić po testach?
1. Udokumentuj przeprowadzone testy.
2. Opisz założenia oraz efekty z przeprowadzonych testów.
3. Opisz przyczyny zdiagnozowanych problemów i metody ich naprawy.
Dlaczego? Opis może być przydatny przy następnych testach wydajnościowych, ponieważ będzie można z wyprzedzeniem zabezpieczyć się przed znanymi zagrożeniami.
4. Przygotuj checklistę, która wskazuje na kluczowe elementy potrzebne do poprawnego wykonania testów.
5. Wypracuj plany awaryjne, w przypadku gdy np. padnie serwer.
Przećwiczenie scenariusza awaryjnego w kontrolowanych warunkach będzie doskonałym sprawdzianem dla projektu. Dowiesz się, czy posiadasz odpowiednie narzędzia, zaplecze, czy są odpowiednie procedury oraz – co najważniejsze – jaki jest czas reakcji od wykrycia problemu do przywrócenia działania aplikacji. Jeżeli padnie baza danych, to jaki jest czas przywrócenia jej działania? Czy przywrócenie bazy danych wystarczy, czy może potrzebne są jeszcze inne czynności? Jakie mogą być konsekwencje braku aktualnych danych z zewnętrznego źródła i ile czasu zajmuje uzyskanie ich?
Jaką wartość niosą ze sobą wykonane testy wydajności?
- dla TESTERA
Testowane funkcjonalności spełniają wymagania funkcjonalne i niefunkcjonalne. Działają poprawnie zarówno przy pojedynczym, jak i wielokrotnym użyciu w tym samym czasie.
- dla DEWELOPERA
Funkcjonalności tworzy się w poprawny sposób. Są również zoptymalizowane w taki sposób, aby nie zaburzać stabilności produktu.
- dla DEVOPS / ADMINA
Środowisko, w którym znajduje się produkt, jest stabilne, a wdrożone zabezpieczenia zapewniają działanie nawet przy zwiększonym ruchu.
- dla BIZNESU
Rozwijany produkt jest przygotowany do tego, by klienci mogli z niego korzystać.
- dla KLIENTA KOŃCOWEGO
Produkt spełnia oczekiwania, zapewnia komfort korzystania i powoduje, że wzrasta zaufanie do marki. Dzięki temu chętnie skorzysta z tego produktu następnym razem.
Testowanie wydajności jest konieczne przed wprowadzeniem na rynek jakiegokolwiek oprogramowania, a koszty testowania są zwykle rekompensowane większą satysfakcją klientów. Optymalizując system w oparciu o testy wydajnościowe, będziesz mieć pewność, że Twoja strona jest gotowa na nowy ruch i zamówienia oraz że będzie ona zawsze dostępna dla użytkowników.
Jeżeli w dalszym ciągu z jakiegoś powodu w Twoim projekcie nie są wykonywane testy wydajnościowe, to warto, aby zespół zapoznał się z manifestem testów wydajnościowych. Znajduje się tu jeden z najważniejszych postulatów – nawet najprostsze testy są lepsze niż brak testów. Proste testy mogą szybko odpowiedzieć na podstawowe pytania, uwypuklić problemy, a także być powodem, dla którego zespół będzie chciał rozwijać te testy w przyszłości.