Locust: Python framework na load testing pre testerov

Locust je open-source nástroj na záťažové testovanie napísaný v Pythone. Scenáre píšeš ako bežný Python kód, inštalácia trvá pár minút a výsledky sleduješ v reálnom čase v prehľadnom webovom rozhraní. Od prvého príkazu po prvé výsledky uplynie menej ako 30 minút.

Locust load testing v Pythone s metrikami RPS, response time a počtom používateľov
Locust umožňuje simulovať veľké množstvo používateľov a sledovať výkon aplikácie v reálnom čase.

V článku sa dozvieš:

    Čo je Locust a prečo ho testeri obľubujú

    Locust je open-source framework na záťažové testovanie (load testing) napísaný v Pythone. Umožňuje simulovať tisíce používateľov naraz a sledovať, ako server zvláda záťaž. Výsledkom testu je jasná odpoveď na otázku: zvládne tvoja aplikácia reálnu záťaž, alebo začne pri určitom počte súčasných požiadaviek zlyhávať?

    Na rozdiel od nástrojov ako JMeter či Gatling používa Locust čisté Python skripty namiesto XML konfigurácií alebo grafického rozhrania. Môžeš tak využiť všetky štandardné Python knižnice, cykly aj logiku, ktoré poznáš z unit testov alebo API testovania. Pre testerov a vývojárov, ktorí už automatizujú v Pythone, je práca s nástrojom Locust prirodzeným rozšírením existujúcich zručností.

    Projekt vznikol v roku 2011 a má aktívnu komunitu. Rovnaký skript môže bežať lokálne pre 10 používateľov aj distribuovane pre 100 000 bez potreby úprav v kóde. Práve kombinácia nízkej vstupnej bariéry a vysokej škálovateľnosti robí z Locust obľúbenú voľbu pre tímy pracujúce s Pythonom.

    Ako funguje Locust: princíp a architektúra

    Základnou jednotkou v Locust je virtuálny používateľ (virtual user). Každý inštanciovaný objekt triedy HttpUser predstavuje jedného simulovaného používateľa, ktorý vykonáva HTTP požiadavky podľa definovaného scenára. Locust ich nazýva lokusty (locusts), odtiaľ pochádza názov nástroja. Pri spustení testu Locust vytvára nastavený počet virtuálnych používateľov postupne podľa zadaného tempa (spawn rate).

    Reálne správanie používateľov

    Každý virtuálny používateľ vyberá úlohy (@task metódy) náhodne podľa ich váhy a medzi úlohami čaká náhodný čas definovaný parametrom wait_time. Toto správanie realisticky napodobňuje skutočných používateľov, lebo ľudia neklikajú v pravidelných intervaloch. Výsledkom je organická záťaž, ktorá odhalí úzke miesta, ktoré by syntetická, pravidelná záťaž minula.

    Kľúčové metriky v reálnom čase

    Locust priebežne meria tri základné metriky výkonnostného testovania (performance testing):

    • Requests per second (RPS) – priepustnosť systému (throughput).
    • Response time – odozva servera v percentiloch (p50, p95, p99).
    • Failure rate – podiel neúspešných požiadaviek.

    Všetky tieto hodnoty sú viditeľné v reálnom čase v prehľadnom webovom dashboarde na porte 8089.

    Horizontálne škálovanie s master-worker architektúrou

    Pre väčšie testy Locust podporuje master-worker architektúru, ktorá rozdeľuje role medzi dva typy uzlov:

    • Master node: koordinuje test a agreguje výsledky.
    • Worker nodes: generujú samotné HTTP požiadavky.

    Stačí pridať ďalší worker node a záťaž sa automaticky rozdelí medzi všetky workery. Celý distribuovaný test ovládaš z jedného webového UI na master node. Workery môžu bežať na rôznych fyzických serveroch alebo v kontajneroch (Docker, Kubernetes) a komunikujú cez jednoduchý socket protokol, čo minimalizuje overhead distribuovanej koordinácie.

    Inštalácia Locust a prvý locustfile

    Ak sa pýtaš, ako nainštalovať Locust, postup je jednoduchý. Prerekvizity sú minimálne: potrebuješ Python 3.9 alebo novší a nástroj pip. Locust nainštaluješ jedným príkazom, bez sťahovania archívov či manuálnej konfigurácie prostredia. Odporúča sa použiť virtuálne prostredie (venv), aby sa predišlo konfliktom medzi knižnicami a projekt zostal izolovaný.

    Nainštaluj Locust cez pip:
    pip install locust

    Over inštaláciu. Mala by sa zobraziť aktuálna verzia:
    locust --version
    # Výstup: locust 2.x.x

    Vytvor súbor locustfile.py a vlož do neho tento jednoduchý funkčný príklad:

    from locust import HttpUser, task, between
     
    class ApiUser(HttpUser):
        wait_time = between(1, 3)  # náhodné čakanie medzi požiadavkami (sekundy)
     
        @task
        def get_homepage(self):
            self.client.get("/")
     
        @task(3)  # spustí sa 3x častejšie ako get_homepage
        def get_api_status(self):
            self.client.get("/api/status")
    

    Čo znamenajú kľúčové časti tohto skriptu:

    • HttpUser – základná trieda pre virtuálneho používateľa, ktorý komunikuje cez HTTP. Obsahuje zabudovaný HTTP klient (self.client) postavený na knižnici requests.
    • @task – dekorátor, ktorý označuje metódu ako testovací scenár. Číslo v zátvorkách určuje relatívnu váhu, takže @task(3) sa vykoná približne trikrát častejšie ako @task bez čísla.
    • wait_time = between(1, 3) – definuje náhodnú pauzu medzi jednotlivými úlohami v rozmedzí 1 až 3 sekundy. Alternatívne môžeš použiť napríklad constant(1) pre fixný interval.
    Recommend

    Odporúčame ti…

    Ak chceš testovať endpoint s autentifikáciou, pridaj metódu on_start(), ktorá sa vykoná raz pri inicializácii každého virtuálneho používateľa. Je to ideálne miesto na login alebo získanie JWT tokenu. Podobne môžeš použiť on_stop() na cleanup po skončení testu, napríklad odhlásenie používateľa.

    Locust automaticky sleduje HTTP stavové kódy a požiadavky s kódmi 4xx a 5xx označuje ako zlyhania (failures). Ak potrebuješ vlastnú logiku vyhodnocovania, môžeš explicitne označiť požiadavku ako úspešnú alebo neúspešnú pomocou response.success() a response.failure() priamo v tele testovacieho scenára. Je to užitočné napríklad pri testovaní endpointov, kde HTTP 200 ešte neznamená správny obsah odpovede, takže validácia dát je integrálnou súčasťou záťažového testu.

    Spustenie prvého load testu: praktický príklad

    Predstav si konkrétny scenár: testuješ verejné REST API na staging prostredí. Chceš zistiť, ako server zvláda záťaž pri 100 súčasných používateľoch. Spustenie trvá dve minúty a výsledky uvidíš v reálnom čase.

    Vieš, že…

    záťažové testy sa spúšťajú na staging alebo lokálnom prostredí a nikdy nie na produkcii bez predchádzajúceho súhlasu a vopred naplánovaného okna? Záťažový test generuje stovky až tisíce požiadaviek za sekundu a produkčná databáza to pocíti.

    Spusti Locust v termináli z adresára, kde sa nachádza locustfile.py:

    locust -f locustfile.py
     
    # Terminál vypíše niečo takéto:
    # INFO/locust.main: Starting web interface at http://0.0.0.0:8089
    # INFO/locust.main: Starting Locust 2.x.x
    

    Locust teraz beží a čaká na tvoje inštrukcie cez webové rozhranie. Terminál zostáva aktívny, tak ho nezatváraj. Otvor prehliadač na http://localhost:8089.

    Locust web UI: konfiguračná obrazovka pred spustením testu s poľami Number of users, Ramp up a Host
    Pred spustením záťažového testu sa v Locust nastavuje počet virtuálnych používateľov, tempo ich pridávania a testovaný host.

    Nakonfiguruj parametre testu:

    • Number of users: 100 – celkový počet virtuálnych používateľov. Locust ich pridáva postupne, nie naraz.
    • Ramp-up time: 10 s – čas, počas ktorého sa všetkých 100 používateľov postupne pridá; pri 10 sekundách pribudne približne 10 používateľov za sekundu. Krátky ramp-up spôsobí umelý spike, ktorý nezodpovedá reálnemu správaniu.
    • Host – ak máš host hardcoded v locustfile.py, toto pole nechaj prázdne.

    Klikni Start a sleduj, ako sa test rozbieha.

    V záložke Charts vidíš v prvých sekundách ramp-up fázu: počet aktívnych users plynulo rastie a spolu s ním stúpa RPS (Requests per Second). To je zdravý štart.

    V záložke Statistics máš pre každý endpoint živé čísla. Pozri si tri kľúčové signály:

    Locust web UI: záložka Statistics s metrikami Median, 95%ile, 99%ile a Current RPS pre jednotlivé endpointy počas load testu
    Záložka Statistics zobrazuje priebežné výsledky load testu vrátane RPS, chybovosti a percentilov odozvy.
    • Current RPS – ak sa prestane zvyšovať aj keď pridávaš používateľov, znamená to, že server dosiahol svoj throughput cap.
    • Current Failures – ideálne nula; ak začne rásť, pozri záložku Failures pre presný error message.
    • p95 / p99 – percentily odozvy v milisekundách. Ak je p99 výrazne vyšší ako p95 (napríklad p95 = 200 ms, p99 = 2 000 ms), máš intermitentný problém: garbage collection pauzy, connection pool exhaustion alebo timeout na pomalých dotazoch.

    Po 2 až 3 minútach stabilnej záťaže máš dosť dát. Klikni Stop a Locust dobeží aktuálne požiadavky a zastaví generovanie záťaže. Výsledky zostávajú viditeľné v UI, kým neobnovíš stránku alebo nespustíš nový test.

    Locust ti povie, kde problém je. Na identifikáciu prečo potrebuješ server-side metriky: pomalé SQL dotazy (EXPLAIN ANALYZE), vyťaženosť CPU a pamäte, alebo APM nástroj ako Datadog či New Relic. Locust je diagnostický štartovací bod, nie kompletný observability stack.

    Recommend

    Odporúčame ti…

    Spusti test dvakrát po sebe a porovnaj p95. Ak sa výrazne líši (napr. 180 ms vs. 450 ms), máš problém s nestabilitou prostredia: cache cold start alebo nespoľahlivý staging. Stabilné výsledky sú predpokladom zmysluplného záťažového testovania.

    Headless mód pre CI/CD pipeline

    Pre zaradenie testu do CI/CD pipeline použi headless mode. Locust beží bez webového UI a riadi sa výhradne parametrami príkazového riadku:

    locust -f locustfile.py --headless \
      --users 100 --spawn-rate 10 \
      --run-time 3m \
      --host https://staging.api.example.com \
      --csv=results \
      --exit-code-on-error 1
    
    • --exit-code-on-error 1 – ak failure rate presiahne prah, Locust vráti exit kód 1 a pipeline zlyhá.
    • Výstupné CSV súbory (results_stats.csv, results_history.csv, results_failures.csv) archivuj ako pipeline artefakt pre historické porovnanie výkonu.

    Locust vs. JMeter: Kedy použiť ktorý nástroj

    Locust a JMeter sú dnes dve najpopulárnejšie open-source riešenia na záťažové testovanie, no každé slúži inému profilu tímov.

    Locust je ideálna voľba, ak píšeš automatizované testy v Pythone. Scenáre sú čistý Python kód, žiadne XML ani GUI klikanie. Onboarding zaberá hodiny, nie dni, škálovanie na master-worker architektúru je jednoduché a nástroj je zdarma aj pre komerčné použitie. Slabina: primárne pokrýva HTTP/HTTPS, pre SOAP, JDBC alebo JMS potrebuješ custom klientov.

    JMeter podporuje viac typov protokolov hneď po nainštalovaní a má veľkú komunitu používateľov. Je vhodný, ak tím nemá skúsenosti s Pythonom, testuje staršie systémy s neštandardnými protokolmi alebo potrebuje rozsiahle firemné reporty. Nevýhodou je, že sa ťažšie učí a konfigurácia pre komplexnejšie testy je v XML súboroch náročná na údržbu.

    Ak píšeš automation testy v Pythone a testuješ REST API alebo mikroslužby, Locust je prirodzená voľba. Pre Java/JVM tímy stojí za zváženie Gatling (Scala DSL), pre JavaScript prostredie zase k6.

    Tipy pre pokročilé použitie Locust

    Locust toho zvládne oveľa viac ako spustiť základný HTTP test. Tu je päť funkcií, ktoré oceníš, keď tvoje testy začnú rásť:

    Custom client pre gRPC a WebSocket

    Locust nie je obmedzený na HTTP. Vlastného klienta vytvoríš dedením z triedy User a implementáciou metód pre odosielanie požiadaviek a reportovanie výsledkov. Pre MQTT a SocketIO má Locust vlastné triedy a pre gRPC nájdeš vzorového klienta v oficiálnej dokumentácii Locust. Klientov pre WebSocket, Kafka a ďalšie protokoly udržiava komunita v repozitári locust-plugins na GitHub.

    Distribuované záťažové testy: master + worker nodes

    Pre generovanie záťaže v tisícoch concurrent users spustíš jeden master (locust --master) a ľubovoľný počet worker procesov (locust –worker –master-host=<IP>). Locust automaticky rozdelí virtuálnych používateľov medzi workery a agreguje výsledky do jedného dashboardu.

    Integrácia so CI/CD pipeline

    V GitHub Actions pridáš Locust ako krok po deploy na staging. Flag --exit-code-on-error 1 spôsobí zlyhanie buildu, ak failure rate presiahne definovaný prah. Threshold môžeš nastaviť aj cez vlastný listener na events.quitting.

    Export výsledkov do Grafana

    Locust generuje CSV súbory so štatistikami (stats, history, failures) po každom behu. Pre real-time vizualizáciu môžeš posielať metriky priamo do kombinácie Prometheus a Grafana cez dostupný community plugin. Je to ideálne pre dlhodobé monitorovanie výkonnostného trendu a porovnávanie výsledkov medzi jednotlivými release verziami aplikácie.

    Locust Cloud ako managed riešenie

    Ak nechceš spravovať vlastnú worker infraštruktúru, Locust Cloud poskytuje managed distributed load testing s integrovanými reportmi, tímovou spoluprácou a historickými výsledkami. Je vhodný pre väčšie tímy, ktoré chcú škálovateľnosť bez DevOps overheadu.

    Recommend

    Odporúčame ti…

    Pri navrhovaní záťažových testov platí základné pravidlo: začni vždy s nízkym počtom virtuálnych používateľov a postupne zvyšuj záťaž v krokoch, takzvaný ramp-up prístup. Tým zistíš, pri akom počte concurrent users začína výkon aplikácie degradovať. Tento zlomový bod (performance baseline) je cennejším výstupom ako samotné číslo maximálneho zaťaženia, pretože definuje hranicu, pri ktorej je nutná optimalizácia kódu alebo infraštruktúry.

    FAQ: Často kladené otázky o Locust

    Čo je Locust v testovaní?

    Locust je open-source framework na záťažové testovanie (load testing) napísaný v Pythone. Umožňuje definovať správanie virtuálnych používateľov ako Python kód a simulovať tisíce súbežných požiadaviek na server. Nástroj meria kľúčové metriky výkonnostného testovania (performance testing), teda response time, requests per second a failure rate, a zobrazuje ich v reálnom čase v prehľadnom webovom dashboarde.

    Je Locust lepší ako JMeter?

    Pre Python tímy testujúce REST API a mikroslužby áno – Locust ponúka jednoduchší onboarding, čistejší kód scenárov a ľahšie škálovanie. JMeter má širšiu protokolovú podporu (SOAP, JDBC, JMS) a väčšiu komunitu, čo ho robí vhodnejším pre legacy systémy alebo tímy bez Python skúsenosti. Rozhodujúcim faktorom je technologický stack tímu, typ testovaného systému a požiadavky na škálovanie.

    Akú úroveň Pythonu musím ovládať na prácu s Locust?

    Postačuje základná znalosť Pythonu: triedy, metódy, dekorátory a práca s HTTP požiadavkami. Ak vieš napísať jednoduchý Python skript a rozumieš konceptu objektovo-orientovaného programovania, prvý funkčný locustfile.py napíšeš do hodiny. Pokročilejšie funkcie ako custom klienti pre gRPC, distribuované testy alebo integrácia s CI/CD systémami vyžadujú hlbšie znalosti Pythonu a systémovej konfigurácie.

    Je Locust zadarmo?

    Áno, open-source verzia Locust je zdarma vrátane komerčného použitia – distribuuje sa pod licenciou MIT, ktorá kladie minimálne obmedzenia. Locust Cloud, teda managed hosted verzia s pokročilými reportmi, distribuovanou infraštruktúrou a tímovými funkciami, je komerčná platená služba. Pre väčšinu tímov a testovacích scenárov open-source verzia plne postačuje.

    Ako zaintegrovať Locust do CI/CD pipeline?

    Locust v headless mode spúšťaš priamo z príkazového riadku bez spustenia webového UI. V GitHub Actions alebo Jenkins pipeline pridáš krok s príkazom locust --headless a parametrami --users, --spawn-rate, --run-time a --host. Pre automatické vyhodnotenie nastav --exit-code-on-error 1, čím build zlyhá, ak test zaznamená zlyhania. Výsledky v CSV formáte archivuj ako pipeline artefakt pre historické porovnanie výkonu.

    Locust: minimum nastavenia, maximum výsledkov

    Locust možno nie je najkomplexnejší nástroj na záťažové testovanie na trhu, no pre Python tímy testujúce REST API ponúka presne to podstatné – jednoduchý začiatok, flexibilné scenáre a okamžitý prehľad o výsledkoch. Testy píšeš v jazyku, ktorý už poznáš, a keď potrebuješ simulovať väčšiu záťaž, môžeš ich spustiť na viacerých počítačoch bez úprav kódu. Ak so záťažovým testovaním ešte len začínaš, Locust je výborná voľba.

    Najviac sa však naučíš praxou. Vytvor si vlastný locustfile.py, spusti ho v staging prostredí a sleduj, ako sa aplikácia správa s rastúcim počtom virtuálnych používateľov. Keď začne výraznejšie rásť čas odozvy alebo pribúdať chybových požiadaviek, práve v tomto bode zistíš, čo znamená skutočné výkonnostné testovanie.

    O autorovi

    Katarína Kučáková

    Software Test Engineer

    Moja cesta k testovaniu softvéru sa začala v roku 2019 až po štúdiu ekonómie a pracovných skúsenostiach v iných odvetviach. To mi pomohlo vnímať IT svet v rôznych súvislostiach. Ten totiž ponúka neustále nové výzvy, pre ktoré rada hľadám riešenia. Obľubujem oddych pri čítaní, turistiku alebo lyžovanie. LinkedIn

    Daj nám o sebe vedieť