def api_key(self): param = self.__sign if self.test_envir == 0: res = base_request(method='post', url="http://m-dev.jzb.com/user/login/v2016", body_data=param) elif self.test_envir == 1: res = base_request(method='post', url="http://m.jzb.com/user/login/v2016", body_data=param) else: res = None try: auth = res.json().get('res').get('api_key') return auth except: print('测试环境选择错误!环境选择举例:test_envir=TestEnvir.TEST')
def a2(): url = '{}/homepage/measureQuery?user_req_id=df8f71ac8x16cd0fe4c36'.format( ua) data = [{ "measures": [ "goodsIssueAmount", "goodsIssueCount", "firstTransCustAmount", "firstTransCustCount", "firstTransCustPrice", "oldTransCustCount", "oldTransCustAmount", "oldTransCustPrice", "grossMargin", "salesRevenue", "goodsReturnCount", "goodsReturnAmount", "stockoutAndReciptCount", "agoStockoutAndReciptCount", "replenishedStockoutCount", "replenishedReceiptCount", "stockoutUnreceiptCount", "receiptUnstockoutCount", "unstockoutUnreceiptCount", "totalPaymentApCount", "totalPaymentApAmount", "goodsReceiptAmount", "goodsReceiptCount", "prepaidPaymentArCount", "prepaidPaymentArAmount", "cashPaymentArCount", "cashPaymentArAmount", "arrearsPaymentArCount", "arrearsPaymentArAmount", "totalPaymentArAmount", "totalPaymentArCount", "revenueAmount", "revenueCount", "expenseAmount", "expenseCount", "stockOutAmount", "stockOutCount", "stockInAmount", "stockInCount", "stockTransferCount", "stockCountCount", "stockCountSubCount" ], "time": "20190101,20191231" }] r = baseRequest.base_request('post', url, headers=headers, data=data, timeout=60) return round(r.elapsed.total_seconds(), 2)
def get_vrf_params(): """获取vrf请求头必须参数""" res = base_request(method='get', url='http://aitools.dev.jzb.com/getVrfToken') oj_info = res.json().get('objects') pinus = oj_info.get('pinus') x_identity_code = oj_info.get('X-Identity-Code') return {'pinus': pinus, 'X-Identity-Code': x_identity_code}
def push_text(res_msg, access_token, send_all=False): """ 钉钉推送 :param res_msg: list() :param access_token: list() :param send_all: 是否群发 :return: """ url = 'https://oapi.dingtalk.com/robot/send?access_token=%s' % access_token # content_with_img = '# 构建失败\n![screenshot](https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2934092001,3164812011&fm=26&gp=0.jpg)\n\n' \ # '>#### 失败原因:%s\n\n>%s' % (result, cw) # data_with_img = { # "msgtype": "markdown", # "markdown": {"title": "后端业务监控", # "text": content_with_img # }, # "at": { # "atMobiles": [ # "134xxxxxxxx" # ], # "isAtAll": False # } # } temp = "" for i in range(len(res_msg)): if i == 0: temp += '%s\n' % res_msg[i] continue temp += '-->%s\n\n' % res_msg[i] content = temp + cw data = { "msgtype": "text", "text": { "content": content }, "at": { "atMobiles": [""], "isAtAll": send_all } } base_request(method='post', url=url, body_data=data, body_type=BodyType.JSON)
def login_new(self): """750+版本登录""" if self.test_envir == 1: url = 'https://passport.jzb.com/login?v=7.55&ver=7.55&channel=website&deviceId=ffffffff-c7a8-b0f1-0000-0000265bc76d&deviceType=MIX_2&deviceVersion=8.0.0' data = {'uname': 'JZB150', 'passwd': 'g9a6y5e4'} res = base_request(method='post', url=url, body_data=data) return res else: pass
def login_1(self): url = '{}/mobile/cia/graphql?user_req_id=1568705092426_198'.format( self.host_addr) data = { "query": "\n fragment OrgType on Org {\n id\n name\n account\n isInitial\n " " }\n\n fragment AppSubscribeType on AppSubscription {\n status\n startDate\n " " endDate\n license\n org {\n ...OrgType\n }\n }\n\n " "mutation Login($username: String!, $password: String!) {\n createToken(username: "******"$username, password: $password) {\n accessToken\n refreshToken\n " " viewer {\n id\n name\n headPicture(size: " "MIDDLE)\n mobile\n email\n orgId\n " "defaultOrg {\n ...OrgType\n }\n defaultAppOrg{" "\n ...OrgType\n }\n orgs {\n " " ...OrgType\n }\n appSubscribes {\n " "...AppSubscribeType\n }\n # subscribes {\n " " # status\n # startDate\n " " # endDate\n # license\n " "# appId\n # appName\n # " " org {\n # id\n # " " name\n # account\n # " " isInitial\n # logo\n # " " }\n # }\n }\n }\n }\n", "variables": { "username": self.username, "password": self.password }, "mutation": "\n fragment OrgType on Org {\n id\n name\n account\n " "isInitial\n }\n\n fragment AppSubscribeType on AppSubscription {\n status\n " " startDate\n endDate\n license\n org {\n ...OrgType\n " " }\n }\n\n mutation Login($username: String!, $password: String!) {\n " "createToken(username: $username, password: $password) {\n accessToken\n " " refreshToken\n viewer {\n id\n name\n " " headPicture(size: MIDDLE)\n mobile\n email\n " "orgId\n defaultOrg {\n ...OrgType\n }\n " " defaultAppOrg{\n ...OrgType\n }\n " " orgs {\n ...OrgType\n }\n appSubscribes {" "\n ...AppSubscribeType\n }\n # " " subscribes {\n # status\n # " " startDate\n # endDate\n # " " license\n # appId\n # " " appName\n # org {\n # " " id\n # name\n # " " account\n # isInitial\n # " " logo\n # }\n # " "}\n }\n }\n }\n " } json_r = baseRequest.base_request('post', url, data=data).json() return json_r
def jyls(): url = '{}/data/grid/SummaryOperatingJournal.operation-flow?user_req_id=df8f61f3ax16cd1b6546e'.format( ua) data = { "pageSize": 0, "take": 0, "sort": [], "bindVars": { "v0": "20190801", "v1": "20190831" }, "group": [], "criteriaStr": "id >= :v0 and id <= :v1" } r = baseRequest.base_request('post', url, headers=headers, data=data, timeout=60) return round(r.elapsed.total_seconds(), 2)
def auth(self): url = '{}/mobile/cia/graphql?user_req_id=1566209020090_4'.format( self.url) data = { "query": '\n mutation CreatePassport {\n passport: ' 'createPassportWithAccessToken(accessToken: "%s", domainName: "%s")\n }\n ' % (self.access_token_, self.do.get('orgAccount')), "mutation": '\n mutation CreatePassport {\n passport: ' 'createPassportWithAccessToken(accessToken: "%s", domainName: "%s")\n }\n ' % (self.access_token_, self.do.get('orgAccount')) } headers = {'accesstoken': self.access_token_} json_r = baseRequest.base_request('post', url, data=data, headers=headers).json() passport = json_r.get('data').get('passport') return passport
def a8(): url = '{}/data/grid/StockIn.voucher?user_req_id=df8f71ac8x16cd12ff69c'.format( ua) data = { "pageSize": 50, "take": 50, "skip": 0, "page": 1, "sort": [], "bindVars": {}, "group": [], "criteriaStr": "bizDate >= DATE(20190101) AND bizDate < DATE_ADD(DATE('20191231'),INTERVAL 1 DAY)", "havingStr": "" } r = baseRequest.base_request('post', url, headers=headers, data=data, timeout=60) return round(r.elapsed.total_seconds(), 2)
def a3(): url = '{}/data/grid/GoodsIssue.voucher?user_req_id=df8f71ac8x16cd11c8014'.format( ua) data = { "pageSize": 50, "take": 50, "skip": 0, "page": 1, "sort": [], "bindVars": {}, "group": [], "criteriaStr": "bizDate >= DATE(20190101) AND bizDate < DATE_ADD(DATE('20191231'),INTERVAL 1 DAY) AND SYSDATE() > 0 AND redBlueFlagEnum='BLUE'", "havingStr": "" } r = baseRequest.base_request('post', url, headers=headers, data=data, timeout=70) return round(r.elapsed.total_seconds(), 2)
def login_2(self): url = '{}/mobile/cia/graphql?user_req_id=1566209018073_1'.format( self.host_addr) data = { "query": "\n query getDefaultAccountBook {\n accountBook: getDefaultAccountBook " "{\n isDefault\n tenant{\n id\n " " name\n code\n domainName\n " " createdStamp\n isHidden\n " "disabled\n enterpriseId\n org{\n " " orgId\n orgName\n orgFullName\n " " orgAccount\n }\n }\n " " }\n }\n ", "variables": {} } headers = {'accesstoken': self.access_token_} json_r = baseRequest.base_request('post', url, data=data, headers=headers).json() return json_r
def upload_data(self): imgs = self.img_list random_img = random.choice(imgs) # 随机选取list中一个元素 with open('%s/%s' % (self.img_dir, random_img), 'rb') as f: file = { 'image': ('%s' % random_img, f, 'image/%s' % random_img.split('.')[1]), 'isimage': '1' } file = MultipartEncoder(file) headers = {'Content-Type': file.content_type} headers.update(self.headers) self.logger.info("请求头信息:") self.logger.info("{}".format(headers)) self.logger.info("请求体类型:{}".format(self.body_type)) self.logger.info("请求体内容:{}".format(file)) res = base_request(method=self.method, url=self.url, body_type=self.body_type, body_data=file, headers=headers) return res
def test_api(self, case_data): global GLOBAL_VARS case_id = case_data['case_id'] url = case_data['url'] method = case_data['method'] body_type = case_data['body_type'] self.base_header.update(case_data['headers']) # 动态更新headers body_data = case_data['body_data'] logger.info("============== 开始执行第%d条接口测试用例,请求数据如下 ===============" % case_id) logger.info("请求地址:{}".format(url)) logger.info("请求类型:{}".format(method)) expected_res = case_data['expected_res'] # 单个期望结果 expected_res_list = oe.get_expected_result_list(expected_res) # 多个期望结果 compare_exp = case_data['compare_exp'] is_related = case_data['is_related'] if GLOBAL_VARS and is_related == 1: # is_related=1:需要替换依赖字段 temp_url = [] temp_body_data = [] temp_expected_res = [] temp_compare_exp = [] for key, value in GLOBAL_VARS.items(): if key in url: url = re.sub(key, value, url) # 动态替换url中的依赖数据 temp_url.append(1) if key in str(body_data): body_data = eval(re.sub( key, value, str(body_data))) # 动态替换body_data中的依赖数据 temp_body_data.append(1) if key in str(expected_res): expected_res = re.sub( key, value, expected_res) # 动态替换expected_res中的依赖数据 expected_res_list = oe.get_expected_result_list( expected_res) temp_expected_res.append(1) if compare_exp: if key in str(compare_exp): compare_exp = re.sub(key, value, compare_exp) temp_compare_exp.append(1) if len(temp_url) > 0: logger.info("url动态更新为{}".format(url)) if len(temp_body_data) > 0: logger.info("请求体动态更新为{}".format(body_data)) if len(temp_expected_res) > 0: logger.info("期望结果动态更新为{}".format(expected_res_list)) if len(temp_compare_exp) > 0: logger.info("匹配表达式动态更新为{}".format( [i for i in compare_exp.split('\n')])) # 发起请求 if body_type == 'MULTIPART': iu = ImgUpload(method=method, url=url, body_type=body_type, headers=self.base_header, logger=logger) res = iu.upload_data else: logger.info("请求头信息:") logger.info("{}".format(self.base_header)) logger.info("请求体类型:{}".format(body_type)) if not body_data: msg = "空" else: msg = body_data logger.info("请求体内容:{}".format(msg)) res = base_request(method=method, url=url, body_type=body_type, body_data=body_data, headers=self.base_header) res_text = res.text if r'\u' in res.text: # str存在unicode,将unicode转成中文 try: res_text = res.text.encode('utf-8').decode('unicode_escape') except UnicodeEncodeError: res_text = res.text res_text = r'%s' % res_text # 响应文本 # 响应结果中有空白的(包括" ",\n,\r,\t)替换为空字符,有null的替换为None if res_text: if 'null' in res_text: res_text = res_text.replace('null', 'None') res_r = re.findall(r'\s', res_text) if res_r: res_text = re.sub(r'\s', '', res_text) res_status_code = res.status_code # 响应状态码 res_elapsed_time = round(res.elapsed.total_seconds() * 1000) # 响应时长(毫秒) logger.info("本次请求的响应状态码:{}".format(res_status_code)) logger.info("本次请求的响应时长:{}毫秒".format(res_elapsed_time)) logger.info("本次请求的响应结果:") logger.info(res_text) # 先要判断返回数据中是否有关联字段,如果有,则需要按表达式提取出来并赋值给全局变量 related_exp = case_data['related_exp'] if 'related_exp' in case_data.keys() and related_exp: temp = case_data['related_exp'].split('=') r = re.findall(temp[1], res_text) if r: logger.info("从响应结果中提取依赖数据:{}".format(r[0])) else: logger.info("请检查表达式格式是否正确") GLOBAL_VARS[temp[0]] = r[0] logger.info("global_vars动态更新为:{}".format(GLOBAL_VARS)) # 检查点校验 compare_type = case_data['compare_type'] # 匹配类型,0,1,2 logger.info("本次请求的期望结果与实际结果比对方式为:") if compare_type == 0: logger.info("->全值匹配模式") try: self.assertEqual(expected_res, res_text) oe.write_in_result(case_id + 2, 'PASS') logger.info(Msg.PASS) except AssertionError as e: error_msg = Msg.DEFAULT(case_id, case_data['html_case_name'], e) error_list.append(error_msg) oe.write_in_result(case_id + 2, 'FAIL') logger.exception(Msg.FAIL) raise AssertionError elif compare_type == 1: logger.info("->正则匹配模式") logger.info("本次请求的期望结果:{}".format(expected_res_list)) ce = CompExpUtil(compare_exp, res, res_text, logger) ce_dict = ce.data_dict logger.info("本次请求的实际结果:") logger.info("{}".format(ce_dict)) m = 1 msg = '' try: for exp_res, key_val in zip(expected_res_list, ce_dict.items()): logger.info("----开始比对第%d个检查点%s和%s----" % (m, exp_res, str(key_val[1]))) if key_val[0] == 'status_code': msg = Msg.STATUS_CODE(exp_res, key_val[1]) elif 'isNone->' in key_val[0]: msg = Msg.IS_NONE(exp_res, key_val[1]) elif 'greater->' in key_val[0]: msg = Msg.GREATER(key_val[1], exp_res) self.assertGreater(int(key_val[1]), int(exp_res), msg=msg) m += 1 continue elif 'less->' in key_val[0]: msg = Msg.LESS(key_val[1], exp_res) self.assertLess(int(key_val[1]), int(exp_res), msg=msg) m += 1 continue elif 'len->' in key_val[0]: msg = Msg.LEN(exp_res, key_val[1]) else: msg = Msg.EXP_COMPARE(exp_res, key_val[1]) self.assertEqual(exp_res, str(key_val[1]), msg=msg) m += 1 oe.write_in_result(case_id + 2, 'PASS') logger.info(Msg.PASS) except AssertionError: error_msg = Msg.ASSERT_ERROR(case_id, case_data['html_case_name'], m, msg) error_list.append(error_msg) oe.write_in_result(case_id + 2, 'FAIL') logger.exception(Msg.FAIL) raise AssertionError elif compare_type == 2: logger.info("->响应结果为列表串进行长度校验") logger.info("接口请求的期望结果是:{}".format(expected_res)) try: list_len = len(eval(res_text)) logger.info("响应结果实际长度为%d" % list_len) self.assertEqual(expected_res, list_len) oe.write_in_result(case_id + 2, 'PASS') logger.info(Msg.PASS) except AssertionError as e: error_msg = Msg.DEFAULT(case_id, case_data['html_case_name'], e) error_list.append(error_msg) oe.write_in_result(case_id + 2, 'FAIL') logger.exception(Msg.FAIL) raise AssertionError else: pass logger.info( "====================== 结束第%d条接口测试用例 =======================" % case_id)
""" from common.baseRequest import base_request import time tokens = { 'SCU58060Tcc362d832dee07b390f149a76147a9cb5d5eb24d11c13': 'SONGXIAO', 'SCU58069Tf503b96e8a1f5f3792c24a5407ba73ae5d5f3ede21abc': 'XIAOLI', 'SCU58073T976ac35308b187aacb419f7ef78197985d5f4cd940e4d': 'YUXIN' } def cur_time(): return time.strftime('%Y%m%d_%H点%M分%S秒') def get_name_by_token(token): return tokens[token] data = { 'text': 'Python代码已更新_%s' % cur_time(), 'desp': '脚本已更新,请拉取最新代码进行测试!%s' % cur_time() } r = tuple(map(lambda x: (base_request('get', 'https://sc.ftqq.com/%s.send' % x, data=data).text, x), tokens)) for i in r: if 'success' in i[0]: print('Send To %s Success' % get_name_by_token(i[1])) else: print('Send To %s Fail' % get_name_by_token(i[1]))
def json_res(self): url = self.url + str(self.city_code) res = base_request(method='get', url=url) res = res.json() return res