Locust i testy wydajnościowe – wprowadzenie to artykuł który ma poszerzyć Wam wiedzę z zakresu testów wydajnościowych z wykorzystaniem tego narzędzia. Na serwisie pojawiały się już artykuł dot. JMetera, K6 czy Artillery a także FastHttpLoadera.
W dzisiejszym świecie, gdzie wydajność aplikacji internetowych ma kluczowe znaczenie dla sukcesu biznesowego, narzędzia do testów wydajnościowych stają się niezbędne. Jednym z takich narzędzi, które zyskuje coraz większą popularność wśród testerów i inżynierów QA, jest Locust. W tym artykule przyjrzymy się bliżej temu narzędziu i jego zastosowaniu w testach wydajnościowych.
Czym jest Locust?
Locust to open-source’owe narzędzie do testów obciążeniowych, napisane w Pythonie. Wyróżnia się ono prostotą użycia, elastycznością i możliwością skalowania do bardzo dużych obciążeń. Nazwa „Locust” (szarańcza) nie jest przypadkowa – narzędzie to pozwala na symulowanie ogromnej liczby jednoczesnych użytkowników, atakujących Twoją aplikację niczym chmara szarańczy.
Kluczowe cechy Locust
- Oparty na Pythonie: Scenariusze testowe są pisane w czystym Pythonie, co daje ogromną elastyczność i możliwość wykorzystania bogatego ekosystemu bibliotek Pythona.
- Rozproszona architektura: Locust może być uruchamiany na wielu maszynach jednocześnie, co pozwala na generowanie naprawdę dużego obciążenia.
- Interfejs webowy: Oferuje przyjazny dla użytkownika interfejs webowy do monitorowania przebiegu testów w czasie rzeczywistym.
- Możliwość definiowania zachowań użytkowników: Zamiast prostych requestów HTTP, Locust pozwala na definiowanie złożonych zachowań użytkowników.
- Łatwe raportowanie: Generuje szczegółowe raporty i statystyki z przeprowadzonych testów.
Instalacja Locust
Przed przystąpieniem do pracy z Locust, musimy go zainstalować, poprzez wykonanie kilku czynności:
- Wymagania wstępne:
- Upewnij się, że masz zainstalowanego Pythona (wersja 3.6 lub nowsza).
- Zalecane jest utworzenie wirtualnego środowiska dla projektu.
- Instalacja przez pip:
Otwórz terminal i wpisz następującą komendę:
pip install locust
- Weryfikacja instalacji:
Po zakończeniu instalacji, możesz sprawdzić, czy Locust został poprawnie zainstalowany, wpisując:
locust -V
Powinieneś zobaczyć numer wersji zainstalowanego Locust.
- Instalacja dodatkowych zależności (opcjonalnie):
Jeśli planujesz korzystać z zaawansowanych funkcji, możesz zainstalować dodatkowe zależności:
pip install "locust[extras]"
- Instalacja w środowisku produkcyjnym:
Jeśli planujesz używać Locust w środowisku produkcyjnym lub na serwerze CI/CD, zaleca się zainstalowanie go w trybie „standalone”:
pip install locust-standalone
Po zakończeniu instalacji, Locust jest gotowy do użycia. Możesz teraz przejść do tworzenia swojego pierwszego scenariusza testowego.
Jak działa Locust?
Locust symuluje użytkowników (nazywanych „locusts”) wykonujących określone zadania w Twojej aplikacji. Każdy taki użytkownik jest reprezentowany przez oddzielny wątek w Pythonie. Podstawowy przepływ pracy z Locust:
- Definiujesz zachowanie użytkownika w pliku Python.
- Uruchamiasz Locust z linii poleceń lub przez interfejs webowy.
- Określasz liczbę użytkowników do zasymulowania i tempo ich „wylęgania się”.
- Locust generuje obciążenie i zbiera statystyki.
- Analizujesz wyniki w czasie rzeczywistym lub po zakończeniu testu.
Przykładowy scenariusz testowy
Prosty przykład scenariusza testowego w Locust:
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 5)
@task
def index_page(self):
self.client.get("/")
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
W tym scenariuszu definiujemy klasę WebsiteUser
, która reprezentuje użytkownika naszej strony. Użytkownik ten wykonuje dwa zadania: odwiedza stronę główną i przegląda losowe przedmioty. Zadanie view_item
jest wykonywane trzy razy częściej niż index_page
.
Zalety stosowania Locust
- Elastyczność: Możliwość tworzenia złożonych scenariuszy testowych dzięki wykorzystaniu Pythona.
- Skalowalność: Łatwe skalowanie testów do tysięcy równoczesnych użytkowników.
- Czytelność: Kod testowy jest łatwy do zrozumienia i utrzymania.
- Integracja: Łatwa integracja z innymi narzędziami i systemami CI/CD.
- Aktywna społeczność: Duża społeczność użytkowników i aktywny rozwój narzędzia.
Wyzwania związane z Locust
- Znajomość Pythona: Efektywne korzystanie z Locust wymaga znajomości Pythona.
- Ograniczenia pojedynczej maszyny: Przy bardzo dużych obciążeniach może być konieczne użycie wielu maszyn. Natomiast temat znany jest z innych narzędzi które już prezentowałem jak JMeter.
- Brak wbudowanego monitorowania zasobów: Locust nie oferuje wbudowanych narzędzi do monitorowania zasobów testowanego systemu.
Integracja z Gitlab-ci
Aby uruchomić Locusta na Gitlabie potrzeba wykonać kilka prostych kroków. Nie będę tutaj szeroko opisywał, gdyż tematy integracyjne będą objęte odrębnym wpisami. Jednakże chce abyście posiadali gotowy skrypt do uruchomienia testów.
W ramach swojego repozytorium potrzebujecie pliku testowego, oraz pliku .gitlab-ci.yml

stages:
- test
performance_test:
stage: test
image: locustio/locust:latest
script:
- locust -f locustfile.py --host=https://www.example-page.com --users 15 --run-time 25s --headless --logfile mylog.log --html report.html
tags:
- your-runner-name
artifacts:
paths:
- report.html
Raporty
Po zakończonych testach możemy generować raporty w postaci HTMLa. Rezultat z tych testów – będzie na pewno elementem który wesprze Wam analizę z testów wydajnościowych – poprzez przedstawienie wyników.

// Źródło: github.com //
Organizacja projektu
Ważne jest, aby pamiętać, że locustfile.py
jest zwykłym modułem Pythona, który jest importowany przez Locust. Z tego modułu możesz swobodnie importować inny kod Pythona, tak jak zwykle robiłbyś to w dowolnym programie Pythona. Bieżący katalog roboczy jest automatycznie dodawany do sys.path
Pythona, więc każdy plik/moduł/pakiet Pythona, który znajduje się w katalogu roboczym, można importować za pomocą instrukcji importu Pythona.
Dla małych testów, trzymanie całego kodu testowego w jednym pliku locustfile.py
powinno działać dobrze, ale dla większych zestawów testowych prawdopodobnie będziesz chciał podzielić kod na wiele plików i katalogów.
Jak zorganizujesz kod źródłowy testów, jest oczywiście całkowicie zależne od Ciebie, ale zalecamy, abyś stosował się do najlepszych praktyk Pythona. Natomiast przykład struktury plików projektu Locust wygląda następująco:
Katalog główny projektu
common/
__init__.py
auth.py
config.py
locustfile.py
requirements.txt (Zewnętrzne zależności Pythona często są przechowywane w pliku requirements.txt)
Projekt z wieloma plikami locustfile
może również przechowywać je w osobnym podkatalogu:
Katalog główny projektu
common/
__init__.py
auth.py
config.py
my_locustfiles/
api.py
website.py
requirements.txt
W każdej z powyższych struktur projektu, twój plik locustfile
może importować wspólne biblioteki, używając
importcommon.auth
Podsumowanie
Artykuł Locust i testy wydajnościowe – wprowadzenie – to kolejny element poruszający tematykę testów wydajnościowych i prezentujący Wam kolejne narzędzie. Locust to narzędzie do testów wydajnościowych, które może znacząco usprawnić proces testowania aplikacji internetowych. Jego prostota, skalowalność i możliwość tworzenia złożonych scenariuszy testowych czynią go atrakcyjnym wyborem dla wielu zespołów QA. Więcej artykułów znajdziecie w dziale testy wydajnościowe.