case执行的数据依赖

数据依赖之设计思路

一般情况下,我们在执行测试用例时,经常遇到当前接口的入参会依赖其它接口的返回数据。如:商品列表到商品详情,商品详情接口会用到商品列表接口生成的商品id,这种接口参数之间相互依赖的关系就称之为数据依赖。

那么在设计测试用例时数据依赖的关系将如何处理呢?

首先需要用到的三个字段:依赖id、依赖的返回数据字段、依赖所属字段。通过“依赖id”单元格内容找到case_id行对应内容,然后去执行获取请求返回结果根据,再根据我们依赖的返回数据去把对应的值提取出来更新一下作为当前接口的请求参数执行,以商品列表、商品详情为例:


依赖返回数据.png
依赖关系.png

如图:SC004需要依赖SC002热销商品列表接口返回数据id,将依赖返回数据id更新到数据依赖所属字段(SC004请求入参字段id)中

数据依赖方法封装

思路:通过“依赖id”单元格内容找到case_id行对应内容。

步骤1:新创建一个类dependent_data.py,用于处理所有数据依赖的相关问题

# coding:utf-8
class DependentData:
     """
     通过case_id去获取该case_id的整行数据
     """
     def get_case_line_data(self,case_id):
          pass

步骤2:操作excle,在operation_excel.py包含里面去获取excle数据,首先通过数据依赖找到case_id,通过循环找到case_id对应行号拿到对应行的内容。

 #根据对应caseid 找到对应行的内容
    def get_row_data(self,case_id):
        row_num = self.get_row_num(case_id) #根据case_id拿到行行号
        rows_data = self.get_row_valuse(row_num) #根据行号拿到该行内容
        return rows_data

    #根据对应的caseid找到对应的行号
    def get_row_num(self,case_id):
        num = 0
        #获取case_id列的内容
        clols_data = self.get_cols_data()
        for col_data in clols_data:
            if case_id in col_data:
                return num
            num = num + 1

    #根据行号,找到该行的内容
    def get_row_valuse(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

数据依赖根据规则提取响应数据

上面实现了如何根据case_id取到对应行的内容,把操作excel方法拿过来用,操作excel的方法:

# coding:utf-8
#导入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() #实例化    
     """
     通过case_id去获取该case_id的整行数据
     """
     def get_case_line_data(self):
          rows_data = self.opera_excle.get_row_data(self.case_id)
          return rows_data

有了整行的内容后,就需要去执行里面的内容,那么怎么去执行呢?

将需要用到的方法导入,并实例化

from  base.runmethod import RunMethod
from  data.get_data import GetData
class DependentData:
     def __init__(self,case_id):
          self.data = GetData()#获取数据实例化

执行依赖测试,获取结果

 #执行依赖测试,获取结果
     def run_dependent(self):
          run_method = RunMethod()#实例化
          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

执行完成后,只需把执行完成返回的结果根据我们的依赖数据去把对应的值提取出来,那么怎么去提取对应的值呢?

步骤1:在get_data.py中新增获取依赖数据key的方法

# 获取依赖数据的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去获取执行依赖测试case的响应数据,然后返回。使用jsonpath解析json参考:https://www.jianshu.com/p/82e63cc8e0a1

from jsonpath_rw import jsonpath,parse

      #根据依赖的key去获取执行依赖测试case的响应数据,然后返回
     def get_data_for_key(self,row):
          depend_data = self.data.get_depend_key(row)
          response_data = self.run_dependent() #拿到响应值,根据层级关系去拿对应的值
          print(depend_data)
          print(response_data)
          #用到jsonpath(就是一层一层的去拿数据)
          json_exe = parse('depend_data')
          madle = json_exe.find(response_data)
          return [math.value for math in madle]#结果集里返回对应数据

数据依赖结构构建

通过case返回的数据把对应数据拿到之后,接下来就需要把数据拿过来更新一下作为请求数据。

步骤一:首先判断要不要执行即判断有没有依赖(拿返回数据去判断),获取depend数据,在get_data.py下创建一个方法

#判断是否有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)#拿到对应数据
        if depend_case_id == "":
            return None
        else:
            return depend_case_id

步骤二:架子搭建,在run_test.py中传入数据依赖

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()

    # 程序执行主入口
    def go_on_run(self):
        res = None
        # 获取excel行数,即case个数
        rows_count = self.data.get_case_lines()
        # 循环执行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)  # 请求数据存放在json文件
                 expect = self.data.get_expect_data(i) # 获取预期结果值
                 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)
                #获取依赖的响应数据
                depend_response_data = self.depend_data.get_data_for_key(i) #传入行号
                #获取依赖的key
                depend_key = self.data.get_depend_field(i)
                #根据获取的依赖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中定义获取依赖字段的方法

 #获取数据依赖字段
    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
执行结果.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容