大家好~我是
米洛
!
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程
,希望大家多多支持。
欢迎关注我的公众号米洛的测开日记
,获取最新文章教程!
# 回顾
上一节我们完善了根据环境执行case
功能,也差不多是有了在线调试的功能。随着我们的系统功能陆续完善,那数据清理器(后置条件)这个我们一直没解决
的一个点,就不得不搞定之了。
由于前置条件/后置条件差异很小,并且模式也都接近,所以为了避免重复开发,我决定改造Constructor类,将后置条件并入之。
# 设计思路
在此,我决定不玩非主流,恢复前置/后置条件
的叫法,方便大家理解。但已经定义好的类: Constructor我也不改名了。
前置条件表如何支持后置条件: 加个标志位
我们可以为constructor表定义一个suffix
字段,这个字段是个bool值,默认为false。
这样原先有的数据,就都是false,也就代表都是前置条件(能不影响到之前case)。新加的条件,我们用suffix区分它是前置
还是后置
。
说到数据库的变更
,sqlalchemy没有提供特别方便的方式。我一般是用datagrip去修改:
- 选择表,进入编辑表功能
- 新增一个字段
点击+号,接着编辑字段信息。
- 编辑字段信息并选择execute
其实下面已经给出了具体的sql,直接执行也一样。
alter table pity_constructor
add suffix boolean default false not null;
2
其他的包括索引啥的,都是可以这样编辑的。(如果对建表,加字段等sql不太熟悉的,可以用用这个工具,pycharm就集成了datagrip)
# 动手实战
说完了核心思路,但其实修改过程中发现不少变化,可能还有一些遗漏
。本次修改我可能只展示一部分,更多修改请参考git本次commit:
https://github.com/wuranxu/pity/commit/743afc1c88c6e32d194800a5ef6861ed1bdf488e (opens new window)
- 修改model
from sqlalchemy import Column, INT, String, BOOLEAN, UniqueConstraint, TEXT, select, desc
from app.models.basic import PityBase
class Constructor(PityBase):
__tablename__ = 'pity_constructor'
__table_args__ = (
UniqueConstraint('case_id', 'suffix', 'name', 'deleted_at'),
)
type = Column(INT, default=0, comment="0: testcase 1: sql 2: redis 3: py脚本 4: 其它")
name = Column(String(64), comment="数据初始化描述")
enable = Column(BOOLEAN, default=True, nullable=False)
constructor_json = Column(TEXT, nullable=False)
value = Column(String(16), comment="返回值")
case_id = Column(INT, nullable=False, comment="所属用例id")
public = Column(BOOLEAN, default=False, comment="是否共享")
index = Column(INT, comment="前置条件顺序")
# 2021-12-18 是否是后置条件
suffix = Column(BOOLEAN, default=False, comment="是否是后置条件,默认为否")
def __init__(self, type, name, enable, constructor_json, case_id, public, user, value="", suffix=False, id=None):
super().__init__(user, id)
self.type = type
self.name = name
self.enable = enable
self.constructor_json = constructor_json
self.case_id = case_id
self.public = public
self.value = value
self.suffix = suffix
@staticmethod
async def get_index(session, case_id, suffix=False):
sql = select(Constructor).where(
Constructor.deleted_at == 0, Constructor.case_id == case_id,
Constructor.suffix == suffix,
).order_by(desc(Constructor.index))
data = await session.execute(sql)
query = data.scalars().first()
# 如果没有查出来前/后置条件,那么给他0
if query is None:
return 0
return query.index + 1
def __str__(self):
return f"[{'后置条件' if self.suffix else '前置条件'}: {self.name}]({self.id}))"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
修改点在于:
- 唯一索引新增suffix字段
- 新增suffix字段
- 表继承自PityBase
- get_index中对删除的判断改为deleted_at == 0而不是None
这其中还引发了一个事情,数据库中deleted_at字段要从datetime类型改为bigint,因为历史原因,我们的deleted_at都是datetime,现在我们要一并调整。
可回顾第66节: 测试平台系列(66) 数据驱动之基础Model
# 需要调整的地方
可以看到引用的地方非常之多,大概就下面几个方向。
- 遇到Constructor.deleted_at == None的(
判断条件是否被删除
),要改为等于0
对应功能: 获取前后置条件,删除前后置条件等
- 执行case的日志,要能够区分前后置条件
对应功能: 用例执行前后置条件
- 接受ConstructorForm字段要加上suffix,并且必填
对应功能: 新增/编辑前后置条件
- 查询前后置条件的时候,要带上suffix
对应功能: 前后置条件的复制
这一波改动挺大,也可能出现一些问题。如果有问题可以及时留言反馈。
# 前端改动
前端改动相对较小,只是在切换tab的时候多了一个suffix字段的维护:
切换到后置条件,把suffix变为true,切换到前置条件则改为false。这样编辑前后置条件的时候,只需要读取那个suffix字段即可。
当然还有一点微调,这里由于篇幅问题就不展示了。参考commit: