checkInput.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. """
  4. 检测外部输入参数是否匹配
  5. Author: songjian at <songjian12@baidu.com>
  6. Created: 2021/1/12
  7. """
  8. import sys
  9. import os
  10. import json
  11. import logging
  12. work_path = os.path.dirname(os.path.abspath(__file__))
  13. sdk_path = os.path.dirname(os.path.dirname(work_path))
  14. reload(sys)
  15. sys.setdefaultencoding('utf-8')
  16. def replace_para(case_data, prop, value, replace_key):
  17. """
  18. 用外部输入参数替换变量
  19. :param case_data:
  20. :param prop: 变量
  21. :param value: 替换值
  22. :return:
  23. """
  24. try:
  25. replace_list = case_data
  26. parameter = ""
  27. if not isinstance(replace_list[replace_key], dict) and not isinstance(replace_list[replace_key], list):
  28. parameter = replace_list[replace_key]
  29. else:
  30. parameter = json.dumps(replace_list[replace_key], ensure_ascii=False)
  31. if isinstance(value[prop], str) or isinstance(value[prop], unicode) \
  32. or replace_key == 'check' or replace_key == 'skip':
  33. parameter = parameter.replace('%s' % prop, str(value[prop]))
  34. elif isinstance(value[prop], int):
  35. if '\\"%s\\"' % prop in parameter:
  36. parameter = parameter.replace('\\"%s\\"' % prop, str(value[prop]))
  37. else:
  38. parameter = parameter.replace('"%s"' % prop, str(value[prop]))
  39. else:
  40. parameter = parameter.replace('"%s"' % prop, json.dumps(value[prop], ensure_ascii=False))
  41. if not isinstance(replace_list[replace_key], dict) and not isinstance(replace_list[replace_key], list):
  42. replace_list[replace_key] = parameter
  43. else:
  44. replace_list[replace_key] = json.loads(parameter)
  45. return replace_list
  46. except Exception as e:
  47. logging.error(e)
  48. return case_data
  49. def check_input(case_dict):
  50. """
  51. 检测输入参数
  52. :param case_dict:
  53. :return:
  54. """
  55. # 若不依赖外部信息
  56. if 'input' not in case_dict.keys():
  57. return case_dict
  58. # 若依赖的外部信息,通过其他方式获取参数
  59. input_para = case_dict['input']
  60. if input_para['type'] != 1:
  61. return case_dict
  62. conf = {}
  63. para = []
  64. case_data = []
  65. # 处理文件内部依赖
  66. try:
  67. conf = case_dict['input']['parameter_content']
  68. for case in case_dict['test_case']:
  69. if 'precondition' in case.keys() and 'input.' in case['precondition']['case_name']:
  70. case_name_list = case['precondition']['case_name'].split(';')
  71. back_prop_list = case['precondition']['back_prop'].split(';')
  72. if 'replace_key' not in case['precondition'].keys() \
  73. or not case['precondition']['replace_key']:
  74. replace_key = ['parameter']
  75. else:
  76. replace_key = case['precondition']['replace_key'].split(';')
  77. if len(case_name_list) != len(back_prop_list) or len(case_name_list) != len(replace_key):
  78. logging.error('precondition parameter length not equal')
  79. return case_dict
  80. for round in range(len(case_name_list)):
  81. case_name = case_name_list[round].split('||')
  82. back_prop = back_prop_list[round].split('||')
  83. for i in range(len(case_name)):
  84. if 'input.' in case_name[i]:
  85. prop_list = back_prop[i].split('|')
  86. for prop in prop_list:
  87. # 缺少参数
  88. if prop not in conf.keys() and prop not in para:
  89. para.append(prop)
  90. # 替换
  91. elif prop in conf.keys():
  92. case = replace_para(case, prop, conf, replace_key[round])
  93. case_data.append(case)
  94. # 无法完成替换,需要返回错误
  95. if len(para) != 0:
  96. logging.error('缺少必要输入参数,%s: %s' % (input_para['info'], ','.join(para)))
  97. sys.exit(-1)
  98. else:
  99. case_dict['test_case'] = case_data
  100. return case_dict
  101. except Exception as e:
  102. logging.error(e)
  103. sys.exit(-1)