2017-10-05 110 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()