Files
apiautotest/case_utils/case_handle.py
T

138 lines
5.9 KiB
Python

# -*- coding: utf-8 -*-
# @Version: Python 3.9
# @Time : 2023/1/12 15:22
# @Author : chenyinhua
# @File : case_handle.py
# @Software: PyCharm
# @Desc: 生成测试用例文件并返回用例数据
import os
from config.path_config import CASE_TEMPLATE_DIR, DATA_DIR, AUTO_CASE_DIR
from common_utils.excel_handle import ExcelHandle
from common_utils.yaml_handle import YamlHandle
from config.models import CaseFileType
from config.settings import CASE_FILE_TYPE
from string import Template
from loguru import logger
from common_utils.files_handle import get_files
def get_yaml_data(file_path):
"""
从yaml/yml文件中获取用例数据
:param file_path: yaml/yml文件绝对路径
"""
if os.path.isfile(file_path):
# 读取yaml/yml文件中的用例数据,存储到data中
return YamlHandle(file_path).read_yaml
def get_excel_data(file_path):
"""
从xlsx/xls文件中获取用例数据
:param file_path: xlsx/xls文件绝对路径
"""
if os.path.isfile(file_path):
# 读取xlsx/xls文件中的用例数据,存储到data中
return ExcelHandle(file_path).read()
def gen_case_data_from_excel(files):
cases = []
for file in files:
# 读取excel文件中的用例数据,存储到data中
data = get_excel_data(file)
for _data in data:
# 将excel读取到的用例数据,适配allure格式
excel_data = {
'case_common': {'allure_epic': 'GitLink接口', 'allure_feature': _data["sheet_name"],
'allure_story': _data["sheet_name"]},
'case_info': _data["data"]
}
# 调用gen_case方法生成测试用例, 例如:test_demo.py
gen_case_file(case_file_path=file, case_template_path=CASE_TEMPLATE_DIR, case_data=excel_data,
target_case_path=AUTO_CASE_DIR)
# 将获取到的用例数据统一保存到cases中
cases.extend([excel_data])
logger.debug(f"{file}中读取到的用例数据是:{excel_data}")
return cases
def gen_case_data_from_yaml(files):
cases = []
for file in files:
# 从yaml/yml中读取用例数据
yaml_data = get_yaml_data(file)
# 调用gen_case方法生成测试用例, 例如:test_demo.py
gen_case_file(case_file_path=file, case_template_path=CASE_TEMPLATE_DIR, case_data=yaml_data,
target_case_path=AUTO_CASE_DIR)
# 将获取到的用例数据统一保存到cases中
cases.extend([yaml_data])
logger.debug(f"{file}中读取到的用例数据是:{yaml_data}")
return cases
def get_case_data():
"""
根据配置文件,从指定类型文件中读取用例数据,并调用生成用例文件方法,生成用例文件
"""
cases = []
# 判断配置文件里面CASE_DATA_TYPE,判断用例数据是从excel还是yaml文件中读取
# 从excel中读取用例数据
if CASE_FILE_TYPE == CaseFileType.EXCEL.value:
# 在用例数据"DATA_DIR"目录中寻找后缀是xlsx, xls的文件
files = get_files(target=DATA_DIR, start="test_", end=".xlsx") \
+ get_files(target=DATA_DIR, start="test_", end=".xls")
cases = gen_case_data_from_excel(files)
return cases
# 从yaml中读取用例数据
elif CASE_FILE_TYPE == CaseFileType.YAML.value:
# 在用例数据"DATA_DIR"目录中寻找后缀是yaml, yml的文件
files = get_files(target=DATA_DIR, start="test_", end=".yaml") \
+ get_files(target=DATA_DIR, start="test_", end=".yml")
cases = gen_case_data_from_yaml(files)
return cases
else:
# 在用例数据"DATA_DIR"目录中寻找后缀是xlsx,xls, yaml, yml的文件
excel_files = get_files(target=DATA_DIR, start="test_", end=".xlsx") \
+ get_files(target=DATA_DIR, start="test_", end=".xls")
yaml_files = get_files(target=DATA_DIR, start="test_", end=".yaml") \
+ get_files(target=DATA_DIR, start="test_", end=".yml")
excel_cases = gen_case_data_from_excel(excel_files)
cases.extend([excel_cases])
yaml_cases = gen_case_data_from_yaml(yaml_files)
cases.extend([yaml_cases])
return cases
def gen_case_file(case_file_path, case_template_path, case_data, target_case_path):
"""
根据测试用例文件(yaml/yml/xlsx/xls),以及事先定义的测试用例模板,实际用例数据,生成测试用例方法(.py)
:param case_file_path: 测试用例文件(yaml/yml/xlsx/xls)的绝对路径
:param case_template_path: 测试用例模板的绝对路径
:param case_data: 实际用例数据
:param target_case_path: 测试用例方法(.py)的绝对路径
"""
# 如果自动生成用例的目录不存在则自动创建一个
if not os.path.exists(AUTO_CASE_DIR):
os.makedirs(AUTO_CASE_DIR)
"""
string.Template是将一个string设置为模板,通过替换变量的方法,最终得到想要的string。
"""
filename = os.path.basename(case_file_path)
# 将用例数据的名称作为测试用例文件名称
func_name = os.path.splitext(filename)[0]
# 测试用例test_demo.py的类名是TestDemo
class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title()
# 定义生成的测试用例的模板
with open(file=case_template_path, mode="r", encoding="utf-8") as f:
case_template = f.read()
# 根据模板,生成测试用例方法
my_case = Template(case_template).safe_substitute({"case_data": case_data,
"func_title": func_name,
"class_title": class_name})
# 将测试用例方法写入py文件中
with open(os.path.join(target_case_path, func_name + '.py'), "w", encoding="utf-8") as fp:
fp.write(my_case)