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