數(shù)據(jù)依賴之設(shè)計(jì)思路
一般情況下,我們在執(zhí)行測試用例時(shí)赋秀,經(jīng)常遇到當(dāng)前接口的入?yún)?huì)依賴其它接口的返回?cái)?shù)據(jù)喳钟。如:商品列表到商品詳情,商品詳情接口會(huì)用到商品列表接口生成的商品id减细,這種接口參數(shù)之間相互依賴的關(guān)系就稱之為數(shù)據(jù)依賴匆瓜。
那么在設(shè)計(jì)測試用例時(shí)數(shù)據(jù)依賴的關(guān)系將如何處理呢?
首先需要用到的三個(gè)字段:依賴id未蝌、依賴的返回?cái)?shù)據(jù)字段驮吱、依賴所屬字段。通過“依賴id”單元格內(nèi)容找到case_id行對應(yīng)內(nèi)容萧吠,然后去執(zhí)行獲取請求返回結(jié)果根據(jù)左冬,再根據(jù)我們依賴的返回?cái)?shù)據(jù)去把對應(yīng)的值提取出來更新一下作為當(dāng)前接口的請求參數(shù)執(zhí)行,以商品列表纸型、商品詳情為例:
如圖:SC004需要依賴SC002熱銷商品列表接口返回?cái)?shù)據(jù)id,將依賴返回?cái)?shù)據(jù)id更新到數(shù)據(jù)依賴所屬字段(SC004請求入?yún)⒆侄蝘d)中
數(shù)據(jù)依賴方法封裝
思路:通過“依賴id”單元格內(nèi)容找到case_id行對應(yīng)內(nèi)容拇砰。
步驟1:新創(chuàng)建一個(gè)類dependent_data.py,用于處理所有數(shù)據(jù)依賴的相關(guān)問題
# coding:utf-8
class DependentData:
"""
通過case_id去獲取該case_id的整行數(shù)據(jù)
"""
def get_case_line_data(self,case_id):
pass
步驟2:操作excle狰腌,在operation_excel.py包含里面去獲取excle數(shù)據(jù)除破,首先通過數(shù)據(jù)依賴找到case_id,通過循環(huán)找到case_id對應(yīng)行號拿到對應(yīng)行的內(nèi)容。
#根據(jù)對應(yīng)caseid 找到對應(yīng)行的內(nèi)容
def get_row_data(self,case_id):
row_num = self.get_row_num(case_id) #根據(jù)case_id拿到行行號
rows_data = self.get_row_valuse(row_num) #根據(jù)行號拿到該行內(nèi)容
return rows_data
#根據(jù)對應(yīng)的caseid找到對應(yīng)的行號
def get_row_num(self,case_id):
num = 0
#獲取case_id列的內(nèi)容
clols_data = self.get_cols_data()
for col_data in clols_data:
if case_id in col_data:
return num
num = num + 1
#根據(jù)行號琼腔,找到該行的內(nèi)容
def get_row_valuse(self,row):
tables = self.data
#獲取行內(nèi)容
row_data = tables.row_values(row)
return row_data
#獲取某一列的內(nèi)容
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
數(shù)據(jù)依賴根據(jù)規(guī)則提取響應(yīng)數(shù)據(jù)
上面實(shí)現(xiàn)了如何根據(jù)case_id取到對應(yīng)行的內(nèi)容皂岔,把操作excel方法拿過來用,操作excel的方法:
# coding:utf-8
#導(dǎo)入excle操作
from util.operation_excel import OperationExcel
class DependentData:
def __init__(self,case_id):
self.case_id = case_id #傳case_id
self.opera_excle =OperationExcel() #實(shí)例化
"""
通過case_id去獲取該case_id的整行數(shù)據(jù)
"""
def get_case_line_data(self):
rows_data = self.opera_excle.get_row_data(self.case_id)
return rows_data
有了整行的內(nèi)容后,就需要去執(zhí)行里面的內(nèi)容展姐,那么怎么去執(zhí)行呢?
將需要用到的方法導(dǎo)入剖毯,并實(shí)例化
from base.runmethod import RunMethod
from data.get_data import GetData
class DependentData:
def __init__(self,case_id):
self.data = GetData()#獲取數(shù)據(jù)實(shí)例化
執(zhí)行依賴測試圾笨,獲取結(jié)果
#執(zhí)行依賴測試,獲取結(jié)果
def run_dependent(self):
run_method = RunMethod()#實(shí)例化
row_num = self.opera_excle.get_row_num(self.case_id) #獲取行號
request_data = self.data.get_data_for_json(row_num) #傳入行號
header = self.data.is_header(row_num)
method = self.data.get_request_method(row_num)
url = self.data.get_request_url(row_num)
res = run_method.run_main(method,url,request_data,header)
return res
執(zhí)行完成后逊谋,只需把執(zhí)行完成返回的結(jié)果根據(jù)我們的依賴數(shù)據(jù)去把對應(yīng)的值提取出來擂达,那么怎么去提取對應(yīng)的值呢?
步驟1:在get_data.py中新增獲取依賴數(shù)據(jù)key的方法
# 獲取依賴數(shù)據(jù)的key
def get_depend_key(self,row):
col = int(data.data_config.get_data_depend())
depent_key = self.opera_excle.get_cell_value(row,col)
if depent_key == "":
return None
else:
return depent_key
步驟2:在dependent_data.py中依賴的key去獲取執(zhí)行依賴測試case的響應(yīng)數(shù)據(jù)胶滋,然后返回板鬓。使用jsonpath解析json參考:http://www.reibang.com/p/82e63cc8e0a1
from jsonpath_rw import jsonpath,parse
#根據(jù)依賴的key去獲取執(zhí)行依賴測試case的響應(yīng)數(shù)據(jù),然后返回
def get_data_for_key(self,row):
depend_data = self.data.get_depend_key(row)
response_data = self.run_dependent() #拿到響應(yīng)值究恤,根據(jù)層級關(guān)系去拿對應(yīng)的值
print(depend_data)
print(response_data)
#用到j(luò)sonpath(就是一層一層的去拿數(shù)據(jù))
json_exe = parse('depend_data')
madle = json_exe.find(response_data)
return [math.value for math in madle]#結(jié)果集里返回對應(yīng)數(shù)據(jù)
數(shù)據(jù)依賴結(jié)構(gòu)構(gòu)建
通過case返回的數(shù)據(jù)把對應(yīng)數(shù)據(jù)拿到之后俭令,接下來就需要把數(shù)據(jù)拿過來更新一下作為請求數(shù)據(jù)。
步驟一:首先判斷要不要執(zhí)行即判斷有沒有依賴(拿返回?cái)?shù)據(jù)去判斷)部宿,獲取depend數(shù)據(jù)抄腔,在get_data.py下創(chuàng)建一個(gè)方法
#判斷是否有case依賴
def is_depend(self,row):
col = int(data.data_config.get_case_depend())#獲取依賴所屬字段
depend_case_id = self.opera_excle.get_cell_value(row,col)#拿到對應(yīng)數(shù)據(jù)
if depend_case_id == "":
return None
else:
return depend_case_id
步驟二:架子搭建瓢湃,在run_test.py中傳入數(shù)據(jù)依賴
import sys
sys.path.append("F:/project/untitled")
from base.runmethod import RunMethod
from data.get_data import GetData
from util.common_util import CommonUtil
from data.dependent_data import DependentData
class RunTest:
def __init__(self):
self.run_method = RunMethod()
self.data = GetData()
self.com_until = CommonUtil()
# 程序執(zhí)行主入口
def go_on_run(self):
res = None
# 獲取excel行數(shù),即case個(gè)數(shù)
rows_count = self.data.get_case_lines()
# 循環(huán)執(zhí)行case
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)
request_data = self.data.get_data_for_json(i) # 請求數(shù)據(jù)存放在json文件
expect = self.data.get_expect_data(i) # 獲取預(yù)期結(jié)果值
header = self.data.is_header(i)
depend_case = self.data.is_depend(i)
#如果depend_case!=None就需要有依賴
if depend_case !=None:
self.depend_data = DependentData(depend_case)
#獲取依賴的響應(yīng)數(shù)據(jù)
depend_response_data = self.depend_data.get_data_for_key(i) #傳入行號
#獲取依賴的key
depend_key = self.data.get_depend_field(i)
#根據(jù)獲取的依賴key把字段更新下
request_data[depend_key] = depend_response_data
res = self.run_method.run_main(method, url, request_data, header)
if self.com_until.is_contain(expect,res):
self.data.write_result(i,'pass')
else:
self.data.write_result(i,'fail')
if __name__ == '__main__':
run = RunTest()
run.go_on_run()
在get_data.py中定義獲取依賴字段的方法
#獲取數(shù)據(jù)依賴字段
def get_depend_field(self,row):
col = int(data.data_config.get_filed_depend())
depend_data = self.opera_excle.get_cell_value(row,col)
if depend_data =="":
return None
else:
return depend_data