news 2026/5/16 14:59:45

接口自动化测试中解决接口间数据依赖

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
接口自动化测试中解决接口间数据依赖

在实际的测试工作中,在做接口自动化测试时往往会遇到接口间数据依赖问题,即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依赖】为空则无依赖,不为空则获取依赖的case id。

上述表格中,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

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 14:59:31

基于单片机的立体车库设计

一、系统设计背景与总体架构 随着城市汽车保有量激增,传统平面车库土地利用率低、停车难问题日益突出,立体车库凭借空间利用率高、占地面积小的优势成为解决方案。基于单片机的立体车库设计,以低成本、高可靠性为核心目标,采用模块…

作者头像 李华
网站建设 2026/5/16 14:59:29

【Matlab】《卡尔曼滤波与组合导航》 第一次作业 基于KF的GPS静态/动态滤波

首先,我将向您展示一个简单的MATLAB示例,演示如何使用卡尔曼滤波器进行GPS静态/动态滤波。这个示例将使用MATLAB内置的ekf函数,这是一个扩展卡尔曼滤波器(Extended Kalman Filter,EKF)。 首先,我们将生成一个简单的模拟数据集,以模拟GPS接收器的输出。然后,我们将使用…

作者头像 李华
网站建设 2026/5/16 14:59:25

CSF文化会办公集成与商用设备板块:驱动行业未来的核心引擎

在大众熟知的办公用品行业,一场深刻的变革正悄然兴起。行业不仅面临着技术迭代的冲击,还需应对工作方式和应用场景持续创新带来的全新挑战。作为典型的“小商品、大市场”领域,办公用品行业近年来受益于庞大的市场规模和稳步增长,…

作者头像 李华
网站建设 2026/5/12 16:16:09

【Symfony 8请求拦截器深度指南】:掌握高效请求处理的5大核心技巧

第一章:Symfony 8请求拦截器概述Symfony 8 引入了全新的请求拦截器机制,作为处理 HTTP 请求生命周期中关键环节的现代化解决方案。该机制允许开发者在控制器执行前后注入自定义逻辑,实现如权限校验、日志记录、请求转换等横切关注点&#xff…

作者头像 李华
网站建设 2026/5/14 0:42:00

农业物联网设备身份伪造危机(PHP认证机制深度剖析)

第一章:农业物联网设备身份伪造危机概述随着智慧农业的快速发展,农业物联网(Agri-IoT)设备被广泛应用于土壤监测、灌溉控制、牲畜追踪等场景。这些设备通过无线网络与云端平台通信,实现数据自动化采集与远程管理。然而…

作者头像 李华