数据工厂系列(26)用例展示-中篇
大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个like呀
回顾
在上篇中,我们已经完成了用例的一些操作(点赞、收藏等),接下来的这篇中,我们需要完成用例的展示以及其他功能
看到上图中,tab页有全部、我创建的、我收藏的、我喜欢的、业务线分组,然后还有搜索功能(根据项目或者场景名称)、同步项目功能
同步项目功能
这里的同步项目跟项目列表的同步项目功能一样,只不过这里项目列表是要获取全部
同理,这里的数据也是用户权限范围的项目数据,相应地crud编写
这里逻辑跟项目列表接口类似,只不过这里需要获取所有的项目数据,并无分页
-
logic引用
-
api引用
- 绑定路由
- 测试结果
动态获取业务线分组
tab页上的业务线分组,其实是动态的,直接获取所有用例的业务线,这里的业务线还是跟之前的项目一样,获取用户权限范围内的业务线...
-
crud编写
-
logic引用
- api引用
- 绑定路由
- 测试结果
模糊搜索用例
这个功能的话,直接用于查询条件中,在输入框中输入用例方法名、用例描述、用例负责人、用例标题即可检索到结果
- crud编写
这里注意的是,搜索范围也是权限范围内的
- logic引用
- api引用
- 绑定路由
- 测试结果
用例展示
前面的接口比较简单,逻辑就此略过,大家后续可看看源码···但是用例展示必须得展开讲讲,我觉得挺费脑的···
先简单说一下需求,用例列表需要分页展示数据,展示该用例是否本人已点赞/收藏过,并且展示点赞/收藏数,还能根据类型进行筛选···这里的逻辑需要关联多个表,由于我们的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查询结果如下
是否点赞/收藏,直接取点赞/收藏中的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查询结果如下:
这里也比较简单,直接主表关联点赞表和收藏表进行统计,统计完后的结果充当一张表,再结合上面的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编写起来还行吧···
先统计各用例的点赞数和收藏数,并作为子表
接着cases主表关联like表、collection表、summary表进行联合查询
各个过滤条件
过滤条件、分页应用
完整代码:
@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引用、绑定路由我暂时不展示了,大家可以看看源码
- 测试结果
总结
用例列表相关的功能已经开发完毕,下篇我们来弄弄用例详情,以及用例的参数组合增删改查···下下篇再弄弄用例执行,日志记录/展示等,下下下篇数据报表的相关,emmmm 应该差不多完了
- 项目地址
转载自:https://juejin.cn/post/7295613501341761555