我正在加载测试本地API,该API将根据一些条件重定向用户。 Locust不会重定向模拟用户点击终点,我知道这是因为应用程序记录了所有重定向。如果我使用curl
手动点击结束点,我可以看到状态为302
并设置了Location
标题。
根据嵌入的clients.HttpSession.request对象,默认情况下allow_redirects
选项设置为True。
有什么想法吗?
答案 0 :(得分:1)
由于Locust使用Python的Requests HTTP库,您可能会在那里找到答案。 The Response object可用于评估重定向是否已发生以及重定向的历史记录包含的内容。
is_redirect:
如果此响应是格式良好的HTTP重定向,则为真 自动处理(通过Session.resolve_redirects)。
可能表明重定向的格式不正确。
答案 1 :(得分:1)
我们在蝗虫测试中使用重定向,尤其是在登录阶段。重定向是为我们顺利处理的。打印您收到的回复的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('/foo', 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()