pytest数据驱动应用-excel测试用例数据读取封装
接口测试数据存放
excel、json、yaml、数据库
实例:注册功能
参数 | 变量名 | 类型 | 说明 | 是否必填 |
手机号 | mobile_phone | int | 新用户的手机号 | 是 |
密码 | pwd | string | 8-16位 | 是 |
类型 | type | int | 0:管理员,1:普通用户(默认为1) | 否 |
注册名 | reg_name | string | 昵称:长度最大为10位(不填写有默认值) | 否 |
读取出来应该是一个大的列表,列表里面放的每一条测试用例,测试用例是一个字典(使用openpyxl)
步骤:
1、对操作进行封装(请求头、发送请求的操作)
MyRequests.py
""" 对操作进行封装 """ import requests class MyRequests: """ 将共性提取出来 headers="http://api.lemonban.com/futureloan" """ def __init__(self): #请求头 self.headers={ "X-Lemonban-Media-Type":"lemonban.v2" } """ 定义一个私有方法,处理请求头(有的请求头有token) """ def __deal_header(self,token=None): if token: self.headers["Authorization"]="Bearer {}".format(token)#添加字典元素 """ 发请求方法封装 method=post或者get """ def send_requests(self,method,url,json=None,params=None,token=None): self.__deal_header(token)#处理请求头 #调用requests方法 resp=requests.request(method,url,json=json,params=params,headers=self.headers) return resp
2、对读取数据的操作进行封装(将excel的测试用例以字典的形式一条一条读取出来)
My_Excel.py """ 封装读取表单测试用例的方法 """ from openpyxl import load_workbook class MyExcel: def __init__(self,excel_path,sheet_name): """ 打开工作簿,选择一个表单 """ wb=load_workbook(excel_path)#加载一个excel,得到工作簿对象 self.sh=wb[sheet_name] def read_data(self): """ 读取excel表单数据 """ data=list(self.sh.values)#将生成器转换为列表 header=data[0] case_data=[] for row in data[1:]: row_dict=dict(zip(header,row))#将头部和用例打包 case_data.append(row_dict) return case_data #返回的是一个列表,列表中每一条数据都是一个用例
3、执行用例
""" 测试步骤 1、读取注册接口的测试数据-读取出来是个列表,列表中每个成员都是一个测试用例 2、遍历测试数据,每组数据发起一个http请求 """ import pytest import json from common.MyRequests import MyRequests from common.My_Excel import MyExcel #1、读取注册接口的测试数据-读取出来是个列表,列表中每个成员都是一个测试用例 excel_path=r'D:\study\study_API\day5\testdata\测试用例.xlsx'#测试用例的存放路径 myexcel=MyExcel(excel_path,'注册接口') cases=myexcel.read_data() #2、遍历测试数据,每组数据发起一个http请求 myrequests=MyRequests() class TestRegister: @pytest.mark.parametrize("case",cases) def test_register(self,case): #需要把请求参数cases转换为字符串 req_dict=json.loads(case['req_data']) resp=myrequests.send_requests(case["method"],case["url"],json=req_dict) print(resp.json())