diff --git a/case_utils/case_handle.py b/case_utils/case_handle.py index 488d3d7..2ba7cc7 100644 --- a/case_utils/case_handle.py +++ b/case_utils/case_handle.py @@ -14,74 +14,73 @@ from config.global_vars import CaseFileType from config.settings import CASE_FILE_TYPE from string import Template from loguru import logger - -# 定义生成的测试用例的模板 -with open(file=os.path.join(CONF_DIR, "case_template.txt"), mode="r", encoding="utf-8") as f: - case_template = f.read() +from common_utils.files_handle import get_files def get_case_data(): """ 根据配置文件,从指定类型文件中读取用例数据,并调用生成用例文件方法,生成用例文件 """ + cases = [] # 判断配置文件里面CASE_DATA_TYPE,判断用例数据是从excel还是yaml文件中读取 # 从excel中读取用例数据 if CASE_FILE_TYPE == CaseFileType.EXCEL.value: - cases = [] - # 在用例数据data_path目录中寻找后缀是xlsx的文件 - for file in [excel for excel in os.listdir(DATA_DIR) if os.path.splitext(excel)[1] in [".xlsx", "xls"]]: - # 判断只有以test_开头的excel才生成测试用例py文件 - if file.startswith("test_"): - # 读取excel文件中的用例数据,存储到data中 - data = ReadExcel(os.path.join(DATA_DIR, file)).read() - # 将用例数据的名称作为测试用例文件名称 - func_name = os.path.splitext(file)[0] - # 测试用例test_demo.py的类名是TestDemo - class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title() - # 调用gen_case方法生成测试用例test_demo.py - gen_case_file(func_name, data, class_name) - # 将excel中读取的用例数据放到cases列表中 - cases.extend(data) + # 在用例数据"DATA_DIR"目录中寻找后缀是xlsx, xls的文件 + files = get_files(target=DATA_DIR, start="test_", end=".xlsx") + get_files(target=DATA_DIR, start="test_", + end=".xls") + for file in files: + # 这里file文件绝对路径,filename才是文件名称 + filename = os.path.basename(file) + # 读取excel文件中的用例数据,存储到data中 + data = ReadExcel(file).read() + # 将用例数据的名称作为测试用例文件名称 + func_name = os.path.splitext(filename)[0] + # 测试用例test_demo.py的类名是TestDemo + class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title() + # 调用gen_case方法生成测试用例test_demo.py + gen_case_file(func_name, data, class_name) + # 将excel中读取的用例数据放到cases列表中 + cases.extend(data) logger.debug(f"从excel中读取到的用例数据是:{cases}") return cases # 从yaml中读取用例数据 elif CASE_FILE_TYPE == CaseFileType.YAML.value: - cases = [] - # 在用例数据data_path目录中寻找后缀是yaml/yml的文件 - for file in [yaml for yaml in os.listdir(DATA_DIR) if - os.path.splitext(yaml)[1] in [".yaml", ".yml"]]: - # 判断只有以test_开头的yaml才生成测试用例py文件 - if file.startswith("test_"): - # 读取yaml/yml文件中的用例数据,存储到data中 - data = HandleYaml(os.path.join(DATA_DIR, file)).read_yaml - # 将用例数据的名称作为测试用例文件名称 - func_name = os.path.splitext(file)[0] - # 测试用例test_demo.py的类名是TestDemo - class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title() - # 调用gen_case方法生成测试用例test_demo.py - gen_case_file(func_name, data, class_name) - # 将excel中读取的用例数据放到cases列表中 - cases.extend(data) + # 在用例数据"DATA_DIR"目录中寻找后缀是yaml, yml的文件 + files = get_files(target=DATA_DIR, start="test_", end=".yaml") + get_files(target=DATA_DIR, start="test_", + end=".yml") + for file in files: + filename = os.path.basename(file) + # 读取yaml/yml文件中的用例数据,存储到data中 + data = HandleYaml(file).read_yaml + # 将用例数据的名称作为测试用例文件名称 + func_name = os.path.splitext(filename)[0] + # 测试用例test_demo.py的类名是TestDemo + class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title() + # 调用gen_case方法生成测试用例test_demo.py + gen_case_file(func_name, data, class_name) + # 将excel中读取的用例数据放到cases列表中 + cases.extend(data) logger.debug(f"从yaml中读取到的用例数据是:{cases}") return cases else: - # 从excel以及yaml/yml文件中读取用例数据 - cases = [] - for file in [excel for excel in os.listdir(DATA_DIR) if - os.path.splitext(excel)[1] in [".yaml", ".yml", ".xlsx", "xls"]]: - # 判断只有以test_开头的yaml才生成测试用例py文件 - if file.startswith("test_"): - if os.path.splitext(file)[1] == ".xlsx": - data = ReadExcel(os.path.join(DATA_DIR, file)).read() - func_name = os.path.splitext(file)[0] - cases.extend(data) - else: - data = HandleYaml(os.path.join(DATA_DIR, file)).read_yaml - func_name = os.path.splitext(file)[0] - cases.extend(data) + # 在用例数据"DATA_DIR"目录中寻找后缀是xlsx,xls, yaml, yml的文件 + files = get_files(target=DATA_DIR, start="test_", end=".xlsx") + get_files(target=DATA_DIR, start="test_", + end=".xls") + get_files( + target=DATA_DIR, start="test_", end=".yaml") + get_files(target=DATA_DIR, start="test_", + end=".yml") + for file in files: + filename = os.path.basename(file) + if os.path.splitext(file)[1] == ".xlsx" or os.path.splitext(file)[1] == ".xls": + data = ReadExcel(file).read() + func_name = os.path.splitext(filename)[0] + cases.extend(data) + else: + data = HandleYaml(file).read_yaml + func_name = os.path.splitext(filename)[0] + cases.extend(data) - class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title() - gen_case_file(func_name, data, class_name) + class_name = func_name.split("_")[0].title() + func_name.split("_")[1].title() + gen_case_file(func_name, data, class_name) logger.debug(f"从excel以及yaml中读取到的用例数据是:{cases}") return cases @@ -96,6 +95,9 @@ def gen_case_file(func_name, case_data, class_name): """ string.Template是将一个string设置为模板,通过替换变量的方法,最终得到想要的string。 """ + # 定义生成的测试用例的模板 + with open(file=os.path.join(CONF_DIR, "case_template.txt"), 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}) diff --git a/common_utils/files_handle.py b/common_utils/files_handle.py new file mode 100644 index 0000000..ca95574 --- /dev/null +++ b/common_utils/files_handle.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# @Time : 2023/3/30 22:34 +# @Author : Flora.Chen +# @File : files_handle.py +# @Software: PyCharm +# @Desc: 处理文件相关操作 +import os + + +def get_files(target, start=None, end=None): + """ + @param: target: 目标文件绝对路径 + @param: start: 以什么开头,默认为空 + @param: end: 以什么结尾,默认为空 + 获取目录下所有的文件,以列表的形式返回 + """ + if os.path.isfile(target): + return [] + # files返回j经过处理的文件列表 + files = [] + # dirpath:表示获取的目录的路径,以string形式返回值。 + # dirnames: 包含了当前dirpath路径下所有的子目录名字(不包含目录路径),以列表形式返回值。 + # filenames:包含了当前dirpath路径下所有的非目录子文件的名字(不包含目录路径)。 + for dirpath, dirnames, filenames in os.walk(target): + for filename in filenames: + # 如果"start"和"end"都有值 + if start and end: + # filename是以"start"且filename是以"end"结尾,则追加到files + if filename.startswith(start) and filename.endswith(end): + files.append(os.path.abspath(os.path.join(dirpath, filename))) + # 或者如果"start"有值,filename是以"start"开头,则追加到files + elif start and (not end): + if filename.startswith(start): + files.append(os.path.abspath(os.path.join(dirpath, filename))) + # 或者如果"end"有值,且filename是以"end"结尾,则追加到files + elif end and (not start): + if filename.endswith(end): + files.append(os.path.abspath(os.path.join(dirpath, filename))) + else: + files.append(os.path.abspath(os.path.join(dirpath, filename))) + # 判断files列表是否为空,不为空则返回files,为空则返回all_files + return files + + +def get_newest_file(dir_path): + """ + 获取目录下最新的文件 + """ + if os.path.isfile(dir_path): + return None + + # 获取目录下所有文件 + files = os.listdir(dir_path) + + # 按文件修改时间排序 + sorted_files = sorted( + [(os.path.join(dir_path, file), os.path.getmtime(os.path.join(dir_path, file))) for file in files], + key=lambda x: x[1], + reverse=True + ) + + # 返回最新文件路径 + return sorted_files[0][0]