重定向后的蝗虫任务

时间:2017-10-05 13:38:47

标签: redirect locust

我正在加载测试本地API,该API将根据一些条件重定向用户。 Locust不会重定向模拟用户点击终点,我知道这是因为应用程序记录了所有重定向。如果我使用curl手动点击结束点,我可以看到状态为302并设置了Location标题。

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

有什么想法吗?

2 个答案:

答案 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()