我正在根據幾個條件負載測試將重定向用戶的本地API。 Locust不會重定向模擬用戶點擊終點,我知道這是因爲應用程序記錄所有重定向。如果我使用curl
手動命中端點,則可以看到狀態爲302
並設置了Location
標題。跟蹤重定向的蝗蟲任務
根據嵌入的clients.HttpSession.request對象,默認情況下allow_redirects
選項設置爲True。
任何想法?
我正在根據幾個條件負載測試將重定向用戶的本地API。 Locust不會重定向模擬用戶點擊終點,我知道這是因爲應用程序記錄所有重定向。如果我使用curl
手動命中端點,則可以看到狀態爲302
並設置了Location
標題。跟蹤重定向的蝗蟲任務
根據嵌入的clients.HttpSession.request對象,默認情況下allow_redirects
選項設置爲True。
任何想法?
由於Locust使用Python的請求HTTP庫,因此您可能會在那裏找到答案。 The Response object可用於評估重定向是否發生以及重定向歷史包含的內容。
is_redirect:
如果此響應是,本來是 自動處理合式HTTP重定向(由Session.resolve_redirects)。
有可能表示重定向格式不正確。
我們在我們的蝗蟲測試中使用重定向,特別是在登錄階段。重定向爲我們處理順利。打印您回覆的回覆的status_code
。是200,3xx還是更糟?
另一個建議:不要把整個測試工作流程放到locust文件中。這使調試問題變得非常困難。相反,請創建一個獨立的python腳本,該腳本直接使用python請求庫來模擬您的工作流程。在簡單的非蝗蟲測試腳本中消除任何扭曲問題,如重定向問題。一旦你有這個工作,提取你的文件或類,並讓蝗蟲任務使用類。
這裏是我的意思的一個例子。 FooApplication
做了真正的工作,他是由蝗蟲文件和一個簡單的測試腳本消耗。
# foo_app.py
class FooApplication():
def __init__(self, client):
self.client = client
self.is_logged_in = False
def login(self):
self.client.cookies.clear()
self.is_logged_in = False
name = '/login'
response = self.client.post('/login', {
'user': 'testuser',
'password': '12345'
}, allow_redirects=True, name=name)
if not response.ok:
self.log_failure('Login failed', name, response)
def load_foo(self):
name = '/foo'
response = self.client.get('/login', name=name)
if not response.ok:
self.log_failure('Foo request failed ', name, response)
def log_failure(self, message, name, response):
pass # add some logging
# foo_test_client.py
# Use this test file to iron out kinks in your request workflow
import requests
from locust.clients import HttpSession
from foo_app import FooApplication
client = HttpSession('http://dev.foo.com')
app = FooApplication(client)
app.login()
app.load_foo()
#locustfile.py
from foo_app import FooApplication
class FooTaskSet(TaskSet):
def on_start(self):
self.foo = FooApplication(self.client)
@task(1)
def login(self):
if not self.foo.is_logged_in:
self.foo.login()
@task(5) # 5x more likely to load a foo vs logging in again
def load_foo(self):
if self.foo.is_logged_in:
self.load_foo()
else:
self.login()