测试平台系列(19) 编写项目的增删改查接口和页面(1)

简介: 编写项目的增删改查接口和页面(1)

开篇闲聊


昨天在JD买了个跳绳的玩意,打算后面好好锻炼下身体。平时久坐又加上不怎么运动,导致各种小毛病还是挺多的,建议大家也在学习之余,多放松下身体。比如像某榜一大哥带妹跑步,带妹羽毛球,都是很不错的锻炼方式。对于我这种懒人,就买根绳子跳一跳吧,不然可能上个6楼都得喘气了!

回顾


上一节咱们定制好了简单的权限系统,也设计了相关的表概念。但是表只有对应的model,并没有编写实际的操作接口,所以今天我们来完善他们!

上次我们编写的TestCase表存在一点问题,首先是没有params字段,也没有body字段,当然可能还缺少很多字段,我们可以在后续的开发过程中陆续补充

在dao/init.py加入新创建的表

1.jpg

image

修改TestCase表

2.jpg

加入params和body字段

编写项目和项目角色的增删改查接口

首先咱们明确一个要求,因为项目有公有和私有的概念,所以对于用户能看到的项目应该是这样的逻辑:

  • 普通用户
    能看到公有项目私有项目(用户在该成员中,成员或创建者)
  • 管理员
    能看到所有项目
    由于我们需要通过用户id拿到对应所属的project,所以我们先编写project_role相关接口

3.jpg

设计表的时候漏掉了,这里补上user_id

编写app/dao/project/ProjectRoleDao.py



from app.models import db
from app.models.project_role import ProjectRole
from app.utils.logger import Log
class ProjectRoleDao(object):
    log = Log("ProjectRoleDao")
    @staticmethod
    def list_project_by_user(user_id):
        """
        通过user_id获取项目列表
        :param user_id:
        :return:
        """
        try:
            projects = ProjectRole.query.filter_by(user_id=user_id, deleted_at=None).all()
            return [p.id for p in projects], None
        except Exception as e:
            ProjectRoleDao.log.error(f"查询用户: {user_id}项目失败, {e}")
            return [], f"查询项目失败, {e}"
    @staticmethod
    def add_project_role(user_id, project_id, project_role, user):
        """
        为项目添加用户
        :param user_id: 用户id
        :param project_id: 项目id
        :param project_role: 用户角色
        :param user: 创建人
        :return:
        """
        try:
            role = ProjectRole.query.filter_by(user_id=user_id, project_id=project_id, project_role=project_role,
                                               deleted_at=None).first()
            if role is not None:
                # 说明角色已经存在了
                return "该用户已存在"
            role = ProjectRole(user_id, project_id, project_role, user)
            db.session.add(role)
            db.session.commit()
        except Exception as e:
            ProjectRoleDao.log.error(f"添加项目用户失败, {e}")
            return f"添加项目用户失败, {e}"
        return None

这边暂时编写了2个接口,1个是通过用户获取到用户的项目,另一个是为项目添加用户,代码很简单,也写了一些注释。由于暂时我们需要快速做一个展示,所以暂时提供,增和查功能即可,后续的接口再慢慢补充。

编写app/dao/project/ProjectRole.py

由于我们已经可以通过user_id获取到他有权限的项目,那么接下来我们把它和共有项目做一个整合就可以了。因为project不可能太多,所以这边我们直接用in操作符,先预想一下sql:


select * from project where deleted_at is null and (owner = user or project_id in (已经查出的用户项目) or private is false);

首先必须是未删除的,其次是owner=user的,再就是非私有或者用户有权限的。

如果对于超级管理员来说的话,那么他们对于所有项目都是可见的。


from sqlalchemy import or_
from app import pity
from app.dao.project.ProjectRoleDao import ProjectRoleDao
from app.models import db
from app.models.project import Project
from app.utils.logger import Log
class ProjectDao(object):
    log = Log("ProjectDao")
    @staticmethod
    def list_project(user, role, page, size, name=None):
        """
        查询/获取项目列表
        :param user: 当前用户
        :param role: 当前用户角色
        :param page: 当前页码
        :param size: 当前size
        :param name: 项目名称
        :return:
        """
        try:
            search = [Project.deleted_at == None]
            if role != pity.config.get("ADMIN"):
                project_list = ProjectRoleDao.list_project_by_user(user)
                search.append(or_(Project.id in project_list, Project.owner == user, Project.private == False))
            if name:
                search.append(Project.name.ilike("%{}%".format(name)))
            data = Project.query.filter(*search)
            total = data.count()
            return data.order_by(Project.created_at.desc()).paginate(page, per_page=size).items, total, None
        except Exception as e:
            ProjectDao.log.error(f"获取用户: {user}项目列表失败, {e}")
            return 0, 0, f"获取用户: {user}项目列表失败, {e}"
    @staticmethod
    def add_project(name, owner, user, private):
        try:
            data = Project.query.filter_by(name=name, deleted_at=None).first()
            if data is None:
                return "项目已存在"
            pr = Project(name, owner, user, private)
            db.session.add(pr)
            db.session.commit(pr)
        except Exception as e:
            ProjectDao.log.error(f"新增项目: {name}失败, {e}")
            return 0, 0, f"新增项目: {name}失败, {e}"

这里重点关注list_project,里面先判断用户是不是ADMIN,如果不是,则查询一下这个用户拥有的项目,等于说是转换了我们刚才写的sql。

最后通过项目的创建时间进行了排序,并进行了分页并返回了项目总数,第三个参数是error信息。

编写具体的接口


  • /project/insertProject
  • /project/listProject
  • /project/insertProjectRole

编写获取分页的相关方法app/handler/page.py


from flask import request
# 默认页数和页码
PAGE = 1
SIZE = 10
class PageHandler(object):
    @staticmethod
    def page():
        """
        获取page和size
        :return:
        """
        page = request.args.get("page")
        if page is None or not page.isdigit():
            page = PAGE
        size = request.args.get("size")
        if size is None or not size.isdigit():
            size = SIZE
        return int(page), int(size)


如果没有获取到page/size或者说他们不是非数字,那么我们就给个默认值。




相关文章
|
9天前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
40 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
3天前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
14 2
|
9天前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
14 2
|
9天前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
17 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
9天前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
22 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
13天前
|
测试技术 数据安全/隐私保护
北邮人论坛登录页面测试用例
北邮人论坛登录页面测试用例
27 1
|
15天前
|
人工智能 自动驾驶 机器人
【通义】AI视界|苹果自动驾驶汽车项目画上句号:加州测试许可被取消
本文精选了24小时内的重要科技新闻,包括Waymo前CEO批评马斯克对自动驾驶的态度、AMD发布新款AI芯片但股价波动、苹果造车项目终止、Familia.AI推出家庭应用以及AI逆向绘画技术的进展。更多内容请访问通义官网体验。
|
9天前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
44 0
|
18天前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
32 0
|
1月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
167 7
Jmeter实现WebSocket协议的接口测试方法