python进行接口自动化测试
最佳答案 问答题库708位专家为你答疑解惑
一、接口自动化测试的流程
1、需求分析
1、1请求(url,方法、数据)
2、挑选需要做自动化测试的接口
3、设计自动化测试用例
4、搭建自动化测试环境
5、设计自动化执行框架(报告、参数化、 用例执行框架)
6、编写代码
7、执行用例(unittest、pytest)
8、生成测试报告(htmltextrunner\allure)
二、用例设计
2、1单接口
模板:id,模块,接口名称,请求url,用例名称,请求方法,请求参数类型,请求参数,预期结果,实际结果,备注
注意:单接口颗粒度放的比较小(以测试数据为颗粒度)
2、2多接口
模板:id,模块,接口名称,请求url,用例名称,请求方法,请求参数类型,请求参数,预期结果,实际结果,备注
注意:多个接口颗粒度为每个接口为基础,每个接口内所设计的数据可以通过参数化来解决。
三、自动化目录结构
1、配置层(common)
1
2
3
4
5
6
7
8
9
import
os
def
filePath(fileDir
=
'
',fileName='
'):
'''
:param fileDir: 目录
:param fileName: 文件的名称
:return:
'''
return
os.path.join(
os.path.dirname(os.path.dirname(__file__)), fileDir, fileName)
2、用例执行业务层(testcase)
import pytest,json,allure
from util.apiutil import Request
from util.yamlutil import OperationYaml
from util.excelutil import OperationExcel,ExcelVarlesobj = Request()
objYaml = OperationYaml()
objExcel = OperationExcel()
data_key = ExcelVarlesclass TestExcel:# request封装def run_api(self, url, method, params=None, headers=None, cookies=None):if str(method).lower() == "get":res = obj.get(url, params=params, headers=headers, cookies=cookies)elif str(method).lower() == "post":res = obj.post(url, json=params, headers=headers, cookies=cookies)return res# 运行前置用例def run_pre(self, pre_case):url = objYaml.readbaseyaml()["test_url"] + pre_case[data_key.url]method = pre_case[data_key.method]params = eval(pre_case[data_key.params])headers = pre_case[data_key.headers]header = self.json_parse(headers)cookies = pre_case[data_key.cookies]res = self.run_api(url, method, params, header)print("前置用例执行:%s" % res)return res@pytest.mark.parametrize('datas',objExcel.runs())# 运行测试用例def test_login(self,datas):url = objYaml.readbaseyaml()["test_url"] + datas[data_key.url]print(url)case_id = datas[data_key.case_id]case_model = datas[data_key.case_model]case_name = datas[data_key.case_name]pre_exec = datas[data_key.pre_exec]method = datas[data_key.method]params = eval(datas[data_key.params])expect_result = datas[data_key.expect_result]headers = datas[data_key.headers]cookies = datas[data_key.cookies]code = datas[data_key.code]db_verify = datas[data_key.db_verify]if pre_exec:passpre_case = objExcel.case_prev(pre_exec)print("前置条件信息为:%s" % pre_case)pre_res = self.run_pre(pre_case)headers = self.get_correlation(headers,pre_res)header = self.json_parse(headers)res = self.run_api(url, method, params, header, cookies)print("测试用例执行:%s" % res)assert expect_result in str(res["body"]["message"])assert code == int(res["code"])# 对allure报告进行配置# allure# sheet名称 feature 一级标签# allure.dynamic.feature(sheet_name)# 模块 story 二级标签allure.dynamic.story(case_model)# 用例ID+接口名称 titleallure.dynamic.title(case_id + case_name)# 请求URL 请求类型 期望结果 实际结果描述desc = "<font color='red'>请求URL: </font> {}<Br/>" \"<font color='red'>请求类型: </font>{}<Br/>" \"<font color='red'>期望结果: </font>{}<Br/>" \"<font color='red'>实际结果: </font>{}".format(url, method, expect_result, res)allure.dynamic.description(desc)def json_parse(self,data): # 格式化字符,转换json# if headers:# header = json.loads(headers)# else:# header = headersreturn json.loads(data) if data else data# token参数关联替换def get_correlation(self,header,pre_res):# 验证是否有关联headers_para = objExcel.params_find(header)if len(headers_para):# 有关联,执行前置用例,获取结果headers_data = pre_res["body"]["data"]["token"][headers_para[0]]# 结果替换headers = objExcel.res_sub(header, headers_data)return headersif __name__ == '__main__':pytest.main(["-s", "-v", "test_single_api.py"])
3、数据驱动(data)
存放excel,yaml文件
4、测试报告(report)
5、工具层(第三方工具包)apiutil.py
import requestsclass Request():def requests_api(self,url, json=None, headers=None, cookies=None, params=None, data=None,method="get"):if method == "get":r = requests.get(url=url,headers=headers,cookies=cookies,params=params,data=data)elif method == "post":r = requests.post(url=url,json=json,headers=headers,cookies=cookies)elif method == "put":r = requests.put(url=url,headers=headers,cookies=cookies,params=params)elif method == "delete":r =requests.delete(url=url,headers=headers,cookies=cookies,params=params)code = r.status_codetry:body = r.json()except Exception as e:body = r.textres = dict()res["code"] = coderes["body"] = bodyreturn resdef get(self,url,**kwargs):return self.requests_api(url, method="get", **kwargs)def post(self,url,**kwargs):return self.requests_api(url, method="post", **kwargs)def put(self,url,**kwargs):return self.requests_api(url, method="put", **kwargs)def delete(self,url,**kwargs):return self.requests_api(url, method="delete", **kwargs)
excelutil.py
import xlrd
from common.basepath import *
import json
import rep_data = '\${(.*)}\$'
class ExcelVarles:case_id = "用例ID"case_model = "模块"case_name = "接口名称"url = "请求URL"pre_exec = "前置条件"method = "请求类型"params_type = "请求参数类型"params = "请求参数"expect_result = "预期结果"actual_result = "实际结果"beizhu = "备注"is_run = "是否运行"headers = "headers"cookies = "cookies"code = "status_code"db_verify = "数据库验证"class OperationExcel:@propertydef getExcelDatas(self):datas = list()book = xlrd.open_workbook(filePath('data', 'api.xlsx'))getsheet = book.sheet_by_index(0)title = getsheet.row_values(0)for row in range(1,getsheet.nrows):row_values=getsheet.row_values(row)datas.append(dict(zip(title,row_values)))return datasdef runs(self):# 获取到可执行的测试用例run_list=[]for item in self.getExcelDatas:isRun=item[ExcelVarles.is_run]if isRun == 'y':run_list.append(item)else:passreturn run_listdef params(self):'''对请求参数为空做处理'''params_list=[]for item in self.runs():params=item[ExcelVarles.params]if len(str(params).strip())==0:passelif len(str(params).strip())>=0:params=json.loads(params)def case_prev(self,casePrev):# 据前置测试条件找到关联的前置测试用例for item in self.getExcelDatas:if casePrev in item.values():return itemreturn Nonedef res_find(self,data, pattern_data=p_data): # 查询# pattern = re.compile('\${(.*)}\$')pattern = re.compile(pattern_data)re_res = pattern.findall(data)return re_resdef res_sub(self,data, replace, pattern_data=p_data): # 替换pattern = re.compile(pattern_data)re_res = pattern.findall(data)if re_res:return re.sub(pattern_data, replace, data)return re_resdef params_find(self,headers): # 验证请求中是否有${}$需要结果关联if "${" in headers:headers = self.res_find(headers)return headers
yamlutil.py
import yaml
from common.basepath import filePathclass OperationYaml:def readYaml(self,fileDir='data',fileName='login.yaml'): ### 获取login测试用例with open(filePath(fileDir=fileDir, fileName=fileName),'r',encoding='utf-8') as f:return list(yaml.safe_load_all(f))def readbaseyaml(self,fileDir='data',fileName='base.yaml'):with open(filePath(fileDir=fileDir, fileName=fileName), 'r', encoding='utf-8') as f:return yaml.safe_load(f)def readgoodsyaml(self,fileDir='data',fileName='goods.yaml'): ### 获取商品测试用例with open(filePath(fileDir=fileDir, fileName=fileName), 'r', encoding='utf-8') as f:return list(yaml.safe_load_all(f))
6、运行入口层(运行测试用例,并生成报告)
2023超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战
99%的人还看了
相似问题
- MeterSphere | 接口测试请求体中,int类型的入参实现动态化变量
- postman设置接口关联这样做,薪资直接涨3k
- 接口自动化中cookies的处理技术
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- 【实战详解】如何快速搭建接口自动化测试框架?Python + Requests
- 一次显著的接口性能优化,从10s优化到0.9s
- 做接口自动化遇到的20个难点,记录下我是如何解决的!
- 全网最全jmeter接口测试/接口自动化测试看这篇文章就够了:跨线程组传递jmeter变量及cookie的处理
- 微信小程序发货信息录入接口 错误上传时间非法,请按照 RFC 3339 格式填写?
- 京东商品详情数据接口【京东API接口开发系列】,监控京东价格走势,接口代码示例,可高并发批量获取
猜你感兴趣
版权申明
本文"python进行接口自动化测试":http://eshow365.cn/6-16970-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!