def xlutils_excel(self, row_value, col_value, value, info=None): rb = xlrd.open_workbook(self.file_path, formatting_info=True) # formatting_info 带格式导入 wb = copy(rb) # 利用xlutils.copy下的copy函数复制 ws = wb.get_sheet(0) # 获取表单0 rs = rb.sheet_by_index(0) # ws.write(0, 0, 'changed!') # 改变(0,0)的值 value_row_col = rs.cell(row_value, col_value).value # 表格原有值 if not value: ws.write(row_value, col_value, value) else: if not value_row_col: ws.write(row_value, col_value, value) # 增加指定列的值 else: ws.write(row_value, col_value, "{};{}".format(value_row_col, value)) # 增加指定列的值 if info: logger.debug("{}:({}, {}, {})".format(info, row_value, col_value, value)) else: logger.debug((row_value, col_value, value)) try: wb.save(self.file_path) # 保存文件 except Exception as msg: logger.error("保存excel文件失败:{}".format(msg))
def __init__(self): self.device_name = None pipeline = os.popen("adb devices") # cmd获取设备名称 adb_version = os.popen( "adb shell getprop ro.build.version.release") # cmd获取Android系统版本 adb_devices = pipeline.read() try: self.device_name = adb_devices.split()[4] except Exception as msg: logger.error("请检查移动设备是否连接正常,异常信息{}".format(msg)) raise # 初始化信息 self.desired_caps = {} self.desired_caps["platformName"] = "Android" self.desired_caps["platformVersion"] = adb_version = adb_version.read() self.desired_caps["deviceName"] = self.device_name self.desired_caps["appPackage"] = "com.yunke.enterprisep" self.desired_caps["appActivity"] = ".module.main.MainActivity" self.desired_caps["unicodeKeyboard"] = True # 隐藏手机中的软键盘 self.desired_caps["resetKeyboard"] = True self.desired_caps["noReset"] = True # desired_caps = {"platformName": "Android", # "platformVersion": adb_version, # "deviceName": self.device_name, # "appPackage": "com.yunke.enterprisep", # "appActivity": ".module.main.MainActivity", # "unicodeKeyboard": True, # "resetKeyboard": True, # "noReset": True # } logger.info("[{}]driver初始化‖platformVersion:{},deviceName:{}".format( os.path.basename(__file__), adb_version, self.device_name))
def test006(self): """视频推荐结果查询接口""" url_T10 = f'{self.base_url}{self.path_code["T10"][0]}' data_T10 = {"userId": self.user_id, "rcmdNum": 10, "pageNum": 1} res_text_T10 = request_post(url_T10, data_T10) try: res_dict_T10 = json.loads(res_text_T10) if res_dict_T10["code"] != 1000: case_message_T10 = { "case_num": "T10", "description": f'{self.path_code["T10"][1]}——接口响应异常', "log": f"{res_text_T10}" } SMS_message.append(case_message_T10) else: if len(res_dict_T10["recommendation"]) == 0: case_message_T10 = { "case_num": "T10", "description": f'{self.path_code["T10"][1]}——推荐列表返回为空', "log": f"{res_text_T10}" } SMS_message.append(case_message_T10) else: pass except Exception as msg: case_message_T10 = { "case_num": "T10", "description": f'{self.path_code["T10"][1]}——服务响应异常', "log": f"{res_text_T10}" } SMS_message.append(case_message_T10) logger.error(f"系统异常记录:{case_message_T10};报错信息:{msg}")
def test005(self): """项目二级栏目推荐结果查询接口""" url_T08 = f'{self.base_url}{self.path_code["T08"][0]}' data_T08 = {"userId": self.user_id} res_text_T08 = request_post(url_T08, data_T08) try: res_dict_T08 = json.loads(res_text_T08) if res_dict_T08["code"] != 1000: case_message_T08 = { "case_num": "T08", "description": f'{self.path_code["T08"][1]}——接口响应异常', "log": f"{res_text_T08}" } SMS_message.append(case_message_T08) else: if len(res_dict_T08["recommendation"]) == 0: case_message_T08 = { "case_num": "T08", "description": f'{self.path_code["T08"][1]}——推荐列表返回为空', "log": f"{res_text_T08}" } SMS_message.append(case_message_T08) else: # 执行T09接口 url_T09 = f'{self.base_url}{self.path_code["T09"][0]}' data_T09 = { "userId": self.user_id, "tabId": res_dict_T08["recommendation"][0]["id"], "rcmdNum": 50, "pageNum": 1 } res_text_T09 = request_post(url_T09, data_T09) res_dict_T09 = json.loads(res_text_T09) if res_dict_T09["code"] != 1000: case_message_T09 = { "case_num": "T07", "description": f'{self.path_code["T09"][1]}——接口响应异常', "log": f"{res_text_T09}" } SMS_message.append(case_message_T09) else: pass # if len(res_dict_T09["recommendation"]) == 0: # case_message_T09 = { # "case_num": "T09", # "description": f'{self.path_code["T09"][1]}——推荐列表返回为空', # "log": f"{res_text_T09}" # } # SMS_message.append(case_message_T09) # else: # pass except Exception as msg: case_message = { "case_num": "T08/T09", "description": 'T08/T09接口——服务响应异常', } SMS_message.append(case_message) logger.error(f"系统异常记录:{case_message};报错信息:{msg}")
def wrapper(*args,**kw): for i in range(n): try: r = func(*args,**kw) return r except Exception as err: logger.error('[{}]用例第{}次失败原因{}'.format(os.path.basename(__file__), i+1, err)) raise Exception
def test002(self): """项目推荐结果查询接口/项目相关项目查询接口""" url_T02 = f'{self.base_url}{self.path_code["T02"][0]}' data_T02 = {"userId": self.user_id, "rcmdNum": 10, "pageNum": 1} res_text_T02 = request_post(url_T02, data_T02) try: res_dict_T02 = json.loads(res_text_T02) if res_dict_T02["code"] != 1000: case_message_T02 = { "case_num": "T02", "description": f'{self.path_code["T02"][1]}——接口响应异常', "log": f"{res_text_T02}" } SMS_message.append(case_message_T02) else: if len(res_dict_T02["recommendation"]) == 0: case_message_T02 = { "case_num": "T02", "description": f'{self.path_code["T02"][1]}——推荐列表返回为空', "log": f"{res_text_T02}" } SMS_message.append(case_message_T02) else: # 执行T06接口 url_T06 = f'{self.base_url}{self.path_code["T06"][0]}' data_T06 = { "projectId": res_dict_T02["recommendation"][0]["id"], "rcmdNum": 3, "pageNum": 1 } res_text_T06 = request_post(url_T06, data_T06) res_dict_T06 = json.loads(res_text_T06) if res_dict_T06["code"] != 1000: case_message_T06 = { "case_num": "T06", "description": f'{self.path_code["T06"][1]}——接口响应异常', "log": f"{res_text_T06}" } SMS_message.append(case_message_T06) else: if len(res_dict_T06["recommendation"]) != 3: case_message_T06 = { "case_num": "T06", "description": f'{self.path_code["T06"][1]}——推荐列表返回为空或不足3条', "log": f"{res_text_T06}" } SMS_message.append(case_message_T06) else: pass except Exception as msg: case_message = { "case_num": "T02/T06", "description": 'T02/T06接口——服务响应异常' } SMS_message.append(case_message) logger.error(f"系统异常记录:{case_message};报错信息:{msg}")
def findId(self, loc): try: el = self._driver.find_element_by_id(loc) except (NoSuchElementException): logger.error('[{}]寻找元素失败, 定位方式为id:{}'.format( os.path.basename(__file__), loc)) raise NoSuchElementException(msg='[{}]寻找元素失败, 定位方式为id:{}'.format( os.path.basename(__file__), loc)) return el
def takeScreenshot(self): rq = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime()) try: self._driver.get_screenshot_as_file( os.path.dirname(os.path.dirname(os.path.dirname(__file__))) + r'\result\screenshots\{}.png'.format(rq)) logger.info("[{}]已截屏并保存{}.png!".format(os.path.basename(__file__), rq)) except Exception as e: logger.error("[{}]无法截屏!{}".format(os.path.basename(__file__), e))
def findAndroidUiautomator(self, text): try: el = self._driver.find_element_by_android_uiautomator( 'new UiSelector().text("{}")'.format(text)) except (NoSuchElementException): logger.error('[{}]寻找元素失败, 定位方式为uiautomator:{}'.format( os.path.basename(__file__), text)) raise NoSuchElementException( msg='[{}]寻找元素失败, 定位方式为uiautomator:{}'.format( os.path.basename(__file__), text)) return el
def get_conn(self): try: conn = pymysql.connect(host=self.host, user=self.user, passwd=self.password, db=self.db, port=self.port, charset='utf8') except pymysql.Error as e: logger.error("Connect database failed.{}".format(e)) conn = False return conn
def sendKeys(self, el, vaule, clear_first=True, click_first=True): try: if click_first: el.click() if clear_first: el.clear() el.send_keys(vaule) except (NoSuchElementException) as e: logger.error("[{}]页面中未能找到元素{}".format(os.path.basename(__file__), e)) raise NoSuchElementException( msg='[{}]页面中未能找到元素{}'.format(os.path.basename(__file__), e))
def connect(self, port=4723): url = 'http://localhost:%s/wd/hub' % str(port) try: driver = webdriver.Remote(url, self.desired_caps) logger.info("[{}]启动接口为:{},手机ID为:{}".format( os.path.basename(__file__), port, self.device_name)) except Exception as msg: logger.error("[{}]appium启动失败,请检查appium服务是否开启;异常原因:{}".format( os.path.basename(__file__), msg)) os.popen("taskkill /f /im adb.exe") raise return driver
def request_post(url, data): header_dict = {'Content-Type': 'application/json'} try: r = requests.post(url=url, headers=header_dict, json=data) # 发送请求 data_str = r.text # logger.debug("###" + data_str) logger.info("请求url:{};请求头:{};请求数据:{};服务器响应:{}".format( url, header_dict, data, data_str)) except Exception as e: data_str = -1 logger.error("请求url:{};请求头:{};请求数据:{};系统异常信息:{}".format( url, header_dict, data, e)) return data_str
def read_excel(self, file_name): if isinstance(file_name, str): # 判断是否是字符串类型 if file_name.endswith('.xls'): # 判断字符串以什么结尾 self.file_path = os.path.dirname(os.path.dirname( __file__)) + '/dataFile/{}'.format(file_name) workbook = xlrd.open_workbook(self.file_path) # 打开一个workbook # 抓取所有sheet页的名称 worksheets = workbook.sheet_names() for worksheet_name in worksheets: worksheet = workbook.sheet_by_name(worksheet_name) # 遍历sheet1中所有行row num_rows = worksheet.nrows # 获取sheet行数 row_demo = [ '用例集编号', '用例标识', '模块名称', '接口名称', '用例描述', '请求url', '请求方式', '请求头部', '用例说明', '前置处理', '请求数据', '匹配规则', '预期结果', '后置处理', '优先级', '是否执行', '被依赖value', '响应数据', '状态码', '执行结果', '执行时间', '备注' ] # 判断模板第二行格式 # print(worksheet.row_values(1)) if worksheet.row_values( 1)[0:22] == row_demo: # 判断sheet1表头是否与预期模板一致 all_row_value = [] for curr_row in range(num_rows - 2): # 获取表格三行以后数据,包括第三行 row_value = worksheet.row_values(curr_row + 2) all_row_value.append( row_value[0:17]) # 将表格0-16列数据转化为列表 logger.debug("{}".format( worksheet.row_values(1))) # 表头 logger.debug("{}".format(all_row_value)) # 表格0-16列数据 return all_row_value # 返回第三列后的所有数据 else: logger.error("用例模板表头格式有误") exit(0) # return "用例模板格式有误" else: logger.error("读取的不是.xls文件") exit(0) else: logger.error("用例文件格式有误") exit(0)
def test001(self): """文章推荐结果查询接口/文章相关文章查询接口/文章相关项目查询接口""" url_T01 = f'{self.base_url}{self.path_code["T01"][0]}' data_T01 = {"userId": self.user_id, "rcmdNum": 10, "pageNum": 1} res_text_T01 = request_post(url_T01, data_T01) try: res_dict_T01 = json.loads(res_text_T01) if res_dict_T01["code"] != 1000: case_message_T01 = { "case_num": "T01", "description": f'{self.path_code["T01"][1]}——————接口响应异常', "log": f"{res_text_T01}" } SMS_message.append(case_message_T01) else: if len(res_dict_T01["recommendation"]) == 0: case_message_T01 = { "case_num": "T01", "description": f'{self.path_code["T01"][1]}——推荐列表返回为空', "log": f"{res_text_T01}" } SMS_message.append(case_message_T01) else: # 执行T05/T07接口 # 执行T05接口 url_T05 = f'{self.base_url}{self.path_code["T05"][0]}' data_T05 = { "articleId": res_dict_T01["recommendation"][0]["id"], "rcmdNum": 3, "pageNum": 1 } res_text_T05 = request_post(url_T05, data_T05) res_dict_T05 = json.loads(res_text_T05) if res_dict_T05["code"] != 1000: case_message_T05 = { "case_num": "T05", "description": f'{self.path_code["T05"][1]}——接口响应异常', "log": f"{res_text_T05}" } SMS_message.append(case_message_T05) else: if len(res_dict_T05["recommendation"]) != 3: case_message_T05 = { "case_num": "T05", "description": f'{self.path_code["T05"][1]}——推荐列表返回为空或不足3条', "log": f"{res_text_T05}" } SMS_message.append(case_message_T05) else: pass # 执行T07接口 url_T07 = f'{self.base_url}{self.path_code["T07"][0]}' data_T07 = { "articleId": res_dict_T01["recommendation"][0]["id"], "rcmdNum": 3, "pageNum": 1 } res_text_T07 = request_post(url_T07, data_T07) res_dict_T07 = json.loads(res_text_T07) if res_dict_T07["code"] != 1000: case_message_T07 = { "case_num": "T07", "description": f'{self.path_code["T07"][1]}——接口响应异常', "log": f"{res_text_T07}" } SMS_message.append(case_message_T07) else: if len(res_dict_T07["recommendation"]) != 3: case_message_T07 = { "case_num": "T07", "description": f'{self.path_code["T07"][1]}——推荐列表返回为空或不足3条', "log": f"{res_text_T07}" } SMS_message.append(case_message_T07) else: pass except Exception as msg: case_message = { "case_num": "T01/T05/T07", "description": 'T01/T05/T07接口——服务响应异常' } SMS_message.append(case_message) logger.error(f"系统异常记录:{case_message};报错信息:{msg}")
suite.addTest(MyTestCase('test004')) suite.addTest(MyTestCase('test005')) suite.addTest(MyTestCase('test006')) runner = unittest.TextTestRunner(verbosity=2) runner.run(suite) if SMS_message: # 存在错误信息发送短信 # for msg in SMS_message: # if message: # message = message + ";{}:{}".format(msg["case_num"], msg["description"]) # else: # message = "【线上接口监控】{}:{}".format(msg["case_num"], msg["description"]) # robot_data = { # "msgtype": "text", # "text": { # "content": SMS_message # } # } robot_data = { "msgtype": "text", "text": { "content": f"【线上接口监控异常消息】{json.dumps(SMS_message).encode('utf-8').decode('unicode_escape')}", "mentioned_mobile_list": ["18637607203"] # "mentioned_mobile_list": ["18637607203", "@all"] } } request_post(robot_url, robot_data) # 发送企业微信信息 logger.error("监控接口异常记录:{}".format(SMS_message)) else: pass