Используйте setattr в классе Locust

#python #locust

#python #locust

Вопрос:

Я использую Locust для нагрузочного тестирования API. В качестве примера я отправляю запрос GET в Google. Мой ВАРИАНТ ИСПОЛЬЗОВАНИЯ заключается в том, что я хочу создать методы @task с помощью setattr, динамически назначая функции классу. Это мой код

 from locust import TaskSet, HttpUser, between, task

@task
def default_method(self):
    self.client.get("/")

class WebsiteTasks(TaskSet):
    def on_start(self):
        print("start process")
        setattr(self, 'index', default_method)

class WebsiteUser(HttpUser):
    host = "https://www.google.com"
    tasks = [WebsiteTasks]
    wait_time = between(1, 10)
  

В качестве ответа у меня есть это исключение при запуске нового браузера нагрузочного теста:

Exception: No tasks defined. use the @task decorator or set the tasks property of the User

Любая помощь будет оценена

Ответ №1:

Добавлять задачи в on_start слишком поздно, так как Locust будет проверять наличие задач перед фактическим запуском (и я думаю, что это правильное поведение, иначе люди могут в конечном итоге запустить on_start только для того, чтобы сразу после завершения теста выполнить сбой)

Что-нибудь мешает вам использовать список, как в этом примере из документации:

 def my_task(user):
    pass

class MyUser(User):
    tasks = [my_task]
    ...
  

Вы все равно можете управлять этим списком из on_start, если он не пуст для начала.

Комментарии:

1. Да, его можно изменить позже. У меня есть потоки, где я это делаю. Просто нужно было иметь хотя бы одну задачу для начала, но затем вы можете вручную редактировать задачи на лету. Я не использую setattr для этого, я напрямую управляю списком задач.