资深测试总结,Python接口自动化测试-数据依赖解决(详全)


前言

Python自动化测试:https://www.bilibili.com/video/BV16G411x76E/

在实际的测试工作中,在做接口自动化测试时往往会遇到接口间数据依赖问题。

比如: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

下面说一些高频接口自动化的面试题:

1、你写了多少接口自动化用例?

自动化用例,也没有具体数过,当时我负责的所有模块的接口的自动用例都是我这边独立完成的,有模块的用例会多一点,有些会少一点,这具体看接口的参数有多少,参数多限制条件多的,一般用例会比较多一点,我负责的模块大概有100多条用例是有的。

2、比如说你接口的请求参数需要加密处理的,你们用的是什么加密方式,你加密怎么处理的?

这个是有做过的,就拿当我们那个项目的登录接口来讲吧,那个登录的密码是需要进行加密。

加密之后再进行传输。这里需要问开发要加密算法,我们会把它封装成一个函数,调用这个加密函数对密码加密,之后再进行传递。我们公司的加密算法,大部分用的都是MD5的加密算法(base64)

3、你查询出来返回结果是密文,密文你怎么测试

这里首先要搞清楚用的是什么加密算法,问开发要解密算法,对返回的数据进行解密,解密完成之后在与预期结果对比,去进行断言。

4、requests中如何进行动态关联?

如果返回的是 cookies值,可以直接返回接口的 r.cookies;

返回的是str类型数据,可以导入re模块进行正则表达式提取返回数据格式是json格式,导入json,把json数据格式转化 python对象

json.dumps 将 Python对象编码成JSON字符串
json.loads 将已编码的JSON字符串解码为 Python对象

5、你们 python接口自动化怎么去处理 cookie, session的?

对于 cookie,session的处理一般有三种方式:

第一种就是先获取登录请求的 cookie值,然后发送其他请求的时候,在 requests提供的
两个方法get或post方法中有一个 cookies参数,我们可以通过这个参数来传递 cookies值

第二种就是通过订制请求头,然后把获取到的coookies放在请求头中,通过请求头来进行传递

第三种就是通过创建一个 session会话对象,后期所有的请求发送都通过调用这个 session会话对象来进行发请求,如果是登录请求,它会自动保存 cookies值,然后其他需要用到cookies值的请求,也通过 session对象来发送,它会自动把 cookies发送出去,对于 cookies, session的处理,我们差不多都是通过以上三种方式来实现的。

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

每一个人都有自己的天赋和潜力,但成功只属于那些敢于追求、不断努力的人。不要害怕失败,因为失败是成功的垫脚石;不要停下脚步,因为前方总会有更美好的风景。

在奋斗的路上,不怕起点低,不怕路途远,只要一直坚持下去,你就会发现成功的彼岸。所以,不要轻易放弃,不要随便沉溺,不要忘了初心,你的努力终将得到回报。

人生路漫漫,不要被困难压垮,也不要被成功冲昏头脑。要学会坚韧不拔,要保持谦虚和进取心,因为每一个努力的瞬间,都会让你变得更加出色。

猜你喜欢

转载自blog.csdn.net/m0_70102063/article/details/130624089