Остановить саранчу, когда указанное количество пользовательских задач завершено - PullRequest
1 голос
/ 21 января 2020

В моем сценарии я использую Locust без веб-интерфейса. Используемая мной команда:

locust -f my_locust_file --no_web -c 20 -r 4     # as a hack I add -t 10s

Это соответствует тому, что каждую секунду вылупляются 4 пользователя, всего до 20 пользователей.

Моя цель - получить каждого из 20 саранчовых пользователи выполняют задачу, и я хотел бы, чтобы запуск саранчи завершился и завершился, когда завершится задача последнего пользователя (20-й пользователь). Собранная статистика должна включать только время ответа, связанное с каждой задачей.

В этом сценарии было идентифицировано 5 задач (сценарий пользователя ios), которые могут быть случайным образом связаны с пользователем:

class UserScenarios(TaskSet):
    tasks = [Sequence_One, ServerSequence, Components_Sequence, Embedded_Sequence, Connectivity_Sequence]

class MyLocust(HttpLocust):
    def __init__(self):
        super().__init__()
        MyLocust.counter += 1
        print(f"Counter = {MyLocust.counter}")

    counter = 0
    task_set = UserScenarios
    wait_time = between(1, 1)
    host = 'https://*****.com'

Каждое задание (пользовательский сценарий) соответствует разной последовательности из 3 или 4 страниц, которые следует загружать по порядку. Пример санированной и упрощенной последовательности, состоящей из 2 страниц:

class Sequence_One(TaskSequence):

    @seq_task(1)
    def get_task1(self):
        response = self.client.get(url='https://****',
                                   name='https://****',
                                   timeout=30,
                                   allow_redirects=False,
                                   headers={...})   

    @seq_task(2)
    def get_task2(self):
        response = self.client.get(url='https://****',
                                   name='https://****',
                                   timeout=30,
                                   allow_redirects=False,
                                   headers={...})  

Есть ли способ остановить тест после завершения 20-й (n-й) пользовательской задачи? Например, если каждое задание посещает 4 страницы, я хочу, чтобы тест завершался после выполнения запроса 20 * 4 = 80 страниц. На самом деле в рамках этого теста должно быть выполнено всего 80 запросов страниц.

Мой опыт работы с этим тестом заключается в том, что запросы страниц продолжают выполняться после завершения последней пользовательской задачи, пока я не остановлю тест вручную или не использую его вручную. временное ограничение, которое немного больше, чем на самом деле нужно для выполнения задач.

1 Ответ

1 голос
/ 21 января 2020

Это действительно возможно! Хотя это и не задокументировано, по крайней мере в любом месте, которое я смог найти, остановка Locust может быть достигнута путем вызова метода lift StopLocust ()

. В предоставленном сценарии каждая из ваших задач является классом TaskSequence. Чтобы выйти из Locust после выполнения одной задачи, вам нужно добавить еще один шаг (функцию) в общий класс, который вызывает StopLocust (). Ниже приведен пример -

class Scenario(TaskSequence):

    @seq_task(1)
    def task_1(self):
        self.client.get("/going_somewhere")

    @seq_task(2)
    def task_2(self):
        self.client.get("/going_somewhere_else")

    @seq_task(3)
    def done(self):
        raise StopLocust()

По умолчанию саранча настроена так, что никогда не заканчивается, и будет непрерывно выбирать задачу из доступных ей наборов задач. Поднятие метода stop StopLocust () скажет текущему пользователю (Locust) остановиться и больше не будет выбирать задачи, когда достигнет конца этой текущей задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...