问题描述
我正在考虑将我的多线程 python 脚本移动到 locust。
我的脚本所做的简单解释是:
- 为每个用户创建一个线程
- 在每个线程中对用户进行身份验证并获取 auth cookie
- 使用该 auth cookie 以设定的时间间隔执行各种 api 调用
当我开始研究 locust 时,我注意到以自己的特定时间间隔执行每个任务的唯一方法,我需要为每个任务创建一个任务集。
这带来了一个问题,即如何在任务集之间共享给定生成用户的 auth cookie? 因为从长远来看,我还需要在给定生成用户的任务集之间共享响应数据,因为它在生成用户之间有所不同。
在下面的示例代码中,所有由 locust 产生的用户共享相同的“storage.cookie”。 有没有办法让每个用户的 storage.cookie 是唯一的,通过 locust 与给定生成的用户的所有任务集共享它? locust 是否报告当前正在执行任务的用户?
from __future__ import print_function
from locust import Locust, TaskSet, task, HttpLocust
import json
def auth(l):
payload = {"username":"some_username","password":"some_password"}
resp = l.client.post('/auth', data = json.dumps(payload))
storage.cookie = # get auth cookie from resp
def do_i_auth(l):
if len(storage.cookie) == 0:
auth(l)
class storage(object):
cookie == ''
class first_call(TaskSet):
def on_start(self):
do_i_auth(self)
@task
def get_api_a(self):
headers = {"Cookie":storage.cookie}
self.client.get('/api_a', headers)
class second_call(TaskSet):
def on_start(self):
do_i_auth(self)
@task
def get_api_b(self):
headers = {"Cookie":storage.cookie}
self.client.get('/api_b', headers)
class api_A(HttpLocust):
task_set = first_call
min_wait = 5000
max_wait = 5000
class api_B(HttpLocust):
task_set = second_call
min_wait = 10000
max_wait = 10000
1楼
您可以尝试让您的授权函数返回 cookie 并将其分别存储在每个类中。 像这样的东西:
from __future__ import print_function
from locust import Locust, TaskSet, task, HttpLocust
import json
def auth(l):
payload = {"username":"some_username","password":"some_password"}
resp = l.client.post('/auth', data = json.dumps(payload))
cookie = # get auth cookie from resp
return cookie
class first_call(TaskSet):
cookie = ""
def on_start(self):
self.cookie = auth(self)
@task
def get_api_a(self):
headers = {"Cookie":self.cookie}
self.client.get('/api_a', headers)
2楼
我认为这里的解决方案是不要为每个调用设置单独的类,而是将调用作为单个类上的方法。
这样您就可以将 cookie 存储在对象上(通过self.cookie
引用)。
这对我有用:
3楼
我最近在 DotNet 应用程序负载测试脚本中实现了 cookie。
cookie 应该使用字典对象传递。
cookiedict={}
cookiedict['Key1'] = 'Value1'
cookiedict['Key2'] = 'Value2'
#Auth API
self.auth_response = self.gettoken(cookiedict)
self.token = self.auth_response.cookies['RequestVerificationToken']
self.cookies = self.auth_response.cookies
#Login API
cookiedict['RequestVerificationToken'] = self.token
`
self.login_response=self.login(self.user_name,self.password,self.token,cookiedict)
另请注意,您还需要使用 HttpSession
from locust.clients import HttpSession
self.requests = HttpSession(consumer_cfg.rest_api_url)
executor = self.requests.post
if method == 'PUT':
executor = self.requests.put
elif method == 'GET':
executor = self.requests.get
self._request_proceed(method='GET', url=url, data=formdata,catch_response=catch_response, cookies = CookiesSent,allow_redirects = True)