checkResult.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. """
  4. 定义结果校验方法
  5. Author: songjian at <songjian12@baidu.com>
  6. Created: 2020/4/21
  7. """
  8. import sys
  9. import re
  10. import logging
  11. import os
  12. import json
  13. reload(sys)
  14. sys.setdefaultencoding('utf-8')
  15. def check_equal(check_data, golden):
  16. """
  17. 完全匹配校验
  18. """
  19. logging.info('golden:%s, check_data:%s' % (golden, check_data))
  20. logging.info('check result:%s' % (check_data == golden))
  21. return check_data == golden
  22. def check_re(check_data, golden):
  23. """
  24. 正则匹配校验
  25. """
  26. regex = ''
  27. if '&' in golden:
  28. re_words = golden.split('&')
  29. for word in re_words:
  30. regex = regex + "(?=.*" + word + ")"
  31. else:
  32. regex = golden
  33. logging.info('regex:%s, check_data:%s' % (regex, check_data))
  34. logging.info('check result:%s' % (len(re.findall(regex, check_data)) != 0))
  35. return len(re.findall(regex, check_data)) != 0
  36. def check_result(data, results):
  37. """
  38. 校验入口
  39. """
  40. if 'check_type' not in data.keys():
  41. data['check_type'] = 'regular'
  42. if not data['check_type']:
  43. logging.error('校验类型为空')
  44. return False
  45. logging.info('校验类型:%s' % data['check_type'])
  46. if data['check_type'] == 'regular':
  47. return check(data, results)
  48. elif data['check_type'] == 'not_in':
  49. return not check(data, results)
  50. elif data['check_type'] == 'check_http':
  51. return check_http(results)
  52. else:
  53. logging.error('check type is not define')
  54. return False
  55. def str_to_int(index):
  56. """
  57. 字符串转数字
  58. """
  59. for ch in index:
  60. if ch < '0' or ch > '9':
  61. return index
  62. return int(index)
  63. def find_key(data_list, reg):
  64. """
  65. 在数组中寻找符合要求的键值
  66. """
  67. # reg = reg.strip('[').strip(']')
  68. reg = reg[1:-1]
  69. tree_node = reg.split('#')
  70. for data in data_list:
  71. key = []
  72. temp = data
  73. for node in tree_node:
  74. if ':' in node:
  75. key = node.split(':', 1)
  76. else:
  77. try:
  78. temp = temp[str_to_int(node)]
  79. except Exception as e:
  80. logging.info('该条结果缺少该字段:%s' % e)
  81. break
  82. if len(key) != 2 or key[0] not in temp.keys():
  83. continue
  84. elif temp[key[0]] == str_to_int(key[1]):
  85. return data
  86. return {}
  87. def get_prop(data, path):
  88. """
  89. 获取指定字段
  90. :param data:
  91. :return:
  92. """
  93. try:
  94. temp = data
  95. tree_list = path.split('>')
  96. for item in tree_list:
  97. if '[' in item:
  98. temp = find_key(temp, item)
  99. else:
  100. temp = temp[str_to_int(item)]
  101. return temp, True
  102. except KeyError as e:
  103. logging.error('KeyError:%s' % e)
  104. return data, False
  105. except IndexError as e:
  106. logging.error('IndexError:%s' % e)
  107. return data, False
  108. def check(data, results):
  109. """
  110. 校验函数
  111. """
  112. lines = []
  113. if os.path.isfile(str(data['assert_words'])):
  114. with open(data['assert_words'], 'r') as f:
  115. lines = f.readlines()
  116. if len(lines) != len(results):
  117. logging.error('check file length not equal to result file')
  118. return False
  119. for i in range(len(results)):
  120. if 'path' not in data.keys():
  121. temp = (results[i][1], True)
  122. else:
  123. logging.info('校验路径:%s' % data['path'])
  124. temp = get_prop(results[i][1], data['path'])
  125. if not temp[1]:
  126. logging.error("获取指定参数失败")
  127. return False
  128. if isinstance(temp[0], int):
  129. parameter = str(temp[0])
  130. elif not isinstance(temp[0], dict) \
  131. and not isinstance(temp[0], list):
  132. parameter = temp[0]
  133. else:
  134. parameter = json.dumps(temp[0], ensure_ascii=False)
  135. if os.path.isfile(str(data['assert_words'])):
  136. if not check_re(parameter, lines[i].strip().decode('utf-8')):
  137. return False
  138. elif not check_re(parameter, data['assert_words']):
  139. return False
  140. return True
  141. def check_http(results):
  142. """
  143. 验证http 链接是否可达
  144. """
  145. if results[0][0] in [200, 304]:
  146. return True
  147. else:
  148. return False
  149. if __name__ == "__main__":
  150. print check_result({"check_type": "regular", "assert_words": "error\": 0"}, [[200, {"error": 0}]])