Introducció a Locust

Que és Locust?

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

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

Estructura general

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

Execució

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)

ui dashboard
Exemple del dashboard en executar Locust amb UI

Exemples

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

Altres coses que poden ser d'interès

    with self.client.get("/stats/socis", catch_response=True) as response:
        response_body = response.json()
        if not response_body.get('state', False):
            response.failure()

Exemple pràctic - hands-on

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: