def run(self): """Override of TestCase.run""" TestCase.run(self) self.create_ami_factory(self.instances)
def run(self, debug): try: # 获取开始运行时间 timestamp_for_start = time.time() start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) logger.info('计划运行的浏览器有:%s' % (self.broswers)) logger.info('正在查询测试计划关联的测试用例') query = 'SELECT node_id, node_path, node_name FROM `website_ui_case_tree_test_plan` WHERE plan_id = %s AND sub_node_num = 0 ORDER BY `order` ASC' data = (self.plan_id, ) result = test_platform_db.select_many_record(query, data) if result[0] and result[1]: records = result[1] browser_list_for_failure = [] mark = False # 用于标记是否有运行用例出错的浏览器 host_port = re.findall( '[https|http]+://[^/]+', self.home_page ) # 获取http地址 形如 http://www.baidu.com, http://www.baidu.com:8080 if host_port: host_port = host_port[0] else: return [False, '项目主页填写错误'] for browser in self.broswers: execution_num = str(int(time.time())) # 执行编号 if not debug: data = (execution_num, self.project_id, self.plan_id, self.project_name, self.plan_name, browser, start_time, '', '', 0, 0, 0, 0, '') logger.info('正在往测试报告-测试概况插入计划执行概要记录') test_reporter.insert_report_for_summary(data) logger.info('正在获取浏览器驱动') result = selenium_util.set_driver(browser) if not result[0] and not debug: # 设置驱动出错 logger.error('获取浏览器驱动出错,跳过该浏览器的执行') data = ('', '', 0, 0, 0, 0, result[1], execution_num, self.plan_id) test_reporter.update_report_for_summary(data) continue try: browser_driver = selenium_util.get_driver() selenium_util.maximize_window() logger.info('正在打开项目主页:%s' % self.home_page) selenium_util.get(self.home_page) selenium_util.implicitly_wait(20) flag = False # 用于标记是在每个浏览器下运行时,是否出现了运行出错的用例 logger.info( '======================正在【%s】浏览器下运行测试用例======================' % browser) for record in records: case_id, case_path, case_name = record test_case = TestCase(execution_num, self.plan_id, case_id, case_path, case_name, host_port) logger.info( '======================开始运行测试用例[名称:%s, ID:%s]======================' % (case_name, case_id)) result = test_case.run(debug) if not result[0]: flag = True # 有运行出错的用例 if flag: mark = True remark = '部分用例运行出错' browser_list_for_failure.append(browser) else: remark = '' except Exception as e: logger.error('运行出错:%s' % e) remark = '%s' % e mark = True finally: browser_driver.close() browser_driver.quit() if not debug: end_time = time.strftime( '%Y-%m-%d %H:%M:%S', time.localtime()) # 结束运行时间 # 记录运行截止时间 timestamp_for_end = time.time() time_took = int(timestamp_for_end - timestamp_for_start) logger.info('测试用例执行完毕,正在更新测试报告-测试概况表') days, hours, minutes, seconds = str( time_took // 86400), str((time_took % 86400) // 3600), str( ((time_took % 86400) % 3600) // 60), str( ((time_took % 86400) % 3600) % 60) time_took = days + '天 ' + hours + '小时 ' + minutes + '分 ' + seconds + '秒' # 运行耗时 case_pass_num = test_reporter.get_case_num_by_run_result( execution_num, self.plan_id, '成功') # 运行成功用例数 case_fail_num = test_reporter.get_case_num_by_run_result( execution_num, self.plan_id, '失败') # 运行失败用例数 case_block_num = test_reporter.get_case_num_by_run_result( execution_num, self.plan_id, '阻塞') # 运行被阻塞用例数 case_total_num = case_block_num + case_fail_num + case_pass_num data = (end_time, time_took, case_total_num, case_pass_num, case_fail_num, case_block_num, remark, execution_num, self.plan_id) test_reporter.update_report_for_summary(data) if mark: return [ False, '测试计划在浏览器%s下运行失败' % str(browser_list_for_failure) ] else: return [True, '执行成功'] elif result[0] and not result[1]: reason = '未查找到同测试计划关联的用例' logger.warn(reason) return [False, reason] else: reason = '查找同测试计划[名称:%s, ID:%s]关联的用例失败:%s' % ( self.plan_name, self.plan_id, result[1]) logger.error(reason) return [False, reason] except Exception as e: logger.error('%s' % e) return [False, '%s' % e]
def run(self, debug): try: # 获取开始运行时间 timestamp_for_start = time.time() start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) logger.info('正在查询测试计划关联的测试用例') query = 'SELECT node_id, node_path, node_name FROM `website_api_case_tree_test_plan` WHERE plan_id = %s AND sub_node_num = 0 ORDER BY `order` ASC' data = (self.plan_id, ) result = test_platform_db.select_many_record(query, data) if result[0] and result[1]: records = result[1] execution_num = str(int(time.time())) # 执行编号 if not debug: data = (execution_num, self.project_id, self.plan_id, self.project_name, self.plan_name, start_time, '', '', 0, 0, 0, 0, '') logger.info('正在往测试报告-测试概况插入计划执行概要记录') test_reporter.insert_report_for_summary(data) flag = False remark = '' for record in records: plan_id = self.plan_id case_id, case_path, case_name = record test_case = TestCase(execution_num, plan_id, case_id, case_path, case_name, self.protocol, self.host, self.port, self.global_headers) logger.info( '======================开始运行测试用例[名称:%s, ID:%s]======================' % (case_name, case_id)) result = test_case.run(debug) if not result[0]: flag = True # 有运行出错的用例 remark = '存在运行失败、被阻塞的用例' if not debug: end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # 结束运行时间 # 记录运行截止时间 timestamp_for_end = time.time() logger.info('测试用例执行完毕,正在更新测试报告-测试概况表') time_took = int(timestamp_for_end - timestamp_for_start) days, hours, minutes, seconds = str( time_took // 86400), str( (time_took % 86400) // 3600), str( ((time_took % 86400) % 3600) // 60), str( ((time_took % 86400) % 3600) % 60) time_took = days + '天 ' + hours + '小时 ' + minutes + '分 ' + seconds + '秒' # 运行耗时 case_pass_num = test_reporter.get_case_num_by_run_result( execution_num, self.plan_id, '成功') # 运行成功用例数 case_fail_num = test_reporter.get_case_num_by_run_result( execution_num, self.plan_id, '失败') # 运行失败用例数 case_block_num = test_reporter.get_case_num_by_run_result( execution_num, self.plan_id, '阻塞') # 运行被阻塞用例数 case_total_num = case_block_num + case_fail_num + case_pass_num data = (end_time, time_took, case_total_num, case_pass_num, case_fail_num, case_block_num, remark, execution_num, self.plan_id) test_reporter.update_report_for_summary(data) if flag: return [False, '存在运行失败、被阻塞的用例'] else: return [True, '执行成功'] elif result[0] and not result[1]: reason = '未查找到同测试计划关联的用例' logger.warn(reason) return [False, reason] else: reason = '查找同测试计划[名称:%s, ID:%s]关联的用例失败:%s' % ( self.plan_name, self.plan_id, result[1]) logger.error(reason) return [False, reason] except Exception as e: logger.error('%s' % e) return [False, '%s' % e]
def run(self, project_id, id): try: logger.info('正在查询项目[ID:%s]相关信息' % project_id) result = test_platform_db.select_one_record( 'SELECT protocol, host, port, environment_id, valid_flag ' 'FROM `website_api_project_setting` WHERE id = %s', (project_id, )) if result[0] and result[1]: protocol, host, port, environment_id, valid_flag = result[1] logger.info('正在查询与项目关联的数据库信息') result = test_platform_db.select_many_record( "SELECT db_type, db_alias, db_name, db_host, db_port, db_user, db_passwd " "FROM `website_database_setting` " "WHERE locate('API%s', project_id) != 0 AND environment_id= '%s'" % (project_id, environment_id)) if result[0] and result[1]: for record in result[1]: db_type, db_alias, db_name, db_host, db_port, db_user, db_passwd = record if db_type == 'MySQL': mydb = MyDB(db_name=db_name, db_host=db_host, port=db_port, user=db_user, password=db_passwd, charset='utf8') db_related_to_project_dic[db_alias] = mydb elif db_type == 'Redis': if not db_passwd.strip(): db_passwd = None if db_name.strip() == '': db_name = '0' myredis = RedisClient(host=db_host, port=db_port, password=db_passwd, db=db_name, charset='utf-8') redis_related_to_project_dic[db_alias] = myredis elif not result[0]: logger.error('查询项目相关的数据库配置信息出错:%s' % result[1]) return [False, result[1]] logger.info('正在查询与项目关联的全局变量') result = test_platform_db.select_many_record( "SELECT `name`, `value` " "FROM `website_global_variable_setting` " "WHERE project_type='API项目' AND locate('%s', project_id) != 0 AND locate('%s', env_id) != 0 " % (project_id, environment_id)) if result[0] and result[1]: for record in result[1]: name, value = record name = name global_variable_dic[name] = value elif not result[0]: logger.error('查询项目相关的全局变量配置信息出错:%s' % result[1]) return [False, result[1]] try: if 'global_headers' in global_variable_dic.keys(): global_headers = global_variable_dic['global_headers'] # 防止用户输入了中文冒号,替换为英文冒号,不然经过global_headers.encode("utf-8").decode("latin1")这样编码转换, # 会把"key":中的中文冒号解码为非英文冒号,导致执行json loads函数时会报错; # 另外,请求头从数据库读取,可能涉及到换行符,需要去掉 global_headers = global_headers.replace(':', ':').replace( '\t', '') global_headers = json.loads( global_headers, object_pairs_hook=OrderedDict) else: global_headers = {} except Exception as e: logger.error('%s' % e) return [False, '%s' % e] logger.info('正在查询输入ID标识的用例(套件)相关信息') query = 'SELECT id, text FROM `website_api_case_tree` WHERE project_id = %s AND id = %s' % ( project_id, id) result = test_platform_db.select_one_record(query) if result[0] and result[1]: record = result[1] case_id, case_name = record execution_num = str(int(time.time())) # 执行编号 query = 'SELECT id, text FROM `website_api_case_tree` WHERE project_id = %s AND parent_id = %s ' \ 'AND id NOT IN (SELECT parent_id FROM `website_api_case_tree` WHERE project_id=%s)' \ 'ORDER BY `order` ASC' % (project_id, id, project_id) result = test_platform_db.select_many_record(query) if result[0] and result[1]: logger.info('输入ID标识的是测试套件') records = result[1] for record in records: case_id, case_name = record test_case = TestCase(execution_num, 0, case_id, '--', case_name, protocol, host, port, global_headers) logger.info( '======================开始运行测试用例[名称:%s, ID:%s]======================' % (case_name, case_id)) result = test_case.run(True) if not result[0]: return [ False, '用例(ID:%s 名称:%s)运行出错:%s' % (case_id, case_name, result[2]) ] elif result[0] and not result[1]: logger.info('输入ID标识的是测试用例,开始执行用例') test_case = TestCase(execution_num, 0, case_id, '--', case_name, protocol, host, port, global_headers) logger.info( '======================开始运行测试用例[名称:%s, ID:%s]======================' % (case_name, case_id)) result = test_case.run(True) if not result[0]: return [ False, '用例(ID:%s 名称:%s)运行出错:%s' % (case_id, case_name, result[2]) ] else: logger.error('查询出错:%s' % result[1]) return [False, result[1]] elif result[0] and not result[1]: reason = '未查找到相关信息,请检查配置的项目ID(%s),用例(套件)标识ID(%s)是否正确' logger.warn(reason) return [False, reason] else: logger.error('查找相关信息失败:%s' % result[1]) return [False, '查找相关信息失败:%s' % result[1]] elif result[0] and not result[1]: logger.error('未查询到项目相关的信息') return [False, '未查询到项目相关的信息'] else: logger.error('查询项目相关信息失败:%s' % result[1]) return [False, '查询项目相关信息失败:%s' % result[1]] except Exception as e: logger.error('%s' % e) return [False, '%s' % e] finally: logger.info('正在释放资源') logger.info('正在断开与项目关联的数据库连接') # 关闭数据库 for key, db in db_related_to_project_dic.copy().items(): db.close() del db_related_to_project_dic[key] logger.info('正在清理与项目关联的全局变量') global_variable_dic.clear()
def run(self, project_id, id, browser): try: logger.info('正在查询项目[ID:%s]相关信息' % project_id) result = test_platform_db.select_one_record( 'SELECT home_page, environment_id, valid_flag ' 'FROM `website_ui_project_setting` WHERE id = %s', (project_id, )) if result[0] and result[1]: home_page, environment_id, valid_flag = result[1] logger.info('正在查询与项目关联的数据库信息') result = test_platform_db.select_many_record( "SELECT db_type, db_alias, db_name, db_host, db_port, db_user, db_passwd " "FROM `website_database_setting` " "WHERE locate('UI%s', project_id) != 0 AND environment_id= '%s'" % (project_id, environment_id)) if result[0] and result[1]: for record in result[1]: db_type, db_alias, db_name, db_host, db_port, db_user, db_passwd = record if db_type == 'MySQL': mydb = MyDB(db_name=db_name, db_host=db_host, port=db_port, user=db_user, password=db_passwd, charset='utf8') db_related_to_project_dic[db_alias] = mydb elif not result[0]: logger.error('查询项目相关的数据库配置信息出错:%s' % result[1]) return [False, result[1]] logger.info('正在查询与项目关联的全局变量') result = test_platform_db.select_many_record( "SELECT `name`, `value` " "FROM `website_global_variable_setting` " "WHERE project_type='UI项目' AND locate('%s', project_id) != 0 AND locate('%s', env_id) != 0 " % (self.project_id, environment_id)) if result[0] and result[1]: for record in result[1]: name, value = record name = name global_variable_dic[name] = value elif not result[0]: logger.error('查询项目相关的全局变量配置信息出错:%s' % result[1]) return [False, result[1]] host_port = re.findall( '[https|http]+://[^/]+', home_page ) # 获取http地址 形如 http://www.baidu.com, http://www.baidu.com:8080 if host_port: host_port = host_port[0] else: return [False, '项目主页填写错误'] logger.info('正在查询输入ID标识的用例(套件)相关信息') query = 'SELECT id, text FROM `website_ui_case_tree` WHERE project_id = %s AND id = %s' % ( project_id, id) result = test_platform_db.select_one_record(query) logger.info('正在获取浏览器驱动') result_get = selenium_util.set_driver(browser) if not result_get[0]: logger.error('获取浏览器驱动出错,退出') exit() browser_driver = selenium_util.get_driver() logger.info('正在打开项目主页:%s' % home_page) selenium_util.maximize_window() selenium_util.get(home_page) selenium_util.implicitly_wait(20) try: if result[0] and result[1]: record = result[1] case_id, case_name = record execution_num = str(int(time.time())) # 执行编号 query = 'SELECT id, text FROM `website_ui_case_tree` WHERE project_id = %s AND parent_id = %s ' \ 'AND id NOT IN (SELECT parent_id FROM `website_ui_case_tree` WHERE project_id=%s)' \ 'ORDER BY `order` ASC' % (project_id, id, project_id) result = test_platform_db.select_many_record(query) if result[0] and result[1]: logger.info('输入ID标识的是测试套件') records = result[1] for record in records: case_id, case_name = record test_case = TestCase(execution_num, 0, case_id, '--', case_name, host_port) logger.info( '======================开始运行测试用例[名称:%s, ID:%s]======================' % (case_name, case_id)) result = test_case.run(True) if not result[0]: return [ False, '用例(ID:%s 名称:%s)运行出错:%s' % (case_id, case_name, result[2]) ] elif result[0] and not result[1]: logger.info('输入ID标识的是测试用例,开始执行用例') test_case = TestCase(execution_num, 0, case_id, '--', case_name, host_port) logger.info( '======================开始运行测试用例[名称:%s, ID:%s]======================' % (case_name, case_id)) result = test_case.run(True) if not result[0]: return [ False, '用例(ID:%s 名称:%s)运行出错:%s' % (case_id, case_name, result[2]) ] else: logger.error('查询出错:%s' % result[1]) return [False, result[1]] elif result[0] and not result[1]: reason = '未查找到相关信息,请检查配置的项目ID(%s),用例(套件)标识ID(%s)是否正确' logger.warn(reason) return [False, reason] else: logger.error('查找相关信息失败:%s' % result[1]) return [False, '查找相关信息失败:%s' % result[1]] except Exception as e: logger.error('运行出错:%s' % e) finally: browser_driver.quit() elif result[0] and not result[1]: logger.error('未查询到项目相关的信息') return [False, '未查询到项目相关的信息'] else: logger.error('查询项目相关信息失败:%s' % result[1]) return [False, '查询项目相关信息失败:%s' % result[1]] except Exception as e: logger.error('%s' % e) return [False, '%s' % e] finally: logger.info('正在释放资源') logger.info('正在断开与项目关联的数据库连接') # 关闭数据库 for key, db in db_related_to_project_dic.copy().items(): db.close() del db_related_to_project_dic[key] logger.info('正在清理与项目关联的全局变量') global_variable_dic.clear()