目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
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性能测试
九、总结(尾部小惊喜)
每一个人都有自己的天赋和潜力,但成功只属于那些敢于追求、不断努力的人。不要害怕失败,因为失败是成功的垫脚石;不要停下脚步,因为前方总会有更美好的风景。
在奋斗的路上,不怕起点低,不怕路途远,只要一直坚持下去,你就会发现成功的彼岸。所以,不要轻易放弃,不要随便沉溺,不要忘了初心,你的努力终将得到回报。
人生路漫漫,不要被困难压垮,也不要被成功冲昏头脑。要学会坚韧不拔,要保持谦虚和进取心,因为每一个努力的瞬间,都会让你变得更加出色。