2016-03-03 35 views
0

我想驗證什麼是使用Python代碼端點的節流限制。 基本上我在我測試的端點上設置Throttlelimit是3calls/sec。該測試進行4次呼叫並檢查狀態代碼以獲得至少1 429響應。 驗證我有時失敗,因爲它看起來像回覆需要一秒多的時間作出迴應。我試過的代碼是: 方法一:如何發送多個請求,並確保響應在一秒鐘內回到python

request = requests.Request(method='GET', url=GLOBALS["url"], params=context.payload, headers=context.headers) 
context.upperlimit = int(GLOBALS["ThrottleLimit"]) + 1 
reqs = [request for i in range(0, context.upperlimit)] 
with BaseThrottler(name='base-throttler', reqs_over_time=(context.upperlimit, 1)) as bt: 
    throttled_requests = bt.multi_submit(reqs) 
context.responses = [tr.response for tr in throttled_requests] 
assert(429 in [ i.status_code for i in context.responses]) 

方法2:

request = requests.get(url=GLOBALS["url"], params=context.payload,  headers=context.headers) 
url = request.url 
urls = set([]) 
for i in range(0, context.upperlimit): 
    urls.add(grequests.get(url)) 
context.responses = grequests.map(urls) 
assert(429 in [ i.status_code for i in context.responses]) 

有沒有一種方法,我可以確保所有的響應在同一秒回來,如果沒有它應該再試一次在測試失敗之前。

回答

0

我想你正在使用請求和grequests庫。您可以按照docs以及grequests中的說明設置超時時間。

平原請求

requests.get(url, timeout=1) 

使用grequests

grequests.get(url, timeout=1) 

超時值

0

使用timeout並不一定會確保你正在尋找,條件 「秒數」,這所有4個請求都是在一秒鐘內被端點收到的(並不是說在發送請求的一秒內收到每個單獨的響應)。解決這個

一個快速和骯髒的方式是代碼的簡單的執行時間,並確保所有的反應均在接收到比第二(使用timeit模塊)少

start_time = timeit.default_timer() 
context.responses = grequests.map(urls) 
elapsed = timeit.default_timer() - start_time 
if elapsed < 1: 
    assert(429 in [ i.status_code for i in context.responses]) 

這是粗因爲它正在檢查往返時間,但會確保所有請求都在一秒鐘內收到。如果您需要更多的特性,或者發現條件不夠經常,您可以在響應中添加一個頭,確切的時間是端點收到請求的時間,然後驗證所有請求在一秒鐘內到達終端彼此。

相關問題