亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在生成器中重復執行一個良率步驟?

如何在生成器中重復執行一個良率步驟?

偶然的你 2022-08-25 15:06:55
我正在編寫涉及HTTP請求的測試。我必須按特定順序提出一些請求,但我想檢查每個步驟的響應。所以我認為生成器適合強制執行序列:# Main codedef sequence_of_requests(arg1, arg2):    yield request_a(arg1)    yield request_b(arg1, arg2)    yield request_c(arg1, arg2)然后在我的測試代碼中,我可以寫:# Test codegenerator_responses = sequence_of_requests()r = next(generator_responses)assert r.status_code == 200r = next(generator_responses)assert r.status_code == 204r = next(generator_responses)assert r.status_code == 404問題是,在第一次嘗試時并不總是收到正確的狀態,因此我一直在測試代碼中使用裝飾器包裝此函數,以便它反復嘗試,直到成功或超時。request_c()我想知道是否有某種方法可以在生成器上進行此包裝,因此我仍然可以獲得強制的事件序列。因此,我基本上想知道是否有某種方法可以反復調用生成器的一個屈服步長。注意:我不想將代碼直接放在函數中等待響應,因為它不是測試代碼。該函數僅用于確保以正確的順序完成這些步驟。sequence_of_requestssequence_of_requests
查看完整描述

2 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

您沒有非常具體地說明超時和重試次數,或者成功的條件...但是,為簡單起見,假設您希望重試最多 5 次,重試間隔為 1,并且您希望繼續執行 500(或 5xx)以外的錯誤代碼。


然后你可以使用類似的東西:


import time


def sequence_of_requests(arg1, arg2):

    yield request_a(arg1)

    yield request_b(arg1, arg2)

    for retries in range(5):

        result = request_c(arg1, arg2)

        if result.status_code < 500:

            break

        time.sleep(1)

    yield result

如果達到最大重試次數,則只需返回上次收到的響應。如果獲得有效的響應,則脫離循環并返回良好的響應。


有一個小的低效率,因為如果你達到重試總數,你仍然會睡1秒,然后再返回值。您可以通過顯式管理變量并檢查循環中的限制來解決此問題。但是,對于如何管理放棄,您可能還有其他想法(例如,超時,而不是固定次數的重試),因此您應該調整該部分代碼以遵循對您有意義的邏輯。retries


查看完整回答
反對 回復 2022-08-25
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

您可以生成函數,而不是生成響應值本身,然后可以重復調用這些函數。函數的參數可以使用 應用。functools.partial


from functools import partial



def sequence_of_requests(arg1, arg2):


    yield partial(request_a, arg1)

    yield partial(request_b, arg1, arg2)

    yield partial(request_c, arg1, arg2)

現在可以測試這些步驟:


generator_functions = sequence_of_requests()


r = next(generator_functions)()

assert r.status_code == 200


r = next(generator_functions)()

assert r.status_code == 204


# Repeatedly make the request until the expected status code is returned.

func_slow_request = next(generator_functions)

wait_for_status(404)(func_slow_request)


查看完整回答
反對 回復 2022-08-25
  • 2 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號