從接口自動化測試框架設計到開發(四)數據依賴相關


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

解析

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM