jlo*_*sli 28 stress-testing locust
我需要对系统进行压力测试,而http://locust.io似乎是最好的解决方法.但是,它似乎设置为每次使用相同的用户.我需要每个spawn以不同的用户身份登录.我该如何设置呢?或者,是否有另一个好用的系统?
hey*_*man 48
蝗虫作者在这里.
默认情况下,每个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
Run Code Online (Sandbox Code Playgroud)
运行Locust分布式时,上述代码不起作用,因为相同的代码在每个从属节点上运行,并且它们不共享任何状态.因此,您必须引入一些外部数据存储区,从属节点可以使用这些数据存储区来共享状态(例如PostgreSQL,redis,memcached或其他).
Mes*_*NEŞ 14
或者,您可以创建users.py模块来保存测试用例中所需的用户信息,在我的示例中,它保持email和cookies.然后,您可以在任务中随机调用它们.见下文:
# locustfile.py
from locust import HttpLocust, TaskSet, task
from user_agent import *
from users import users_info
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
Run Code Online (Sandbox Code Playgroud)
用户和用户代理可以由函数调用.通过这种方式,我们可以与许多用户和不同的用户代理分发测试.
# users.py
users_info = [
['performancetest.1441926507@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926506@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926501@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926499@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926494@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926493@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926492@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926491@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926490@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926489@gmail.com', 'cookies_created_by_each_user'],
['performancetest.1441926487@gmail.com', 'cookies_created_by_each_user']]
Run Code Online (Sandbox Code Playgroud)
在这里支持@heyman 的答案。示例代码可以工作,但继续启动/停止测试将最终清除列表USER_CREDENTIALS,并开始抛出错误。
我最终添加了以下内容:
从 v1.3.0 开始,事件 API 发生了变化。
USER_CREDENTIALS = generate_users()
@events.spawning_complete.add_listener
def spawn_complete_handler(**kw):
global USER_CREDENTIALS
USER_CREDENTIALS = generate_users()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
一旦您的群体完成孵化,这将刷新您的用户列表。
另请记住,您需要的列表比您希望生成的用户数量还要长。