在自動化接口測試中,我們經常需要發(fā)送HTTP請求來模擬用戶的操作并驗證接口的正確性。夠靈活處理請求參數、添加認證信息以及處理依賴參數。這正是鉤子函數的用武之地。
下面勇哥將以一個實際的示例場景為例,詳細介紹如何利用鉤子函數進行自動化接口測試,并展示如何設計和應用這些鉤子函數。
鉤子函數設計
遙想當年,勇哥一開始對【鉤子】也是懵逼的!!鉤子函數就是在特定事件發(fā)生前后執(zhí)行的函數。通過鉤子我們可以在 HTTP 請求的不同階段執(zhí)行花里胡哨的自定義操作,如修改URL、更新請求頭、請求參數加密加簽、處理響應結果...
上代碼:
```Python/ target=_blank class=infotextkey>Python
class Hooks:
def __init__(self):
self.before_request_funcs = {}
self.after_request_funcs = {}
def before_request(self, func):
"""
注冊 before_request 鉤子函數
"""
self.before_request_funcs[func.__name__] = func
return func
def after_request(self, func):
"""
注冊 after_request 鉤子函數
"""
self.after_request_funcs[func.__name__] = func
return func
def run_before_request_hooks(self, func_names, request, json_data):
"""
執(zhí)行 before_request 鉤子函數
"""
for func_name in func_names:
if func_name in self.before_request_funcs:
func = self.before_request_funcs[func_name]
json_data = func(request, json_data)
return json_data
def run_after_request_hooks(self, func_names, request, response):
"""
執(zhí)行 after_request 鉤子函數
"""
for func_name in func_names:
if func_name in self.after_request_funcs:
func = self.after_request_funcs[func_name]
response = func(request, response)
return response
場景:注冊用戶
模擬用戶注冊,并驗證注冊接口的正確性。同時,在每個請求中自動添加認證信息和處理依賴參數。
錢包: 封裝請求
有錢才能吃飯,所以我們看看怎么封裝代碼:
def req(url, method, **kwargs):
"""
發(fā)送請求并返回響應對象
"""
before_hooks = kwargs.pop('before_hooks', [])
after_hooks = kwargs.pop('after_hooks', [])
json_data = kwargs.pop('json', {})
request = requests.Request(method=method, url=url, **kwargs)
prepared_request = session.prepare_request(request)
json_data = hooks.run_before_request_hooks(before_hooks, prepared_request, json_data)
prepared_request.body = json.dumps(json_data)
response = session.send(prepared_request)
response = hooks.run_after_request_hooks(after_hooks, prepared_request, response)
return response
上述代碼中,勇哥先封裝一個http請求,在里面實現不同位置調用鉤子函數
買菜:寫測試用例
常規(guī)玩法,干百度。
def test_user_registration():
url = "http://www.bAIdu.com"
# url = "http://jsonplaceholder.typicode.com/posts"
data = {
"userId": "testuser",
"title": "password123",
"body": "測試玩家勇哥"
}
headers = {
"Content-Type": "Application/json"
}
before_hooks = [add_authentication_headers.__name__, handle_dependent_parameters.__name__]
after_hooks = [after_dependent_parameters.__name__]
kwargs = {"json": data, "headers": headers}
return req(url, "post", before_hooks=before_hooks, after_hooks=after_hooks, **kwargs)
在上述測試用例中,我們使用req函數發(fā)送了一個POST請求來模擬用戶注冊,并對返回的響應進行了斷言驗證。
切菜:注冊前置鉤子函數
寫N個前置鉤子函數,發(fā)送注冊請求前自動添加認證信息:
@hooks.before_request
def add_authentication_headers(request, json_data):
"""
添加認證頭信息
"""
print("前置鉤子函數,添加認證頭信息", request)
request.headers["Authorization"] = "Bearer YOUR_AUTH_TOKEN"
return json_data
@hooks.before_request
def handle_dependent_parameters(request, json_data):
"""
處理依賴參數
"""
print("前置鉤子函數,處理依賴參數", request)
json_data["verification_code"] = get_verification_code()
return json_data
定義一個add_authentication_headers函數,它是一個前置鉤子函數。在這個鉤子函數中,我們通過調用get_access_token函數獲取訪問令牌,并將其添加到請求的Authorization頭信息中。
通過注冊該鉤子函數,每次發(fā)送請求前都會自動添加認證信息,無需在每個測試用例中重復編寫。
切菜前的工具箱:封裝公共方法
def get_verification_code():
# 實現獲取驗證碼的邏輯
return "YOUR_VERIFICATION_CODE"
上述代碼是可以是一些公共函數,以便全局使用,比如我們這里寫一些獲取驗證碼的方法
煮菜:處理依賴參數
處理一些依賴參數,例如在注冊用戶之前需要獲取一個驗證碼,并將驗證碼添加到注冊請求中。
@hooks.after_request
def after_dependent_parameters(request, response):
"""
處理后置
"""
print("發(fā)送請求后執(zhí)行", request, "后置鉤子函數,處理依賴參數", response)
return response
我們又定義了一個后置鉤子函數。在這個鉤子函數中,我們調用after_dependent_parameters函數處理一些依賴數據,并返回任意結果。
通過注冊該鉤子函數,每次發(fā)送請求前以及發(fā)送請求后都會自動處理依賴參數,使我們的測試用例更加簡潔和可維護。
上菜:執(zhí)行測試用例
可以按照這種方式執(zhí)行測試用例,并觀察鉤子函數的作用。:
if __name__ == "__main__":
res = test_user_registration # 執(zhí)行測試
print("打印看看響應結果",res)
輸出結果如下:
執(zhí)行test_user_registration()函數來執(zhí)行我們的測試用例,但是這個測試用例在前面已經被我們注冊了很多鉤子函數,所以不需要額外處理,我們在買菜這部分就已經實現了,通過不同的函數名,執(zhí)行不同的鉤子函數,非常靈活,擴展性非常強。
吃飽擦嘴
以上就是勇哥使用鉤子函數在自動化接口測試中實現了對HTTP請求的增強和擴展的示例和思路,希望能夠為各位在自動化接口測試中的工作帶來一些啟發(fā)和幫助。