def postMul(url, header, body): ''' post请求,多线程场景 :param url: :param header: :param body: 直接传字典数据即可 :return: ''' Log.print_info( 1, 'INSTRUMENTATION_STATUS: thread start={0}'.format( threading.currentThread().getName())) start_ = int(round(time.time() * 1000)) res = requests.post(url, headers=header, json=body) end_ = int(round(time.time() * 1000)) Log.print_info( 1, 'INSTRUMENTATION_STATUS: thread={0},time={1}'.format( threading.currentThread().getName(), end_ - start_)) if res.status_code == 200: Log.print_info( 1, 'INSTRUMENTATION_STATUS: thread={0}, res={1}'.format( threading.currentThread().getName(), json.loads(res.text))) else: res = {} res['code'] = -1 res['msg'] = '接口404' Log.print_info( 1, 'INSTRUMENTATION_STATUS: thread={0},res={1}'.format( threading.currentThread().getName(), res)) Log.print_info( 1, 'INSTRUMENTATION_STATUS: thread={0},result=Pass'.format( threading.currentThread().getName()))
def createThreading(Cases, num, *args): ''' 多线程触发请求的入口 :param Cases: :param num:生成线程数 :param args: :return: ''' if type(Cases) == dict: Server = numpy.where(Cases['Server'] == 'default', Config.Default['Server'], Cases['Server']) for Case in Cases['Cases']: if args: if Case['CaseName'] in args: Log.print_info(1, '已匹配到指定测试用例:{0}'.format(Case['CaseName'])) dealCasesMulThreading(Server, Case, Cases, num) else: dealCasesMulThreading(Server, Case, Cases, num) elif type(Cases) == list: for cl in Cases: Server = numpy.where(cl['Server'] == 'default', Config.Default['Server'], cl['Server']) for Case in cl['Cases']: if args: if Case['CaseName'] in args: Log.print_info( 1, '已匹配到指定测试用例:{0}'.format(Case['CaseName'])) dealCasesMulThreading(Server, Case, cl, num) else: dealCasesMulThreading(Server, Case, cl, num)
def create(Cases, *args): ''' 校验出入参数,并走执行case的步骤 :param Cases: :param args: :return: ''' if type(Cases) == dict: Server = numpy.where(Cases['Server'] == 'default', Config.Default['Server'], Cases['Server']) for Case in Cases['Cases']: if args: if Case['CaseName'] in args: Log.print_info(1, '已匹配到指定测试用例:{0}'.format(Case['CaseName'])) dealCases(Server, Case, Cases) else: dealCases(Server, Case, Cases) elif type(Cases) == list: for cl in Cases: Server = numpy.where(cl['Server'] == 'default', Config.Default['Server'], cl['Server']) for Case in cl['Cases']: if args: if Case['CaseName'] in args: Log.print_info( 1, '已匹配到指定测试用例:{0}'.format(Case['CaseName'])) dealCases(Server, Case, cl) else: dealCases(Server, Case, cl)
def post(url, header, body): ''' Post请求封装 :param url: :param header: :param body: :return: ''' Log.print_info(2, 'header:{0}'.format(header)) Log.print_info(2, 'body:{0}'.format(body)) res = requests.post(url=url, headers=header, json=body) if res.status_code == 200: return (json.loads(res.text)) else: res = {} res['code'] = -1 res['msg'] = '接口404' return res
def dealCases(Server, Case, Cases): ''' 处理数据,并做数据处理,转换成访问请求,并做验证 :param Server: :param Case: :param Cases: :return: ''' url = '{0}{1}'.format(Server, Case['api']) Log.print_info( 1, 'INSTRUMENTATION_STATUS: CaseName={0}'.format(Case['CaseName'])) Log.print_info(1, 'INSTRUMENTATION_STATUS: Detail={0}'.format(Case['detail'])) Log.print_info(1, 'INSTRUMENTATION_STATUS: api={0}'.format(Case['api'])) Log.print_info( 1, 'INSTRUMENTATION_STATUS: charger={0}'.format(Case['charger'])) Log.print_info(1, 'INSTRUMENTATION_STATUS: path={0}'.format(Cases['path'])) if Case['method'] == 'get': paramDict = Config.Default['param'] for key in Case['In']: if key in paramDict and Case['In'].get('default'): del paramDict[key] if 'default' in Case['In']: if Case['In']['default'] == True: Log.print_info(2, 'Need insert Default Keys') dict_def(paramDict) dict_def(Case['In']) del Case['In']['default'] Case['In'].update(paramDict) Log.print_info(3, 'param:{0}'.format(Case['In'])) param = parse.urlencode(Case['In']) url_end = '{0}?{1}'.format(url, param.replace('=None', '=')) Log.print_info(2, url_end) start_ = int(round(time.time() * 1000)) Response = get(url=url_end) end_ = int(round(time.time() * 1000)) Log.print_info( 1, 'INSTRUMENTATION_STATUS: time={0}'.format(end_ - start_)) Log.print_info(2, Response) check(Case, Response) elif Case['method'] == 'post': paramDict = Config.Default['body'] if Case['header'] == 'default': Case['header'] = Config.Default['header'] if 'default' in Case['body']: if Case['body']['default'] == True: Log.print_info(2, 'Need insert Default Keys') dict_def(paramDict) dict_def(Case['body']) del Case['body']['default'] for key in Case['body']: if key in paramDict and 'default' in Case['body']: del paramDict[key] Case['body'].update(paramDict) start_ = int(round(time.time() * 1000)) Response = post(url, header=Case['header'], body=Case['body']) end_ = int(round(time.time() * 1000)) Log.print_info( 1, 'INSTRUMENTATION_STATUS: time={0}'.format(end_ - start_)) Log.print_info(2, Response) check(Case, Response)
def check(Case, Response): ''' 检查返回结果 :param Case: :param Response: :return: ''' if Case['Out']['type'] == 'key': ''' 校验返回的指定key的value值 ''' isPass = True for keyOut in Case['Out']: if keyOut == 'type': pass else: if '$' in keyOut: Log.print_info(2, "use Jsonpath") res = jsonpath(Response, keyOut) if res: Error = numpy.where( Case['Out'][keyOut] in res, 'Pass', 'expect:{0},Actual:{1},Res:{2}'.format( Case['Out'][keyOut], res, Response)) else: Error = 'Failed,{0} 查找不到匹配 key'.format(keyOut) else: Error = numpy.where( Case['Out'][keyOut] == Response[keyOut], 'Pass', 'expect:{0},Actual:{1},Res:{2}'.format( Case['Out'][keyOut], Response[keyOut], Response)) if 'Pass' != Error: isPass = False Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Failed') Log.print_info( 1, 'INSTRUMENTATION_STATUS: log={0}'.format(Error)) break if isPass: Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Pass') Log.print_info(1, 'INSTRUMENTATION_STATUS: log={0}'.format('null')) elif Case['Out']['type'] == 'type': ''' 校验返回结果指定key的type数据类型 ''' isPass = True for keyOut in Case['Out']: if keyOut == 'type': pass else: if Case['Out'][keyOut] == 'int': expect_type = int elif Case['Out'][keyOut] == 'str': expect_type = str elif Case['Out'][keyOut] == 'dict': expect_type = dict elif Case['Out'][keyOut] == 'list': expect_type = list elif Case['Out'][keyOut] == 'bool': expect_type = bool elif Case['Out'][keyOut] == 'none': expect_type = type(None) Error = numpy.where( expect_type == type(Response[keyOut]), 'Pass', 'expect:{0},Actual:{1},Res:{2}'.format( Case['Out'][keyOut], type(Response[keyOut]), Response)) if 'Pass' != Error: isPass = False Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Failed') Log.print_info( 1, 'INSTRUMENTATION_STATUS: log={0}'.format(Error)) break if isPass: Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Pass') elif Case['Out']['type'] == 'file': ''' 校验整体返回 ''' Local = os.getcwd() if Local.endswith('API_test_Pro'): pass else: Local = Local.split('API_test_Pro')[0] + 'API_test_Pro' file = open('{1}/Entry/Result/{0}'.format(Case['CaseName'], Local), 'w') file.write(str(Response)) file.close() Actual = getMD5('{1}/Entry/Result/{0}'.format(Case['CaseName'], Local)) expect = getMD5('{1}/Utils/Result/{0}'.format(Case['Out']['file'], Local)) Error = numpy.where(Actual == expect, 'Pass', '数据不匹配,检查返回:{0}'.format(Response)) if 'Pass' != Error: Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Failed') Log.print_info(1, 'INSTRUMENTATION_STATUS: log={0}'.format(Error)) else: Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Pass') os.remove('{1}/Entry/Result/{0}'.format(Case['CaseName'], Local))
def dealCasesMulThreading(Server, Case, Cases, num): ''' 多线程触发请求的入口 :param Server: :param Case: :param Cases: :param num: :return: ''' url = '{0}{1}'.format(Server, Case['api']) Log.print_info( 1, 'INSTRUMENTATION_STATUS: CaseName={0}'.format(Case['CaseName'])) Log.print_info(1, 'INSTRUMENTATION_STATUS: Detail={0}'.format(Case['detail'])) Log.print_info( 1, 'INSTRUMENTATION_STATUS: charger={0}'.format(Case['charger'])) Log.print_info(1, 'INSTRUMENTATION_STATUS: path={0}'.format(Cases['path'])) if Case['method'] == 'get': paramDict = Config.Default['param'] for key in Case['In']: if key in paramDict and Case['In'].get('default'): del paramDict[key] if 'default' in Case['In']: if Case['In']['default'] == True: Log.print_info(2, 'Need insert Default Keys') dict_def(paramDict) dict_def(Case['In']) del Case['In']['default'] Case['In'].update(paramDict) Log.print_info(3, 'param:{0}'.format(Case['In'])) param = parse.urlencode(Case['In']) url_end = '{0}?{1}'.format(url, param.replace('=None', '=')) Log.print_info(2, url_end) urls = [] for i in range(num): urls.append(url_end) [thread(url) for url in urls] Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Pass') Log.print_info(1, 'INSTRUMENTATION_STATUS: log={0}'.format('null')) elif Case['method'] == 'post': paramDict = Config.Default['body'] if Case['header'] == 'default': Case['header'] = Config.Default['header'] if 'default' in Case['body']: if Case['body']['default'] == True: Log.print_info(2, 'Need insert Default Keys') dict_def(paramDict) dict_def(Case['body']) del Case['body']['default'] for key in Case['body']: if key in paramDict and 'default' in Case['body']: del paramDict[key] Case['body'].update(paramDict) urls = [] for i in range(num): urls.append(url) [ threadPost(url_item, Case['header'], Case['body']) for url_item in urls ] Log.print_info(1, 'INSTRUMENTATION_STATUS: result=Pass') Log.print_info(1, 'INSTRUMENTATION_STATUS: log={0}'.format('null'))
def tearDown(self): Log.print_info(2, 'teardown')
def setUp(self): Log.print_info(2, 'set')
def tearDownClass(cls): Log.print_info(2, 'cls teardown')
def setUpClass(cls): Log.print_info(2, 'cls setup') # Cases = cls.readConfig(cls) Config.Default = cls.readCasesFromClass(cls, 'Default')