我正在根据几个条件负载测试将重定向用户的本地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()