YamlCaseParser.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # -*- coding: utf-8 -*-
  2. import copy
  3. import os.path
  4. # 专门用例Yaml参数化
  5. # 导入yaml的包: pip install pyyaml
  6. # 读取yaml的数据
  7. import yaml, os, uuid
  8. from apirun.core.globalContext import g_context
  9. from apirun.Log.Log import logger
  10. # def traverse_files_name(path): # 遍历文件路径
  11. # data = []
  12. # for root, dirs, files in os.walk(path):
  13. # for file in files:
  14. # data.append(os.path.join(root, file))
  15. # return data
  16. #
  17. # def traverse_files(path): # 遍历文件名称
  18. # data = []
  19. # for root, dirs, files in os.walk(path):
  20. # for file in files:
  21. # data.append(file)
  22. # return data
  23. def load_context_from_yaml(folder_path):
  24. """
  25. :param folder_path: 文件路径
  26. :return:
  27. """
  28. try:
  29. yaml_file_path = os.path.join(folder_path, "context.yaml") # 把2个文本进行拼接
  30. with open(yaml_file_path, "r", encoding="utf-8") as f:
  31. # 加载所有数据
  32. data = yaml.load(f, Loader=yaml.FullLoader)
  33. # 如果数据不为空,则设置到全局变量当中
  34. if data: g_context().set_by_dict(data)
  35. except Exception as e:
  36. logger.error(f"装载yaml文件错误: {str(e)}")
  37. return False
  38. # 加载我们满足条件的文件及数据
  39. def load_yaml_files(config_path):
  40. """
  41. 返回满足条件的yaml文件列表及数据
  42. :param config_path: Yaml存放的路径
  43. :return:
  44. """
  45. yaml_caseInfos = [] # 存储所有的数据
  46. suite_folder = os.path.join(config_path)
  47. # 存放在该路径的全局变量进行写入
  48. load_context_from_yaml(suite_folder)
  49. # 满足条件的列表
  50. for root, dirs, files in os.walk(suite_folder):
  51. file_names = [(int(f.split("_")[0]), f) for f in files if
  52. f.endswith(".yaml") and f.split("_")[0].isdigit()]
  53. # 排序,排序只保留文件名即可
  54. file_names.sort()
  55. file_names = [f[-1] for f in file_names]
  56. # 加载每个文件的数据给到yaml_caseInfos
  57. for file_name in file_names:
  58. file_path = os.path.join(root, file_name)
  59. with open(file_path, "r", encoding="utf-8") as f:
  60. # 加载所有数据
  61. caseinfo = yaml.full_load(f)
  62. if caseinfo is not None:
  63. yaml_caseInfos.append(caseinfo) # [{yaml里面的数据}]
  64. return yaml_caseInfos # 所有的测试用例
  65. def yaml_case_parser(config_path):
  66. """
  67. 返回指定条件的格式
  68. :param config_path: 文件的路径
  69. :return: {
  70. "case_infos": case_infos, # 所有的测试用例 []
  71. "case_names": case_names # 所有测试用例对应的标题 []
  72. }
  73. """
  74. # TODO 0: 对应固定的格式
  75. case_infos = []
  76. case_names = []
  77. case_process = []
  78. # TODO 1: 调用对应的方法:拿到所有的用例数据
  79. yaml_caseInfos = load_yaml_files(config_path)
  80. # TODO 2: 统一处理成一样的格式 (后面excel一样的处理)
  81. for caseinfo in yaml_caseInfos:
  82. # TODO 扩展: 获取ddt的数据,得到长度
  83. ddts = caseinfo.get("ddts", [])
  84. # TODO 扩展: 取到数据之后,我们需要删除ddts这个,避免有后续的影响
  85. if len(ddts) > 0:
  86. caseinfo.pop("ddts")
  87. if len(ddts) == 0:
  88. # 按照之前逻辑直接处理即可
  89. case_name = caseinfo.get("desc", uuid.uuid4().__str__()) # 没有名字,我们自己生成一个,需要把它写到我们测试用例当中
  90. caseinfo.update({"_case_name": case_name}) # 需要把它写到我们测试用例当中
  91. case_infos.append(caseinfo) # 所有的测试用例 []
  92. case_names.append(case_name) # 所有的用例名称 []
  93. case_process.append(caseinfo['process']) # 所有的用例使用的进程标识
  94. else:
  95. # 根据ddts的数据生成多组数据
  96. for ddt in ddts:
  97. new_case = copy.deepcopy(caseinfo)
  98. # 给当前这个用例新增一个context对应值,没有的话则是一个空字典
  99. context = new_case.get("context", {})
  100. ddt.update(context)
  101. new_case.update({"context": ddt})
  102. # 用例值和对应的标题
  103. case_name = f'{caseinfo.get("desc", uuid.uuid4().__str__())}-{ddt.get("desc", uuid.uuid4().__str__())}'
  104. new_case.update({"_case_name": case_name}) # 需要把它写到我们测试用例当中
  105. case_infos.append(new_case) # 所有的测试用例 []
  106. case_names.append(case_name) # 所有的用例名称 []
  107. case_process.append(new_case['process']) # 所有的用例使用的进程标识
  108. return {
  109. "case_infos": case_infos,
  110. "case_names": case_names,
  111. "case_process": case_process
  112. }
  113. # data = yaml_case_parser(r"E:\1_A_TEST\zhoke\api-engine\examples\examples-ds")
  114. # print(data)