Подтвердить что ты не робот

Способ использования locust.io путем предоставления списка пользователей

Мне нужно стресс-тест системы и http://locust.io кажется лучшим способом для этого. Однако похоже, что он настроен на использование одного и того же пользователя каждый раз. Мне нужно, чтобы каждый икру регистрировался как другой пользователь. Как мне это настроить? В качестве альтернативы, есть ли другая система, которая будет полезна?

4b9b3361

Ответ 1

Автор саранчи.

По умолчанию каждый пользовательский экземпляр HttpLocust имеет HTTP-клиент, у которого есть отдельный сеанс.

У Locust нет функции для предоставления списка учетных данных пользователя или подобного. Тем не менее, ваши тестовые сценарии загрузки - это всего лишь код python, и, к счастью, тривиально реализовать это самостоятельно.

Вот короткий пример:

# locustfile.py

from locust import HttpLocust, TaskSet, task

USER_CREDENTIALS = [
    ("user1", "password"),
    ("user2", "password"),
    ("user3", "password"),
]

class UserBehaviour(TaskSet):
    def on_start(self):
        if len(USER_CREDENTIALS) > 0:
            user, passw = USER_CREDENTIALS.pop()
            self.client.post("/login", {"username":user, "password":passw})

    @task
    def some_task(self):
        # user should be logged in here (unless the USER_CREDENTIALS ran out)
        self.client.get("/protected/resource")

class User(HttpLocust):
    task_set = UserBehaviour
    min_wait = 5000
    max_wait = 60000

Вышеприведенный код не будет работать при запуске Locust, так как тот же код запускается на каждом подчиненном устройстве node, и они не разделяют какое-либо состояние. Поэтому вам нужно будет ввести некоторый внешний хранилище данных, которое подчиненные узлы могут использовать для разделения состояний (например, PostgreSQL, redis, memcached или что-то еще).

Ответ 2

В качестве альтернативы вы можете создать модуль users.py для хранения информации о пользователе, которая вам нужна в ваших тестовых примерах, в моем примере она содержит email и cookies. Затем вы можете называть их случайным образом в своих задачах. См. Ниже:

# locustfile.py
from locust import HttpLocust, TaskSet, task
from user_agent import *
from users import *


class UserBehaviour(TaskSet):
    def get_user(self):
        user = random.choice(users_info)
        return user

    @task(10)
    def get_siparislerim(self):
        user = self.get_user()
        user_agent = self.get_user_agent()
        r = self.client.get("/orders", headers = {"Cookie": user[1], 'User-Agent': user_agent})

class User(HttpLocust):
    task_set = UserBehaviour
    min_wait = 5000
    max_wait = 60000

Пользователь и пользовательский агент могут вызываться функцией. Таким образом, мы можем протестировать дистрибутив со многими пользователями и различными агентами пользователя.

# users.py

users_info = [
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user'], 
['[email protected]', 'cookies_created_by_each_user']] 

Ответ 3

При реализации этого для распределенной системы я использовал несколько иной подход. Я использовал очень простой сервер флэков, с которым я получил вызов во время части on_start TaskSet.

from flask import Flask, jsonify
app = Flask(__name__)

count = 0    #Shared Variable

@app.route("/")
def counter():
    global count

    count = count+1
    tenant = count // 5 + 1
    user = count % 5 + 1

    return jsonify({'count':count,'tenant':"load_tenant_{}".format(str(tenant)),'admin':"admin",'user':"load_user_{}".format(str(user))})

if __name__ == "__main__":
    app.run()

Таким образом, теперь у меня есть конечная точка, которую я могу получить в http://localhost:5000/ на любом хосте, который я запускаю. Мне просто нужно сделать эту конечную точку доступной для подчиненных систем, и мне не придется беспокоиться о дублированных пользователях или о каком-то типе циклического эффекта, вызванном ограниченным набором user_info.

Ответ 4

Пигги-поддержка на @heyman ответ здесь. Код примера будет работать, но продолжить запуск/остановку тестов в конечном итоге очистит список USER_CREDENTIALS и начнет выдавать ошибки.

В итоге я добавил следующее:

from locust import events # in addition to the other locust modules needed

def hatch_complete_handler(**kw):
    global USER_CREDENTIALS
    USER_CREDENTIALS = generate_users() # some function here to regenerate your list

events.hatch_complete += hatch_complete_handler

Это обновляет ваш список пользователей, как только ваш рой заканчивает вылупление.

Также имейте в виду, что вам понадобится список дольше, чем количество пользователей, которые вы хотите создать.