ApiTestRunner.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # -*- coding: utf-8 -*-
  2. import copy
  3. import allure
  4. from apirun.Log.Log import logger
  5. from apirun.extend.keywords import KeyWords
  6. from apirun.utils.VarRender import refresh # 变量渲染方法
  7. from apirun.utils.DynamicTitle import dynamicTitle # 测试标题生成
  8. from apirun.core.globalContext import g_context # 全局变量
  9. class TestRunner:
  10. # TODO 1: 读取到对应的数据
  11. # caseinfo = case_parser("excel","./examples") # 参数
  12. # TODO 2: 生成全量测试数据
  13. # @pytest.mark.parametrize("caseinfo", caseinfo["case_infos"])
  14. def test_case_execute(self, caseinfo):
  15. casename = caseinfo["_case_name"]
  16. # TODO 2-1 : 调用动态生成标题的方法
  17. dynamicTitle(caseinfo)
  18. # TODO 2-2: 基于我们步骤一步步进行执行
  19. try:
  20. # 实例化关键字对象
  21. keywords = KeyWords()
  22. # 获取当前用例变量,方便后续的渲染
  23. local_context = caseinfo.get("context",{})
  24. context = copy.deepcopy(g_context().show_dict())
  25. context.update(local_context)
  26. steps = caseinfo.get("steps", None)
  27. logger.info(f"-----------------开始执行测试用例:{steps}-------------")
  28. for index,step in enumerate(steps):
  29. # 提示信息
  30. step_name = list(step.keys())[0]
  31. step_value = list(step.values())[0]
  32. # TODO : 每一个步骤进行变量的渲染
  33. context = copy.deepcopy(g_context().show_dict())
  34. context.update(local_context)
  35. step_value = eval(refresh(step_value, context))
  36. logger.info(f"测试用例名称:{casename},开始执行步骤{index}:{step_name} - {step_value}")
  37. # 基于每个步骤的关键字,找到对应的方法,然后把参数给它
  38. # 通过【反射】的方式去找到对应的方法
  39. with allure.step(step_name):
  40. key = step_value["关键字"] # 具体的方法名, 在 keywords 里面找到这个方法
  41. try:
  42. key_func = keywords.__getattribute__(key) # 从keywords获取到对应方法
  43. except AttributeError as e:
  44. logger.error(f"测试用例名称:{casename},没有这个关键字方法", e)
  45. key_func(**step_value) # 调用方法
  46. finally:
  47. logger.info(f"-------------------测试用例名称:{casename}执行结束----------------------")