目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
解决自动化数据依赖方案
1、前置函数,设置成类属性。
2、业务流测试用例,通过执行顺序,保存所需的数据依赖,写到类属性
3、实现业务流的完全数据驱动,ddt测试用例实际时,可以增加一列
在用例数据中添加一列 extract 表示提取响应数据并保存在对应的类属性中,规则如下:
[{"name":"id","exp":"$..id"},{"name":"token","exp":"$..token"}]
数据库断言后调用此方法
import jsonpath
def extract_data(self):"""提取响应中的数据并保存到用例类属性中:return:"""if self.case.get('extract'):for item in json.loads(self.case['extract']):name = item['name']exp = item['exp']res = jsonpath.jsonpath(self.response.json(), exp)if res:setattr(self.__class__, name, res[0])else:raise ValueError(f'用例【{self.case[title]}】提取表达{exp}式错误'
4、session会话技术
会话对象可以跨请求保持某些参数。它也会在同一个session实例发出的所有请求之间保持cookie。
import requests
s = requests.session()
login_url = ''
data = {"email":"账号","password":"密码","remember":0} # 登录
res = s.post(url=login_url, data=data)
res.textcourses_url = '' # 获取课程列表
res = s.get(courses_url)
res.json()
session和cookie区别:
cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;
解决接口间数据依赖方案
在实际的测试工作中,在做接口自动化测试时往往会遇到接口间数据依赖问题,即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)#迭代获取列表中的caseidfor 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 = resultmatchlist = depend_response_listmatchparams = 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 = resultmatchlist = depend_response_listmatchparams = match_params(results, matchlist)march_result_list.append(matchparams)else:print("caseid={}不需要返回被依赖的字段".format(depend_caseid_list[i]))return matchparams
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
把握每一刻,奋力拼搏,只有拼尽全力,才能收获最辉煌的成就。无论前路多么艰难,坚持不懈的努力都将引领我们走向成功的彼岸。相信自己,勇敢去追逐梦想,你注定会成为那个改变世界的人。
只有不断超越自己的勇气,才能让梦想破茧成蝶,舞动人生华章。不要停下脚步,向前奋斗,成功将与你紧握双手,荣耀属于那些不畏艰难困苦、坚持追求的人。
只要心怀梦想,坚持不懈,努力奋斗,就能迸发出无尽的力量,创造属于自己的辉煌。展翅高飞,超越极限,勇往直前,终将成就非凡的人生。