在實際的測試工作中,在做接口自動化過程中往往會遇到接口間數據依賴問題,即API_03的請求參數來源與API_02的響應數據,API_02的請求參數又來源與API_01的響應數據,因此通過自動化方式測試API_03接口時,需要預先請求API_02接口,獲取到API_03的請求參數,而獲取API_02的響應又需要預先對API_01發起請求,從響應中提取API_02的請求參數;
下面的自動化框架設計便解決了這一問題
一、用於數據驅動的Excel表格設計
二、框架代碼實現邏輯
當測試 id 為 shop-03 的接口時,首先判斷【是否運行】如果為 'yes' 則判斷該接口請求類型 ’POST' OR 'GET' 走不同的邏輯分支,POST請求的話判斷是否有【case依賴】,【case依賴】為空則無依賴,不為空則獲取依賴的caseid 上述表格中,shop-03的case依賴為shop-02,獲取到依賴的id后,代碼邏輯主動去判斷shop-02接口的相關字段參數(【是否運行】/【請求類型】/【case依賴】),如果shop-02也存在依賴接口shop-01,則代碼繼續判斷shop-01接口對應字段參數,shop-01接口【case依賴】字段為空時,獲取【請求數據】根據請求數據這個字段獲取單獨存儲在字典中的完整的請求參數,發起請求,獲得shop-01的響應后根據shop-01對應的【被依賴接口的返回數據】提取下游接口即shop-02的所需要的依賴參數,存入一個依賴參數列表中,shop-02接口把獲取到的參數代入到請求參數中進行請求,獲取到shop-02的響應后同樣根據【被依賴接口的返回數據】提取下游接口shop-03所需要的依賴參數,存入依賴參數列表,shop-03接口從列表中獲取這個參數代入請求參數,進入請求,獲取響應,根據【實際結果取值字段】獲取要斷言的字段,並對比預期結果完成該接口的測試
# 主邏輯模塊部分代碼示例
'''判斷是否有case依賴,如果有case依賴則執行depend_data.py中的depend_response_data(self,caseid)方法,該方法返回該接口發起請求的依賴參數'''
elif method == 'Post': if depend_caseid: params_data_list = self.depend_result.depend_response_data(depend_caseid) log_info('main_logic.requests_api::根據依賴的caseid={},' '調用depend_data.depend_response_data獲取到的依賴數據為:{}'.format(depend_caseid, params_data_list)) for j in range(len(depend_key_list)): params[depend_key_list[j]] = params_data_list[j][0] header = rquests_headers() log_info('main_logic.requests_api::執行的用例{}請求url為:{},入參為:{},請求頭為:{}'.format(caseid,url,params,header)) response = self.post_requests(url, params, header) # print(response) self.results_list.append(response) else: header = rquests_headers() response =self.post_requests(url, params, header) # print(response) self.results_list.append(response)
#數據依賴模塊部分代碼示例
'''通過excel表中【case依賴】字段一層層向上游接口請求,結果儲存在一個結果列表中供下游接口調用,最后返回測試接口所需要的依賴數據'''
def depend_response_data(self,caseid): depend_caseid_t = self.excel_case_data.get_depend_caseid(caseid) depend_caseid_list = [] #如果case依賴字段不為空 if depend_caseid_t: #獲取接口串聯依賴caseid列表 while depend_caseid_t: depend_caseid_list.append(depend_caseid_t) depend_caseid_t = self.excel_case_data.get_depend_caseid(depend_caseid_t) depend_caseid_list.reverse() depend_caseid_list.append(caseid) march_result_list = [] num_caseid = len(depend_caseid_list) #迭代獲取列表中的caseid for i in range(num_caseid): depend_caseid_s = self.excel_case_data.get_depend_caseid(depend_caseid_list[i]) depend_key_list = self.excel_case_data.get_depend_key(depend_caseid_list[i]).split(",") params_key = self.excel_case_data.get_request_key(depend_caseid_list[i]) params = self.requests_data[params_key] url = self.excel_case_data.get_url(depend_caseid_list[i]) #判斷該caseid的測試用例中case依賴是否為空 if depend_caseid_s: #獲取上一個依賴接口返回的依賴參數 params_data_list = march_result_list[i-1] #根據該caseid數據依賴字段構造該接口的傳參 for k in range(len(depend_key_list)): params[depend_key_list[k]] = params_data_list[k][0] #對該接口發起請求 header = rquests_headers() result = post_requests(url, params, header) getdata = GetExcelDate() is_depend_response = getdata.get_depend_response(depend_caseid_list[i]) #判斷該接口是否需要為下一接口返回依賴參數 if is_depend_response: depend_response_list = is_depend_response.split(",") results = result matchlist = depend_response_list matchparams = match_params(results, matchlist) march_result_list.append(matchparams) else: print("caseid={}不需要返回被依賴的字段".format(depend_caseid_list[i])) #當該caseid測試用例中case依賴為空時直接請求該接口,返回匹配到的下一關聯接口的請求參數 else: result = self.depend_response(depend_caseid_list[i]) getdata = GetExcelDate() is_depend_response = getdata.get_depend_response(depend_caseid_list[i]) if is_depend_response: depend_response_list = is_depend_response.split(",") results = result matchlist = depend_response_list matchparams = match_params(results, matchlist) march_result_list.append(matchparams) else: print("caseid={}不需要返回被依賴的字段".format(depend_caseid_list[i])) return matchparams