likes
comments
collection
share

数据工厂系列(26)用例展示-中篇

作者站长头像
站长
· 阅读数 48

大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个like

回顾

在上篇中,我们已经完成了用例的一些操作(点赞、收藏等),接下来的这篇中,我们需要完成用例的展示以及其他功能

数据工厂系列(26)用例展示-中篇 看到上图中,tab页有全部、我创建的、我收藏的、我喜欢的、业务线分组,然后还有搜索功能(根据项目或者场景名称)、同步项目功能

同步项目功能

这里的同步项目跟项目列表的同步项目功能一样,只不过这里项目列表是要获取全部

数据工厂系列(26)用例展示-中篇 同理,这里的数据也是用户权限范围的项目数据,相应地crud编写

数据工厂系列(26)用例展示-中篇 这里逻辑跟项目列表接口类似,只不过这里需要获取所有的项目数据,并无分页

  • logic引用 数据工厂系列(26)用例展示-中篇

  • api引用

数据工厂系列(26)用例展示-中篇

  • 绑定路由

数据工厂系列(26)用例展示-中篇

  • 测试结果

数据工厂系列(26)用例展示-中篇

动态获取业务线分组

tab页上的业务线分组,其实是动态的,直接获取所有用例的业务线,这里的业务线还是跟之前的项目一样,获取用户权限范围内的业务线...

  • crud编写 数据工厂系列(26)用例展示-中篇

  • logic引用

数据工厂系列(26)用例展示-中篇

  • api引用

数据工厂系列(26)用例展示-中篇

  • 绑定路由

数据工厂系列(26)用例展示-中篇

  • 测试结果

数据工厂系列(26)用例展示-中篇

模糊搜索用例

这个功能的话,直接用于查询条件中,在输入框中输入用例方法名、用例描述、用例负责人、用例标题即可检索到结果

  • crud编写

这里注意的是,搜索范围也是权限范围内的 数据工厂系列(26)用例展示-中篇

  • logic引用

数据工厂系列(26)用例展示-中篇

  • api引用

数据工厂系列(26)用例展示-中篇

  • 绑定路由

数据工厂系列(26)用例展示-中篇

  • 测试结果

数据工厂系列(26)用例展示-中篇

用例展示

前面的接口比较简单,逻辑就此略过,大家后续可看看源码···但是用例展示必须得展开讲讲,我觉得挺费脑的···

先简单说一下需求,用例列表需要分页展示数据,展示该用例是否本人已点赞/收藏过,并且展示点赞/收藏数,还能根据类型进行筛选···这里的逻辑需要关联多个表,由于我们的basecrud只支持单表,所以我们只能硬啃下去···

  • 原生sql编写

我们先试着拿原生sql进行编写,先拿主表关联点赞表和收藏表进行查询,先来尝试一下原生sql进行查询···

SELECT
	a.id,
	a.title,
	a.project_id,
	a.description,
	a.group_name,
	a.`owner`,
	a.update_time,
	CASE WHEN b.del_flag = 0 THEN 1 ELSE 0 END AS `like`,
	CASE WHEN c.del_flag = 0 THEN 1 ELSE 0 END AS `collection`
FROM
	data_factory_cases a
	LEFT JOIN data_factory_cases_like b ON a.id = b.cases_id 
	AND b.del_flag = 0 
	AND b.create_id = 1
	LEFT JOIN data_factory_cases_collection c ON a.id = c.cases_id 
	AND c.del_flag = 0 
	AND c.create_id = 1
	WHERE a.del_flag = 0

sql查询结果如下

数据工厂系列(26)用例展示-中篇

是否点赞/收藏,直接取点赞/收藏中的del_flag字段,直接用case when,如果不是0,那就是都为未点赞/收藏,其余比较的简单,大家可以看看sql,主要用到的还是左连接进行多表查询,过滤条件的话,目前就只有del_flag = 0,后面可加上业务线、项目id、用例id... 那用例的点赞数/收藏数怎么弄呢?

我们先来统计各个用例的点赞数和收藏数

SELECT
	a.id,
	COUNT(DISTINCT(b.id)) AS like_num,
	COUNT(DISTINCT(c.id)) AS collection_num
FROM
	data_factory_cases a
	LEFT JOIN data_factory_cases_like b ON a.id = b.cases_id AND b.del_flag = 0
	LEFT JOIN data_factory_cases_collection c ON a.id = c.cases_id AND c.del_flag = 0
	WHERE a.del_flag = 0
	GROUP BY a.id

sql查询结果如下:

数据工厂系列(26)用例展示-中篇

这里也比较简单,直接主表关联点赞表和收藏表进行统计,统计完后的结果充当一张表,再结合上面的sql进行关联查询,完整sql如下

SELECT
	a.id,
	a.title,
	a.project_id,
	a.description,
	a.group_name,
	a.`owner`,
	a.update_time,
CASE
		
		WHEN b.del_flag = 0 THEN
		1 ELSE 0 
	END AS `like`,
	d.like_num,
CASE
		
		WHEN c.del_flag = 0 THEN
		1 ELSE 0 
	END AS `collection`,
	d.collection_num 
FROM
	data_factory_cases a
	LEFT JOIN data_factory_cases_like b ON a.id = b.cases_id 
	AND b.del_flag = 0 
	AND b.create_id = 1
	LEFT JOIN data_factory_cases_collection c ON a.id = c.cases_id 
	AND c.del_flag = 0 
	AND c.create_id = 1
	LEFT JOIN (
	SELECT
		a.id,
		COUNT(
		DISTINCT ( b.id )) AS like_num,
		COUNT(
		DISTINCT ( c.id )) AS collection_num 
	FROM
		data_factory_cases a
		LEFT JOIN data_factory_cases_like b ON a.id = b.cases_id 
		AND b.del_flag = 0
		LEFT JOIN data_factory_cases_collection c ON a.id = c.cases_id 
		AND c.del_flag = 0 
	WHERE
		a.del_flag = 0 
	GROUP BY
		a.id 
	) d ON a.id = d.id 
WHERE
	a.del_flag = 0
  • sqlalchemy编写

看着上面的sql比较复杂,其实用sqlalchemy编写起来还行吧···

先统计各用例的点赞数和收藏数,并作为子表

数据工厂系列(26)用例展示-中篇

接着cases主表关联like表、collection表、summary表进行联合查询

数据工厂系列(26)用例展示-中篇

各个过滤条件

数据工厂系列(26)用例展示-中篇

过滤条件、分页应用 数据工厂系列(26)用例展示-中篇

完整代码:

    @classmethod
    def get_all_cases(cls, user: dict, page: int = 1, limit: int = 10, show: str = None, project_id: int = None, case_id: int = None):
        """
        用例列表展示
        :param user: 用户数据
        :param page: 页码
        :param limit: 页码大小
        :param show: 筛选类型
        :param project_id: 项目id
        :param case_id: 用例id
        :return:
        """
        with Session() as session:
            # 别名
            like_ = aliased(DataFactoryCasesLike)
            collection_ = aliased(DataFactoryCasesCollection)

            # 只取未删除的数据
            filter_list = [DataFactoryCases.del_flag == DeleteEnum.no.value]
            # 如果like_表中 del_flag字段标识为0则为已点赞=True,其余情况为未点赞=False
            is_like = case_([(like_.del_flag == DeleteEnum.no.value, True)], else_=False).label("like")
            # 如果collection_表中 del_flag字段标识为0则为已收藏=True,其余情况为未收藏=False
            is_collection = case_([(collection_.del_flag == DeleteEnum.no.value, True)], else_=False).label("collection")

            # 子表-统计各造数场景点赞数和收藏数, 子查询(subquery)
            summary = session.query(DataFactoryCases.id.label("cases_id"),
                                    func.count(distinct(like_.id)).label("like_num"),
                                    func.count(distinct(collection_.id)).label("collection_num")). \
                outerjoin(like_, and_(DataFactoryCases.id == like_.cases_id,
                                     like_.del_flag == 0)). \
                outerjoin(collection_, and_(DataFactoryCases.id == collection_.cases_id,
                                           collection_.del_flag == 0)).group_by(DataFactoryCases.id).subquery()

            # 为null的数据默认为0
            like_num = func.ifnull(summary.c.like_num, 0).label("like_num")
            collection_num = func.ifnull(summary.c.collection_num, 0).label("collection_num")

            # 用户有效的项目id
            filter_list.extend(cls.project_ids(user))
            # 根据项目id查询
            if project_id:
                filter_list.append(DataFactoryCases.project_id == project_id)
            # 根据case id查询
            if case_id:
                filter_list.append(DataFactoryCases.id == case_id)

            if show:
                if show in ShowEnum.get_member_values():
                    # 获取我创建的
                    if show == ShowEnum.my.value:
                        filter_list.append(DataFactoryCases.owner == user['username'])
                    # 获取我的喜欢
                    elif show == ShowEnum.like.value:
                        my_like = [like_.create_id == user['id'], like_.del_flag == 0]
                        filter_list.extend(my_like)
                    # 获取我的收藏
                    elif show == ShowEnum.collection.value:
                        my_collection = [collection_.create_id == user['id'], collection_.del_flag == 0]
                        filter_list.extend(my_collection)
                    elif show == ShowEnum.all.value:
                        pass
                    else:
                        raise BusinessException("类型有误!!!")
                else:
                    # 业务线分组
                    filter_list.append(DataFactoryCases.group_name == show)

            # cases主表关联like表、collection表、summary表
            case = session.query(like_num, collection_num, DataFactoryCases.project_id, DataFactoryCases.id,
                                 DataFactoryCases.title, DataFactoryCases.group_name, DataFactoryCases.description,
                                 DataFactoryCases.owner, is_like, is_collection, DataFactoryCases.update_time). \
                outerjoin(like_, and_(DataFactoryCases.id == like_.cases_id,
                                     like_.del_flag == 0,
                                     like_.create_id == user['id'])). \
                outerjoin(collection_, and_(DataFactoryCases.id == collection_.cases_id,
                                           collection_.del_flag == 0,
                                           collection_.create_id == user['id'])). \
                outerjoin(summary, DataFactoryCases.id == summary.c.cases_id)

            # 过滤条件
            case = case.filter(*filter_list)
            # 分页
            case_infos = case.order_by(asc(DataFactoryCases.id)).limit(limit).offset((page - 1) * limit).all()
            count = case.count()
            return case_infos, count

logic引用、api引用、绑定路由我暂时不展示了,大家可以看看源码

  • 测试结果

数据工厂系列(26)用例展示-中篇

总结

用例列表相关的功能已经开发完毕,下篇我们来弄弄用例详情,以及用例的参数组合增删改查···下下篇再弄弄用例执行,日志记录/展示等,下下下篇数据报表的相关,emmmm 应该差不多完了

转载自:https://juejin.cn/post/7295613501341761555
评论
请登录