Locust és una eina que mitjançant scripts permet fer test de càrrega a la nostre API amb el qual es pot simular com reacciona aquesta amb X usuaris fent X Requests Per Second (RPS).
Està enfocat a simular un procés, per exemple el de contractació tindria les request:
Exemple: 50 usuari intenten contractar amb Som Energia
És real que els 50 usuaris facin les peticions alhora? No!
Per solucionar-ho Locust ens don 2 possibilitats que no són excloents:
Nota: Locust està plantejat per testejar API's, però permet testejar qualsevol codi escrit amb python, només cal implementar la connexió amb el sistema que vulguem testejar. Link: custom clients
El mínim que ha de tenir un locustfile és Users i Tasks
User
class WebformsUser(HttpUser): tasks = [NewContractTasks] wait_time = constant(1)
class SomenergiaUser(HttpUser): tasks = {NewContractTasks:1, SomenergiaWebpageUser:50}
Task
@task def check_cups(self): cups = get_random_cups() self.client.get("/check/cups/{}".format(cups)) self.post_body["cups"] = cups
Per aquesta formació tractem només l'execució en la pròpia màquina, però Locust permet realitzar execucions distribuïdes per augmentar el nombre d'usuaris o Request Per Second (RPS)
locust -f locustfile
locust -f locustfile --headless -u 10 -r 1 --host https://ip:port
Exemple del dashboard en executar Locust amb UI
locust -f master.py --master --web-host 192.168.35.249 --web-port 7654 --master-bind-port 4567
locust -f formacio_locust.py --worker --master-host 192.168.35.249 --master-port 4567
from locust import HttpUser, task, tag, between class MyUser(HttpUser): wait_time = between(5, 15) @task(4) def index(self): page = self.client.get("") @task(1) def about(self): page = self.client.get("/ca/qui-som/#quesom")
from locust import User, TaskSet, constant class ForumSection(TaskSet): wait_time = constant(1) @task(10) def view_thread(self): pass @task def create_thread(self): pass @task def stop(self): self.interrupt() # Acaba l'execució de tasques class LoggedInUser(User): wait_time = constant(5) tasks = {ForumSection:2} @task def my_task(self): pass
Exemples extrets de la documentació oficial de Locust
Podeu trobar exemples més variats dins del repositori de Locust
with self.client.get("/stats/socis", catch_response=True) as response: response_body = response.json() if not response_body.get('state', False): response.failure()
Simularem les peticions que rep l'API de webforms cada cop que algú es connecta a la pàgina web
Usuari: Client a través de la web
Flux: Connexió a la web de SomEnergia
Endpoints cridats: