Как переименовать действия саранчи python?

У меня есть следующий код из документации по locustio:

from locust import HttpLocust, TaskSet, between

def login(l):
    l.client.post("/login", {"username":"ellen_key", "password":"education"})

def logout(l):
    l.client.post("/logout", {"username":"ellen_key", "password":"education"})

def index(l):
    l.client.get("/")

def profile(l):
    l.client.get("/profile")

class UserBehavior(TaskSet):
    tasks = {index: 2, profile: 1}

    def on_start(self):
        login(self)

    def on_stop(self):
        logout(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    wait_time = between(5.0, 9.0)

В логах саранчи и сети саранчи (localhost:8089) я вижу следующие задачи

- /login
- /logout
- /
- /profile

Но что, если мне нужно иметь несколько запросов в одной задаче и получать данные по полным задачам (а не по одному запросу).
Я хочу видеть следующее:

- login
- logout
- index
- profile

Я хочу видеть названия задач вместо URL-адреса запроса. В Jmeter я могу вставить несколько запросов в одно действие и получить время действия (не запрос).


person SergeyMoroz    schedule 14.04.2020    source источник


Ответы (2)


Вы можете установить имя по атрибуту name для каждого запроса, см. пример:

def index(l):
  l.client.get("/", name="index")

def profile(l):
  l.client.get("/profile", name="my-profile")
person Mesut GUNES    schedule 20.04.2020

Этого можно добиться, внедрив собственный метод execute_task(), в котором вы запускаете событие request_success.

Что-то вроде этого должно работать:

import time

class TaskReportingTaskSet(TaskSet):
    def execute_task(self, task, *args, **kwargs):
        start = time.time()
        try:
            super().execute_task(task, *args, **kwargs)
        except:
            events.request_failure.fire(
                request_type="task",  
                name=task.__name__, 
                response_time=(time.time()-start)*1000, 
                response_length=0,
            )
            raise
        else:
            events.request_success.fire(
                request_type="task",  
                name=task.__name__, 
                response_time=(time.time()-start)*1000, 
                response_length=0,
            )

class UserBehavior(TaskReportingTaskSet):
    tasks = ...

С приведенным выше кодом будет сообщено о времени выполнения всех задач, если TaskSet наследуется от TaskReportingTaskSet. События request_success должны запускаться отдельно, если вы хотите включить on_start и on_stop.

Если вы не хотите, чтобы о HTTP-запросах сообщалось, вы можете просто использовать HTTP-клиент, который не является одним из встроенных HTTP-клиентов Locust. Например, вы можете напрямую использовать запросы python:

import requests

def index(l):
    requests.get("/")
person heyman    schedule 14.04.2020
comment
Могу ли я использовать этот подход с декораторами @task(weight)? Например @task(2) def execute_task... - person SergeyMoroz; 14.04.2020
comment
Отличный подход! Спасибо. Но что, если execute_task не удалось? В этом случае event.request_success тоже будет уволен - person SergeyMoroz; 14.04.2020
comment
Я обновил ответ, чтобы вызвать событие request_failure, если задача вызывает какое-либо исключение. - person heyman; 15.04.2020