当前位置: 代码迷 >> python >> Locust:我如何仅为当前的 locust 用户与其余任务共享 auth cookie?
  详细解决方案

Locust:我如何仅为当前的 locust 用户与其余任务共享 auth cookie?

热度:116   发布时间:2023-07-16 10:36:46.0

我正在考虑将我的多线程 python 脚本移动到 locust。

我的脚本所做的简单解释是:

  1. 为每个用户创建一个线程
  2. 在每个线程中对用户进行身份验证并获取 auth cookie
  3. 使用该 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

您可以尝试让您的授权函数返回 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)

我认为这里的解决方案是不要为每个调用设置单独的类,而是将调用作为单个类上的方法。 这样您就可以将 cookie 存储在对象上(通过self.cookie引用)。

这对我有用:

我最近在 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)
  相关解决方案