W obecnych czasach, gdy większość aplikacji internetowych ma miliony użytkowników na całym świecie, kluczowe znaczenie ma ich wydajność, failover i dostępność. Dlatego też testowanie wydajnościowe jest nieodłącznym elementem procesu wytwarzania oprogramowania, a narzędzia do jego przeprowadzania są niezbędne dla każdego zespołu deweloperskiego.
Ten artykuł jest początkiem serii, podczas której skupimy się na omówieniu jednego z najszybciej rozwijających się narzędzi do testowania wydajności aplikacji – k6, firmy Grafana Labs. W serii przeanalizujemy, jak działa k6, jakie funkcje oferuje oraz jak go skonfigurować, aby przeprowadzić skuteczne testy i analizy wydajnościowe.
Omówimy również zaawansowane aspekty korzystania z k6, takie jak tworzenie rozszerzeń, które są niezbędne do przeprowadzania testów, a także pokażemy, jak uruchomić i zarządzać obserwowalnością we własnych systemach.
Czym jest k6?
Zanim przejdziemy do technicznych aspektów narzędzia k6, warto wspomnieć, czym jest i jak powstało.
W 2016 roku zespół LoadImpact rozpoczął pracę nad nowym narzędziem opensource, które miało służyć jedynie do przeprowadzania testów wydajnościowych. Jednak, jak później się okazało, nie ograniczyli się tylko do tego. W 2017 roku LoadImpact zdecydował się na udostępnienie narzędzia na zasadach licencji open source, a od 2020 roku jest ono w wersji 1.0. Od tego momentu k6 rozwijane jest przez niezależny zespół developerów oraz szerokie community.
K6 jest narzędziem generującym obciążenie na potrzeby testów wydajnościowych. Podobnie jak NeoLoad, jMeter, Gatling czy Locust pozwala na wygenerowanie niemal dowolnej ilości transakcji na sekundę, a przez to symulowanie zachowania użytkowników aplikacji webowych czy mobilnych. Świetnie też sprawdza się jako narzędzie do testów API.
K6 w standardzie pozwala na pełną integrację uruchamiania testów z procesem CI/CD z użyciem takich narzędzi jak Jenkins, TeamCity, Bamboo i wiele innych. Dodatkowo, używając gotowych konwerterów, możemy wykorzystywać w testach wydajnościowych wcześniej przygotowane skrypty do testów API pochodzących m.in.: z Postman.
Jednak tym, co wyróżnia k6 spośród innych narzędzi do przeprowadzania testów wydajnościowych, jest możliwość dogłębnej analizy sieci, przeprowadzania testów funkcjonalnych, a nawet chaos testów. Dzięki temu dostępne staje się proste utrzymywanie jednego frameworka do każdej części związanej z testowaniem, co umożliwia rozwój w wielu obszarach równocześnie.
Warto jednak pamiętać, że głównym celem narzędzia k6 jest przeprowadzanie testów wydajnościowych. Dlatego zespół k6 skupia się szczególnie na obsłudze protokołu HTTP, websockets oraz zbieraniu metryk, które często są pomijane w innych narzędziach.
Są to miary takie jak:
- czas oczekiwania na dostęp do wolnego slotu TCP,
- czas spędzony na handshake sesji TLS,
- czas oczekiwania na odpowiedź od zdalnego hosta (time to first byte).
Poprawne wykorzystanie tych danych w połączeniu z integracją z innymi narzędziami pozwala na bardziej zaawansowaną analizę aplikacji.
K6 Cloud vs k6 Open Source
k6 występuje w dwóch wersjach – open source oraz Cloud. W artykułach skupię się na części open source, ponieważ w obecnej formie jest ona wystarczająca do pracy w dojrzałym projekcie.
Decydując się na korzystanie z wersji Cloud, należy pamiętać o pewnych ograniczeniach, które mogą okazać się trudne do przeskoczenia. Korzyścią jest fakt, że po zalogowaniu otrzymujemy skonfigurowane środowisko, w pełni gotowe do przeprowadzenia testów. Jest to interesujące rozwiązanie, szczególnie gdy musimy szybko wygenerować niewielkie obciążenie i łatwo przeanalizować wyniki testów.
Pozostałe zalety Clouda, które zostały wymienione na stronie producenta w porównaniu do wersji open source, można zastąpić darmowymi alternatywami. Na przykład:
- do wizualizacji danych możemy użyć Grafany,
- do testów rozproszonych (distributed testing) możemy skorzystać z rozszerzenia xk6-operator,
- a jeśli chodzi o automatyczną bramkę jakości, skorzystamy z keptna.
K6 Cloud jest obecnie wersją płatną, a koszty mogą być kluczowe w przypadku startupów. Ponadto, generowane, maksymalne obciążenie ma swoje ograniczenia, co może okazać się niewystarczające w przypadku wielkich projektów.
A tool that developers could love in the 21st century – co to oznacza?
A tool that developers could love in the 21st century
Takimi słowami developerzy k6 podsumowują swoją pracę nad narzędziem. Pomyślmy nad tym chwilę dłużej. Aby zrozumieć, o co dokładnie chodzi, warto przeanalizować dwa podejścia, które kształtują się na przestrzeni ostatnich kilku lat.
Podejście pierwsze
Pierwszym podejściem jest rezygnacja z tradycyjnych, nieco prymitywnych, form testów wydajnościowych. W takim wariancie firma jednorazowo lub raz na kilka miesięcy zatrudnia Test Engineera odpowiedzialnego za przygotowanie i wykonanie skryptów, a cała analiza i ocena ryzyka spoczywa po stronie Developerów. To ogromny błąd, ponieważ wydajność aplikacji powinna być sprawdzana na bieżąco przy każdym wdrożeniu. Ponadto, utrzymywanie scenariuszy testowych, CI/CD oraz analiza systemów obserwowalności, to praca na pełnoetatowym stanowisku. Wymaga to od Performance Testera posiadania specyficznych umiejętności oraz szerokiej wiedzy z wielu obszarów.
Wyżej opisane podejście jest znane jako „Inżynieria wydajności”. W ramach tej metodyki, Sii opracowało nowatorską strategię testów wydajnościowych, znaną jako Testy Wydajnościowe Nowej Generacji (Next Generation Performance Testing).
Zakłada ona elastyczne podejście do projektów i procesów wytwórczych, pełną automatyzację całego procesu testów wydajnościowych oraz indywidualne podejście, dopasowane do używanych technologii. Wszystko to osiągnięto dzięki bliskiej współpracy z liderami branży testów wydajnościowych, takimi jak Tricentis, Dynatrace i Microsoft.
Podejście drugie
Drugie z podejść, które kształtują się na przestrzeni lat, to Infrastructure as Code. Polega ono na zarządzaniu i dostarczaniu infrastruktury za pomocą kodu zamiast poprzez procesy manualne. Obejmuje to zarówno wdrażanie nowych wersji aplikacji, jak i testowanie.
Jednakże, wykorzystanie klasycznych narzędzi do testów wydajnościowych, takich jak np. JMeter, nie wpisuje się w tę konwencję. Skrypty w nim pisane są w formacie XML, co utrudnia przegląd kodu i spowalnia proces dostarczania skryptów. W praktyce skrypty nie są dostarczane jako kod, ponieważ do ich edycji potrzebne jest GUI, co utrudnia wdrożenie automatycznego testowania w CI/CD. Ponadto, dla większych zespołów problemem jest utrzymanie spójności skryptów po wprowadzeniu kilku zmian równocześnie.
Aby rozwiązać te wyzwania, zespół k6 opracował wiele innowacyjnych rozwiązań. Wśród nich znajduje się:
- możliwość dodawania Service Level Objective (SLO) bezpośrednio w skrypcie,
- integracja z różnymi narzędziami do monitorowania systemu,
- zaawansowane opcje integracji z CI/CD.
Perspektywy rozwoju narzędzia k6
Ważnym aspektem, który należy wziąć pod uwagę przy wyborze narzędzia do projektu, jest wsparcie społeczności oraz zespół developerski odpowiedzialny za rozwój narzędzia. Dlaczego jest to tak istotne? Istnieje ryzyko, że projekt zostanie porzucony z dnia na dzień (jak np. w przypadku Pylot) lub przestaną być udostępniane nowe wersje. Niestety, takie sytuacje często występują w przypadku projektów open source. Dlatego patrzę bardziej przychylnie na narzędzia, które są w pełni lub częściowo płatne. Ich przykładem są m.in.: NeoLoad, NBomber czy Artillery. Jednak na nich skupimy się w oddzielnym artykule.
Grafan Labs
Aby zdać sobie sprawę z tego, jak wielkim przedsięwzięciem jest k6, musimy cofnąć się jeszcze na chwilę do jego historii. Kluczowe jest dla nas to, że od czerwca 2021 roku k6 jest rozwijane pod skrzydłami Grafana Labs. Są to specjaliści z obszarów monitorowania i obserwowalności systemów. Ich flagowym narzędziem jest Grafana odpowiedzialna za wizualizację danych. Projekty warte wyróżnienia to też: Loki, Mimir oraz Phlare.
Oprócz nich, Grafana Labs również angażuje się w rozwijanie innych projektów open source, takich jak:
- Prometheus – gromadzenie i przechowywanie metryk w seriach czasu,
- Cortex – skalowalne magazyny metryk,
- Jaeger – rozproszone śledzenie.
Te projekty są częścią szerszego ekosystemu narzędzi monitoringu i analizy danych, często wykorzystywanych razem z Grafaną.
To wszystko skłania mnie do przekonania, że zaangażowanie tak dużego gracza w dziedzinie monitorowania systemów w rozwój narzędzia do testów wydajności jest trafną decyzją, która może przynieść rewolucyjne zmiany w obszarze wydajności.
Kierunek rozwoju
Innym, istotnym aspektem jest kierunek, w którym rozwija się samo narzędzie. Nie ogranicza się ono jedynie do mierzenia i analizy wydajności aplikacji, ale zostało rozszerzone o możliwość wykonywania testów funkcjonalnych, a następnie Chaos testów. Początkowo były to oddzielne projekty, ale po wielu miesiącach prób i błędów zdecydowano się je włączyć do podstawowej dokumentacji narzędzia. Jest to istotne, ponieważ wprowadza interesujący kierunek rozwoju współczesnych testerów jakości (QA) oraz ich dotychczasowej pracy.
Charakter przeprowadzania testów wydajnościowych oraz testów chaosu rozwija się w kierunku pełnej automatyzacji i integracji z procesami ciągłych integracji w zgodzie z praktyką „shift left”. Jest to kluczowe, ponieważ taki kierunek skutecznie poszerza kompetencje testerów wydajności o wiedzę zarówno z obszaru DevOps, jak i architektury aplikacji. W tym momencie QA przestaje być osobą odpowiedzialną za przeprowadzanie testów jedynie na końcowym etapie wdrożenia aplikacji, a zamiast tego zaczyna zautomatyzowaną analizę już na wczesnych jej etapach.
Love hate relationship, czyli zalety i wady k6
K6 wyróżnia się kilkoma zaletami, takimi jak:
- niewielki próg wejścia,
- zdolność do integracji z różnymi usługami firm trzecich,
- wsparcie ze strony społeczności i doświadczonego zespołu deweloperów.
Ponadto, dzięki wykorzystaniu języka JavaScript do pisania scenariuszy, k6 zapewnia łatwość zrozumienia i pozwala na budowę przyjaznego frameworku do testowania wydajności aplikacji. Dodatkowo, wykorzystanie języka Go jako podstawy narzędzia k6 przekłada się na wysoką wydajność, umożliwiając przeprowadzanie testów z dużym obciążeniem nawet przy ograniczonych zasobach.
Jednakże, jak każde narzędzie, k6 ma także swoje wady.
Jedną z napotkanych przeze mnie wad jest niestabilność części z rozszerzeń stworzonych przez społeczność. Zrozumiałe jest, że zespół deweloperski nie jest w stanie zapewnić pełnego wsparcia dla każdego protokołu czy integracji k6 z mniej popularnymi narzędziami. To może prowadzić do niestabilności i dużego stopnia zawodności niektórych z rozszerzeń. Dodatkowo, jeśli zdecydujemy się na jednoczesne użycie wielu z nich, istnieje duże prawdopodobieństwo, że nie będą one kompatybilne ze względu na wykorzystywane pod powłoką biblioteki Go (k6 oraz jego rozszerzenia są napisane w tym języku).
Kolejną wadą jest brak wsparcia dla mało znanych protokołów. Pomimo ogromnego zainteresowania społeczności k6, jest ono relatywnie nowym narzędziem w porównaniu do alternatyw takich jak JMeter, Locust czy NeoLoad. Wybór mniej dojrzałego oprogramowania może utrudnić rozbudowę frameworku, integracje i, w skrajnych przypadkach, wymusić zmianę narzędzia oraz refaktoryzację testów. Osobiście uważam, że k6 doskonale sprawdza się w przypadku prostych projektów lub tych opartych głównie na protokole HTTP. Jednakże, jeśli chodzi o zastąpienie narzędzi takich jak Playwright (do testów funkcjonalnych) czy LitmusChaos (do chaos testów) przy użyciu k6, konieczne może okazać się poczekanie jeszcze kilka miesięcy, a nawet lat.
Alternatywy?
Omówiliśmy już całą metodologię i wizję, które kryją się za narzędziem k6. Wiemy, jakie są perspektywy jego rozwoju oraz jakie posiada możliwości i ograniczenia. Na rynku trudno jest znaleźć alternatywy, które pasowałyby do obecnych trendów. Ponadto, niewiele narzędzi jest na tyle stabilnych, aby sprostać wymaganiom zarówno dużych korporacji, jak i małych startupów. W związku z tym, poszukiwanie idealnego narzędzia trzeba prowadzić tam, gdzie istnieje niezawodność i nieograniczone możliwości użycia. Gdzie więc można znaleźć ten „Święty Graal”?
Jedną z opcji jest NeoLoad od firmy Tricentis. Ponieważ nie jest to narzędzie open source, unikniemy sytuacji, w których natkniemy się na niestabilność lub brak wsparcia dla integracji z protokołami używanymi we współczesnych projektach. Co więcej, na uznanie zasługuje fakt, że NeoLoad jest rozwijane nieprzerwanie od 2005 roku, a jego design umożliwia doświadczonemu inżynierowi migrację z powszechnie stosowanego JMetera w zaledwie jeden dzień.
Migracja do NeoLoad dla niejednego klienta okazała się bardzo dobrą inwestycją, która w dłuższej perspektywie przyniosła profity w postaci szybszego i łatwiejszego wykonywania testów oraz znacznie mniejsze nakłady na utrzymanie skryptów.
Konkluzja
K6 wygrywa z wszystkimi innymi narzędziami dostępnymi na rynku, które opierają się na dostarczaniu testów jako kodu (takimi jak JMeter, Artillery czy Gatling). Duże wsparcie ze strony społeczności sprawia, że k6 zajmuje wysoką pozycję, przewyższając zarówno Locust jak i Gatlinga. Ponadto, dostępność szerokiego spektrum rozszerzeń pozwala na elastyczne i spersonalizowane podejście do projektów. Obecnie na stronie k6 dostępnych jest ponad 73 rozszerzeń. Dla porównania, JMeter posiada ich 107. To świadczy o zainteresowaniu i zaangażowaniu społeczności, która wspiera rozwój k6.
Dodatkowo, bliska współpraca z firmą Grafana Labs przyczyniła się do znacznego rozwoju narzędzia w wielu obszarach testowania. To z kolei poskutkowało promowaniem Inżynierii Wydajności, wspieranej bezpośrednio przez ekspertów z zespołu w Sii.
Co przyniesie nam przyszłość?
W dzisiejszych czasach zakres kompetencji inżyniera ds. wydajności stale się poszerza. Dlatego, aby sprostać temu wyzwaniu, konieczne jest nie tylko wybranie odpowiedniego narzędzia, ale również opracowanie metodologii, która spełnia obecne wymagania projektowe. Ręczne uruchamianie testów i wielokrotne analizowanie tych samych danych staje się przestarzałe na rzecz pełnej automatyzacji, testowania oprogramowania we wczesnych fazach projektu i dostarczania całości jako kodu.
Nie jesteśmy w stanie przewidzieć, jakie zmiany przyniesie przyszłość, ale jedno jest pewne – kształtujące się nowe podejścia w dziedzinie testów wydajności będą rewolucyjne i wywrócą ten obszar do góry nogami.
K6 świetnie wpisuje się w koncept opisany powyżej ze względu na dostarczanie testów jako kodu i projektowanie scenariuszy testowych z założeniem wielokrotnego uruchomienia. Wszystko to dopełnia w pełni zautomatyzowana analiza wyników testów oraz bliska współpraca z firmą Grafana Labs.
Źródła
***
Jeśli chcesz wiedzieć więcej o narzędziu k6, zobacz koniecznie nową serię vlogów przygotowaną przez naszych ekspertów.
Zostaw komentarz