def run(self):
     """Override of TestCase.run"""
     TestCase.run(self)
     self.create_ami_factory(self.instances)
Esempio n. 2
0
    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]
Esempio n. 3
0
    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]
Esempio n. 4
0
    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()
Esempio n. 5
0
    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()