예제 #1
0
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0}

        if 'team' in data and data['team']:
            filter.setdefault('team', data.get('team'))

        if 'owner' in data and data['owner']:
            filter.setdefault('owner', data.get('owner'))

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = KeywordModel.query.filter_by(**filter) \
            .offset(offset).limit(limit)
        results = query_to_dict(results)
        count = KeywordModel.query.filter_by(**filter).count()
        return count, results
예제 #2
0
    def search(self, data):
        """
        type=team&team=team1
        limit=10&skip=0&type=team
        NOTE: 有两种传参查询方式,需要多data做相应处理
        :param data:
        :return:
        """
        filter = {'enable': 0}

        if 'team' in data and data['team']:
            filter.setdefault('team', data.get('team'))

        if 'owner' in data and data['owner']:
            filter.setdefault('owner', data.get('owner'))

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = TeamModel.query.filter_by(**filter).order_by(
            TeamModel.created.desc()).offset(offset).limit(limit)
        results = query_to_dict(results)
        count = TeamModel.query.filter_by(**filter).count()
        return count, results
예제 #3
0
파일: service.py 프로젝트: yxc0608/clover
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0}

        if 'team' in data and data['team']:
            filter.setdefault('team', data.get('team'))

        if 'project' in data and data['project']:
            filter.setdefault('project', data.get('project'))

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = TaskModel.query.filter_by(**filter).order_by(
            TaskModel.created.desc()).offset(offset).limit(limit)
        results = query_to_dict(results)
        count = TaskModel.query.filter_by(**filter).count()
        return count, results
예제 #4
0
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0}

        # 如果按照id查询则返回唯一的数据或None
        if 'id' in data and data['id']:
            filter.setdefault('id', data.get('id'))
            result = MockModel.query.get(data['id'])
            count = 1 if result else 0
            result = result.to_dict() if result else None
            return count, result

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = MockModel.query.filter_by(**filter).order_by(
            MockModel.created.desc()).offset(offset).limit(limit)

        results = query_to_dict(results)

        count = MockModel.query.filter_by(**filter).count()

        return count, results
예제 #5
0
파일: service.py 프로젝트: 52clover/clover
    def _get_summary(self):
        filter = {'enable': 0}
        summary = dict()
        obj = self._get_subclasses
        if 'TeamModel' in obj:
            # a = obj['TeamModel'].query.filter_by(**filter).count(distinct(obj['TeamModel'].project))
            # print(a)
            # b = db.session.query(func.count(distinct(obj['TeamModel'].project))).scalar()
            # print(b)

            # 后续再研究更改为更优雅的写法(SQL直接查询)
            res = query_to_dict(
                obj['TeamModel'].query.filter_by(**filter).all())
            team = [key['team'] for key in res]
            project = [key['project'] for key in res]
            team_count = len(set(team))
            project_count = len(set(project))
            summary.setdefault('team', team_count)
            summary.setdefault('project', project_count)
        if 'InterfaceModel' in obj:
            interface_count = obj['InterfaceModel'].query.filter_by(
                **filter).count()
            summary.setdefault('interface', interface_count)
        if 'VariableModel' in obj:
            variable_count = obj['VariableModel'].query.filter_by(
                **filter).count()
            summary.setdefault('variable', variable_count)
        if 'KeywordModel' in obj:
            keyword_count = obj['KeywordModel'].query.filter_by(
                **filter).count()
            summary.setdefault('keyword', keyword_count)
        if 'SuiteModel' in obj:
            suite_count = obj['SuiteModel'].query.filter_by(**filter).count()
            summary.setdefault('suite', suite_count)
        return summary
예제 #6
0
파일: keyword.py 프로젝트: 52clover/clover
 def _load_keywords(self, classify):
     """
     :param classify:
     :return:
     """
     filter = {'enable': 0, 'classify': classify}
     keywords = KeywordModel.query.filter_by(**filter).all()
     return query_to_dict(keywords)
예제 #7
0
 def load_default_variable(self):
     """
     :return:
     """
     # 加载通过变量设置页面预置的变量数据。
     filter = {'team': self.team, 'project': self.project}
     default = VariableModel.query.filter_by(**filter).all()
     return query_to_dict(default)
예제 #8
0
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0}

        # 如果按照id查询则返回唯一的数据或None
        if 'id' in data and data['id']:
            filter.setdefault('id', data.get('id'))
            result = InterfaceModel.query.get(data['id'])
            count = 1 if result else 0
            result = result.to_dict() if result else None
            return count, result

        if 'team' in data and data['team']:
            filter.setdefault('team', data.get('team'))

        if 'project' in data and data['project']:
            filter.setdefault('project', data.get('project'))

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        if 'caseName' in data and data['caseName']:
            results = InterfaceModel.query.filter_by(**filter).filter(
                InterfaceModel.name.like('%' + data['caseName'] + '%')
            ).order_by(
                InterfaceModel.created.desc()).offset(offset).limit(limit)
        else:
            results = InterfaceModel.query.filter_by(**filter).order_by(
                InterfaceModel.created.desc()).offset(offset).limit(limit)

        results = query_to_dict(results)

        for result in results:
            if result['status'] == None:
                result['status'] = True

        if 'caseName' in data and data['caseName']:
            count = InterfaceModel.query.filter_by(**filter).filter(
                InterfaceModel.name.like('%' + data['caseName'] +
                                         '%')).count()
        else:
            count = InterfaceModel.query.filter_by(**filter).count()

        return count, results
예제 #9
0
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0}

        # 如果按照id查询则返回唯一的数据或None
        if ('sid' in data and data['sid']) and ('cid' in data and data['cid']):
            filter.setdefault('sid', data.get('sid'))
            filter.setdefault('cid', data.get('cid'))
            result = HistoryModel.query.filter(
                and_(HistoryModel.sid == data['sid'],
                     HistoryModel.cid == data['cid'])).first()
            count = 1 if result else 0
            result = result.to_dict() if result else None
            return count, result

        if 'team' in data and data['team']:
            filter.setdefault('team', data.get('team'))

        if 'project' in data and data['project']:
            filter.setdefault('project', data.get('project'))

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = HistoryModel.query.filter_by(**filter).order_by(
            HistoryModel.created.desc()).offset(offset).limit(limit)

        results = query_to_dict(results)
        count = HistoryModel.query.filter_by(**filter).count()

        return count, results
예제 #10
0
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0, **data}

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = DashboardModel.query.filter_by(**filter).order_by(
            DashboardModel.created.desc()).offset(offset).limit(limit)
        results = query_to_dict(results)
        count = DashboardModel.query.filter_by(**filter).count()
        return count, results
예제 #11
0
    def search(self, data):
        """
        :param data:
        :return:
        """
        filter = {'enable': 0}

        if 'team' in data and data['team']:
            filter.setdefault('team', data.get('team'))

        if 'project' in data and data['project']:
            filter.setdefault('project', data.get('project'))

        try:
            offset = int(data.get('offset', 0))
        except TypeError:
            offset = 0

        try:
            limit = int(data.get('limit', 10))
        except TypeError:
            limit = 10

        results = SuiteModel.query.filter_by(**filter).order_by(
            SuiteModel.created.desc()).offset(offset).limit(limit)

        results = query_to_dict(results)

        # 禁用功能兼容1.0版本,历史数据为null
        for result in results:
            if result['status'] == None:
                result['status'] = True

        count = SuiteModel.query.filter_by(**filter).count()

        return count, results
예제 #12
0
파일: executor.py 프로젝트: yxc0608/clover
class Executor():
    def __init__(self, type='trigger', log='default'):
        self.variables = []
        self.status = 0
        self.message = 'ok'
        self.type = type
        self.start = 0
        self.end = 0
        self.result = {}  # 记录运行状态与相关数据。
        self.interface = {
            'verify': 0,
            'passed': 0,
            'failed': 0,
            'error': 0,
            'sikped': 0,
            'total': 0,
            'percent': 0.0,
        }

        file = os.path.join(os.getcwd(), 'logs', '{}.log'.format(log))
        self.logger = logging.getLogger(__name__)
        self.logger.setLevel(logging.DEBUG)
        handler = logging.FileHandler(file)
        handler.setLevel(logging.DEBUG)
        formatter = logging.Formatter(
            '%(asctime)s - %(filename)s - %(funcName)s - %(lineno)d - %(message)s'
        )
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

    def replace_variable(self, case, data):
        """
        # 这里对请求数据进行变量替换,将变量替换为具体值。
        # 变量和其值可以在"配置管理 -> 全局变量"里设置。
        # 目前支持host,header与param的变量替换。
        # 变量与值存储使用团队与项目进行区分,不同的团队与项目允许出现同名变量。
        :param case:
        :param data:
        :return:
        """
        self.logger.info("[{}]接口测试第1步,变量替换".format(case['name']))
        filter = {'team': case.get('team'), 'project': case.get('project')}
        results = VariableModel.query.filter_by(**filter).all()

        self.logger.info("查找预定义变量,查找条件[{}]".format(filter))

        variable = {
            'extract': self.variables,
            'trigger': data.get('variables', []),
            'default': query_to_dict(results),
        }

        self.logger.info("变量查找成功,预定义变量{}".format(variable['default']))
        self.logger.info("变量查找成功,触发时变量{}".format(variable['trigger']))
        self.logger.info("变量查找成功,运行时变量{}".format(variable['extract']))

        self.logger.info("域名替换前[{}]".format(case.get('host')))
        case['host'] = derivation(case.get('host'), variable)
        self.logger.info("域名替换后[{}]".format(case.get('host')))

        self.logger.info("路径替换前[{}]".format(case.get('path')))
        case['path'] = derivation(case.get('path'), variable)
        self.logger.info("路径替换后[{}]".format(case.get('path')))

        if 'header' in case:
            self.logger.info("请求头替换前[{}]".format(case.get('header')))
            for header in case['header']:
                header['value'] = derivation(header['value'], variable)
            self.logger.info("请求头换后[{}]".format(case.get('header')))

        if 'params' in case:
            self.logger.info("请求参数替换前[{}]".format(case.get('params')))
            for param in case['params']:
                param['value'] = derivation(param['value'], variable)
            self.logger.info("请求参数换后[{}]".format(case.get('params')))

        if 'body' in case:
            self.logger.info("请求体替换前[{}]".format(case.get('body')))
            if case['body']['mode'] in ['formdata', 'urlencoded']:
                for param in case['body']['data']:
                    param['value'] = derivation(param['value'], variable)
            elif case['body']['mode'] in ['file']:
                pass
            else:
                """
                # 这是"expected string or bytes-like object"问题的一个临时解决方案。
                # 原因是当body数据类型为raw,数据为json时,view层接收数据时自动将其转为
                # python对象,因此这里进行derivation会报错。
                """
                if isinstance(case['body']['data'], (list, )):
                    for param in case['body']['data']:
                        param['value'] = derivation(param['value'], variable)
                else:
                    case['body']['data'] = derivation(case['body']['data'],
                                                      variable)