1.數據依賴問題從設計思路開始
提交訂單,拿到訂單號,才能查看訂單詳情這種業務流程

2.方法封裝:從case_id獲取case的返回數據
#operation_excel.py #根據對應的case_id,找到對應行的內容 def get_rows_data(self,case_id): row_num = self.get_row_num(case_id)#根據caseid拿到行號 rows_data = self.get_row_values(row_num)#根據行號拿到行的數據 return rows_data #根據對應的caseid找到對應的行號 def get_row_num(self,case_id): num = 0 #行號初始為0 clols_data = self.get_cols_data() for col_data in clols_data: if case_id in col_data: return num #如果依賴id和caseid相等,返回行號 num = num+1 #根據行號找到該行的內容 def get_row_values(self,row): tables = self.data row_data = tables.row_values(row) return row_data #獲取某一列的內容 def get_cols_data(self,col_id=None): if col_id != None: cols = self.data.col_values(col_id) else: cols = self.data.col_values(0) return cols
3.根據規則提取響應數據
安裝jsonpath_rw包
python -m pip install jsonpath_rw
#get_data.py #獲取依賴數據的key def get_depend_key(self,row): col = int(self.dataconfig.get_data_depend()) depend_key = self.opera_excel.get_cell_value(row,col) if depend_key == '': return None else: return depend_key
#depend_data.py # -*- coding: utf-8 -*- # @Author: jiujiu # @Date: 2020-03-06 13:59:03 # @Last Modified time: 2020-03-06 13:59:03 from util.operation_excel import OperationExcel from base.run_method import RunMethod from data.get_data import GetData from jsonpath_rw import jsonpath,parse class DependentData(object): def __init__(self,case_id): self.case_id = case_id self.opera_excel = OperationExcel() self.data = GetData() self.runmethod = RunMethod() """根據caseid獲取該case的整行數據""" def get_case_line_data(self,case_id): rows_data = self.opera_excel.get_rows_data(case_id) return rows_data #執行依賴測試,獲取結果 def run_dependent(self): run_num = self.opera_excel.get_row_num(self.case_id)#拿到caseid的行號 request_data = self.data.get_data_for_json(run_num)#拿到請求數據 header = self.data.is_header(run_num) method = self.data.get_request_method(run_num) url = self.data.get_request_url(run_num) res = run_method.run_main(method,url,request_data,header) return json.loads(res) #拿到執行結果后,根據依賴數據規則提取這個數據 def get_data_for_key(self,row): depend_data = self.data.get_depend_key(row)#拿到依賴數據 response_data = self.run_dependent()#拿到返回數據 json_exe = parse(depend_data)#按照dependdata的規則在結果集里面查找 madle = json_exe.find(response_data) return [math.value for math in madle][0]
4.結構構建
#run_test.py def go_on_run(self): res = None #如果有10行,循環遍歷每一行,從0行開始 rows_count = self.data.get_case_lines() #排除0行,從第1行開始 for i in range(1,rows_count): is_run = self.data.get_is_run(i) if is_run: url = self.data.get_request_url(i) method = self.data.get_request_method(i) data = self.data.get_data_for_json(i)#傳入行數 # request_data = self.data.get_data_for_json(i) header = self.data.is_header(i) # print(i) depend_case = self.data.is_depend(i) # return res if depend_case != None: self.depend_data = DependentData(depend_case) #獲取依賴的響應數據 depend_response_data = self.depend_data.get_data_for_key(i) #獲取依賴的key depend_key = self.data.get_depend_field(i) request_data[depend_key] = depend_response_data #更新值 res = self.runmethod.run_main(method,url,data,header) self.data.write_result(i,res)
#get_data.py #獲取依賴數據的key def get_depend_key(self,row): col = int(self.dataconfig.get_data_depend()) depend_key = self.opera_excel.get_cell_value(row,col) if depend_key == "": return None else: return depend_key #判斷case是否有依賴 def is_depend(self,row): col = int(self.dataconfig.get_field_depend()) depend_case_id = self.opera_excel.get_cell_value(row,col) if depend_case_id == "": return None else: return depend_case_id #獲取數據依賴字段 def get_depend_filed(self,row): col = int(self.dataconfig.get_field_depend()) data = self.opera_excel.get_cell_value(row,col) if data == "": return None else: return data
擴展jsonpath
數據驗證,這里的數據驗證指的是對響應結果進行數據的校驗,接口自動化測試中,對於簡單的響應結果(json),可以直接和期望結果進行比對,判斷是否完全相等即可。如 json {"status":1,"msg":"登錄成功"}
對於格式較復雜,尤其部分數據存在不確定性、會根據實際情況變化的響應結果,簡單的判斷是否完全相等(斷言)通常會失敗。
上面的json結構嵌套了很多信息,完整的匹配幾乎不可能成功。比如其中的createTime信息,根據執行接口測試用例的時間每次都不一樣。同時這個時間是響應結果中較為次要的信息,在進行接口自動化測試時,是可以選擇被忽略的。我們需要某種簡單的方法,能夠從json中提取出我們真正關注的信息(通常也被稱為關鍵信息)。
如提取出status的值為1,data數組中每個對象的investId都為1,data中第三個對象的unfinishedPrincipal值為100.00,只要這三個關鍵信息校驗通過,我們就認為響應結果沒有問題。
3、解決方案
JsonPath可以完美解決上面的痛點。通過JsonPath可以從多層嵌套的Json中解析出所需要的值。
JsonPath
JsonPath參照XPath解析xml的方式來解析Json
JsonPath用符號$表示最外層對象,類似於Xpath中的根元素
JsonPath可以通過點語法來檢索數據,如:
shell $.store.book[0].title
也可以使用中括號[]的形式,如shell $['store']['book'][0]['title']
運算符(Operators)
JsonPath案例
json
JsonPath例子及說明
一、使用jsonpath
安裝jsonpath模塊
pip install jsonpath==0.75
解析
二、使用與安裝
使用jsonpath_rw
安裝jsonpath_rw模塊
pip install jsonpath-rw
解析
