Locustio (Python) 登录

4 python load http python-requests locust

我想在网站上做一些负载测试。首先,这是我的代码:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
def on_start(self):
    """ on_start is called when a Locust start before any task is scheduled """
    self.login()

def login(self):
    post_data = {'username':'my_login', 'password':'my_pass', 'Login':'Login'}
    with self.client.post('/sign_in', post_data, catch_response=True) as response:
        if 'cookie' not in response.cookies:
            response.failure('login failed')
@task(2)
def index(self):
    self.client.get("/admin")

@task(1)
def profile(self):
    self.client.get("/profile")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000
Run Code Online (Sandbox Code Playgroud)

我正在运行 locust :locust --host= https://my_host

我总是收到 405 err 错误报告:

11 POST /sign_in: "CatchResponseError('登录失败',)"

有人可以向我解释如何确保我已登录以及如何使用 locust 执行此操作吗?我有点困惑,因为我也尝试过使用令牌等使事情工作,但仍然相同。

小智 11

您可能需要尝试一些“愚蠢”的事情,具体取决于您的 API 的工作方式,如下所示:

  1. 尝试将尾部斜杠(/)附加到您的端点,例如'/sign_in/'而不是'/sign_in'.
  2. 出于某种原因,当我http在我的宿主变量中使用时出现错误,但是当我使用时它工作正常https. 您可能也想尝试一下。
  3. 如果您有版本,请确保您没有忘记端点中的版本。例如,'https://my_host/v1/sign_in/'

至于使用令牌登录,下面的代码对我来说很好用:

from locust import HttpLocust, TaskSet, task
import json


class UserBehavior(TaskSet):

    def __init__(self, parent):
       super(UserBehavior, self).__init__(parent)

       self.token = ""
       self.headers = {}

   def on_start(self):
      self.token = self.login()

      self.headers = {'Authorization': 'Token ' + self.token}

  def login(self):
      response = self.client.post("/sign_in/", data={'username':'my_login', 'password':'my_pass', 'Login':'Login'})

    return json.loads(response._content)['key']

 @task(2)
 def index(self):
     self.client.get("/admin/", headers=self.headers)

 @task(1)
 def profile(self):
     self.client.get("/profile/", headers=self.headers)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000
Run Code Online (Sandbox Code Playgroud)

在我的情况下,调用sign_in, 返回 akey然后我将其用作我的请求的令牌。希望这会有所帮助,我对 Locust 也很陌生。