2017-10-05 85 views
0

我正在根据几个条件负载测试将重定向用户的本地API。 Locust不会重定向模拟用户点击终点,我知道这是因为应用程序记录所有重定向。如果我使用curl手动命中端点,则可以看到状态为302并设置了Location标题。跟踪重定向的蝗虫任务

根据嵌入的clients.HttpSession.request对象,默认情况下allow_redirects选项设置为True。

任何想法?

回答

0

由于Locust使用Python的请求HTTP库,因此您可能会在那里找到答案。 The Response object可用于评估重定向是否发生以及重定向历史包含的内容。

is_redirect:

如果此响应是,本来是 自动处理合式HTTP重定向(由Session.resolve_redirects)。

有可能表示重定向格式不正确。

0

我们在我们的蝗虫测试中使用重定向,特别是在登录阶段。重定向为我们处理顺利。打印您回复的回复的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()