这个框架的测试用例写在yaml文件中
先看下用例怎么写
create: # 接口
module: # 模块
name: # 接口名称
url: # 接口url 与 config.yaml 中的环境地址进行拼接,成一个完整的url
method: POST # 接口类型
order: 1 #排序用
headers: #请求头部信息
Content-Type: application/json
cookies:
parameters: #以下公用是入参
name:
code:
1:
title: 用例名称
severity: Critical #用例等级
data: # 入参
a:
b:
sql: #sql 从数据库查询出,然后作为预期结果,自动拼接到id
Id: SELECT * FROM
expect: # 预期结果
Id:
code:
data:
# 这个接口还有用例就依次2,3,4下去,再放其他接口或者也可以一个接口一个yaml文件
以上就是我们写用例的格式,然后我们还需要模块专门用例读用例信息
import os
import yaml
from common.logger import Log
from common.read_config import config
from common.path import DATA_PATH
from copy import deepcopy
class ReadApiInfo(object):
def __init__(self):
"""
构造方法,进行初始化操作
"""
self.api_file_list = []
self.api_list = []
self.cases = []
self.api_para = {}
self._module = config.read_config_parm('module')
self._name = config.read_config_parm('name')
self.log = Log('获取接口数据').get_logger()
def _get_api(self):
"""
根据配置文件中需要测试的模块和接口的配置,从yaml文件中获取最初的接口数据(没有将公共部分和用例部分拼接的原始接口数据)
:return: 原始接口数据
"""
# 根据config中module配置收集需要测试的模块
if isinstance(self._module, list) and len(self._module) > 0:
for file in self._module:
for folder, subFolders, files in os.walk(DATA_PATH, topdown=False):
if '{}'.format(file + '.yaml') in files:
self.api_file_list.append(os.path.join(folder, '{}'.format(file + '.yaml')))
break
else:
self.log.error('module名称list为空或不在接口数据文件夹中')
elif (self._module is None) or (len(self._module) == 0):
for folder, subFolders, files in os.walk(DATA_PATH, topdown=False):
for file in files:
if file.endswith('.yaml'):
self.api_file_list.append(os.path.join(folder, file))
if file.startswith('e2e'):
self.api_file_list.remove(os.path.join(folder, file))
else:
self.log.error('module参数格式错误,应不传或传list类型')
# 根据config中name配置收集需要测试的接口
for file in self.api_file_list:
with open(file, 'r', encoding='utf-8') as f:
reader = f.read()
api = yaml.load(reader, Loader=yaml.FullLoader)
if isinstance(self._name, list):
for key in self._name:
if key in api:
api_data = api.get(key)
self.api_list.append(api_data)
else:
self.log.error('给定的接口名称不在接口名称列表中,请确认')
elif self._name is None:
for key in api.items():
api_data = api.get(key[0])
self.api_list.append(api_data)
else:
self.log.error('module参数格式错误,应不传或传list类型')
return self.api_list
def update_api_data(self):
"""
将公共部分数据依次拼接到用例数据中
"""
for api_data in self._get_api():
temporary_list = []
for key in api_data.keys():
if isinstance(key, str):
self.api_para[key] = api_data[key]
elif isinstance(key, int):
api_data.get(key).update({'number': key})
temporary_list.append(api_data.get(key))
for case in temporary_list:
case.update(deepcopy(self.api_para))
self.cases.append(case)
self.api_para.clear()
return self.cases
def sort_key(self, ele: dict):
"""
这部分后期写到测试主模块是用到,是执行用例的顺序
"""
order = ele.get('order')
if order is None:
self.log.error('缺少“order”字段,排序报错,请添加后再执行')
else:
return order