接口自动化测试框架公共组件之测试数据管理
Excel数据驱动(handle_excel)
实现逻辑:
通过load_workbook
加载Excel,用iter_rows
逐行读取数据,将表头和用例数据用zip
+dict
组合成字典列表,实现测试数据与代码解耦,支持多Sheet管理。关键函数:
load_workbook()
:加载Excel文件iter_rows(values_only=True)
:按行读取数据dict(zip())
:将表头与数据映射为字典from openpyxl import load_workbook class HandleExcel: def __init__(self,file_name): #file_name: 测试用例文件名称(绝对路径) self.wb_obj = load_workbook(filename=file_name) #load_workbook加载excel #获取所有excel中sheet的名称 self.sheet_names = self.wb_obj.sheetnames def get_excel_test_cases(self,sheet_name): #sheet_name: excel中sheet名称 #临时变量存放数据 cases_list = [] #获取指定表单对象 sheet_obj = self.wb_obj[sheet_name] #iter_rows迭代所有行数据,按行读取封装成list输出结果类似于[('id','title'),(1,'登陆成功')],values_only是False返回对象,True返回单元格对应数据,datas获取表单sheet中所有数据 datas = list(sheet_obj.iter_rows(values_only=True)) #获取表头 case_title = datas[0] #获取表数据 case_datas = datas[1:] #遍历每一行数据 for case in case_datas: #zip(key,val)把两个元素压缩在一起,再把每一行数据使用dict转换成字典类型,zip函数是python的内置函数 result = dict(zip(case_title,case)) cases_list.append(result) self.close_file() return cases_list def close_file(self): #关闭excel self.wb_obj.close() if __name__ == '__main__': #存放excel测试数据的文件名(放本目录下的路径) cl = HandleExcel(file_name="case_data.xlsx",sheet_name="login") cl.get_excel_test_cases()
动态数据生成(handle_phone)
- 封装Faker生成器与数据库查询,通过`phone_number()`生成随机号+`SELECT`校验注册状态,循环获取有效未注册手机号,解决测试数据动态生成问题。
**实现逻辑:**
1. 使用Faker库生成随机中文手机号
2. 通过SQL查询校验手机号是否已注册
3. 循环生成直到获取未注册的有效手机号**关键函数:**
- `Faker().phone_number()`:生成虚拟手机号
- `__check_phone()`:私有方法执行数据库校验
- `get_phone()`:主方法实现生成→校验→返回的闭环逻辑**解决的问题:**
1. 自动化生成未注册的测试手机号
2. 避免测试数据重复导致的用例失败
3. 动态生成测试数据替代硬编码from faker import Faker from tools.handle_db import mysql class HandlePhone: def __init__(self): self.fk = Faker(locale="zh-cn") def __check_phone(self,phone): sql = "SELECT * FROM 表名 WHERE user_mobile = '{}'".format(phone) #去数据库查询是否注册,注册了再重新生成,直到在数据库中找不到,就表示未注册; result = mysql.get_datas(sql=sql) return result def get_phone(self): while True: #生成新的手机号 phone = self.fk.phone_number() # 去数据库校验是否已注册 result = self.__check_phone(phone=phone) if len(result)>0: #手机号已存在,需要重新生成手机号 continue else: return phone
全局配置管理(setting.py)
- 通过字典结构分类存储数据库连接、用户凭证、文件参数等配置项,实现配置数据与测试代码解耦,解决多环境参数硬编码维护难题。
- **实现逻辑:**
- 集中管理测试环境配置参数
- 采用字典结构分类存储不同功能模块配置
- 实现配置数据与业务代码分离
- **关键配置项:**
- - `user_info`:系统登录凭证
- - `mysql_info`:数据库连接四要素
- - `image_info`:文件上传参数
- - `assert_db_info`:动态路径断言参数
- - `setup_sql_info`:前置SQL变量替换值
#setting.py 用于存放当前框架中的所有配置信息(使用不频繁,修改不频繁的数据) #通过配置文件传参-软编码;在代码中写死-硬编码; #管理者登陆账号信息 user_info = {"user_name":"xdfjewg","password":"dfergbu"} #图片上传信息 image_info = {"file_name":"song.png","file_type":"image/png"} #连接数据库信息 mysql_info = {"host":"11.111.111.11","post":"3306","user":"lemon","password":"vdnjkvs","db":"fsegjvskjv"} #数据库断言替换信息,如"file_path":"2022/04/cd54sdgruissafmscsd/vds"图片上传路径 assert_db_info = {} #前置sql语句执行需要替换的参数 setup_sql_info = {}