10

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

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

  1. 为每个用户创建一个线程
  2. 在每个线程中验证用户并获取 auth cookie
  3. 使用该 auth cookie 以设定的时间间隔执行各种 api 调用

当我开始研究 locust 时,我注意到以自己的特定时间间隔执行每个任务的唯一方法是,我需要为每个任务创建一个任务集。

这带来了一个问题,即我如何在任务集之间为给定的衍生用户共享身份验证 cookie?因为从长远来看,我还需要在给定的衍生用户的任务集之间共享响应数据,因为它在衍生用户之间是不同的。

在下面的示例代码中,所有由 locust 生成的用户共享同一个“storage.cookie”。有没有办法让 storage.cookie 每个用户保持唯一,并通过 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
4

3 回答 3

6

您可以尝试让您的授权函数返回 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)
于 2018-02-21T12:06:06.117 回答
1

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

这对我有用:

https://gist.github.com/MatrixManAtYrService/1d83abd54adc9d4181f9ebb98b9799f7

于 2019-02-06T18:48:41.963 回答
1

我最近在 DotNet 应用程序负载测试脚本中实现了 cookie。

Cookies 应该使用字典对象来传递。

  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)
于 2019-02-07T17:42:29.607 回答