測試平台系列(98) 完善後置條件功能

大家好~我是米洛!
我正在從0到1打造一個開源的介面測試平台, 也在編寫一套與之對應的教程,希望大家多多支援下。為教程點個star,關愛部落客,從你做起!
歡迎關注我的公眾號米洛的測開日記,一起交流學習! 也可加入群聊一起討論~

回顧

上一節我們完善了根據環境執行case功能,也差不多是有了在線調試的功能。隨著我們的系統功能陸續完善,那數據清理器(後置條件)這個我們一直沒解決的一個點,就不得不搞定之了。

由於前置條件/後置條件差異很小,並且模式也都接近,所以為了避免重複開發,我決定改造Constructor類,將後置條件併入之。

設計思路

在此,我決定不玩非主流,恢復前置/後置條件的叫法,方便大家理解。但已經定義好的類: Constructor我也不改名了。

前置條件表如何支援後置條件: 加個標誌位

我們可以為constructor表定義一個suffix欄位,這個欄位是個bool值,默認為false。

這樣原先有的數據,就都是false,也就代表都是前置條件(能不影響到之前case)。新加的條件,我們用suffix區分它是前置還是後置

說到資料庫的變更,sqlalchemy沒有提供特別方便的方式。我一般是用datagrip去修改:

  1. 選擇表,進入編輯表功能

  1. 新增一個欄位

點擊+號,接著編輯欄位資訊。

  1. 編輯欄位資訊並選擇execute

其實下面已經給出了具體的sql,直接執行也一樣。

alter table pity_constructor
   add suffix boolean default false not null;

其他的包括索引啥的,都是可以這樣編輯的。(如果對建表,加欄位等sql不太熟悉的,可以用用這個工具,pycharm就集成了datagrip)

知道資料庫連接資訊即可

動手實戰

說完了核心思路,但其實修改過程中發現不少變化,可能還有一些遺漏。本次修改我可能只展示一部分,更多修改請參考git本次commit:

//github.com/wuranxu/pity/commit/743afc1c88c6e32d194800a5ef6861ed1bdf488e

  • 修改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}))"

修改點在於:

  1. 唯一索引新增suffix欄位
  2. 新增suffix欄位
  3. 表繼承自PityBase
  4. get_index中對刪除的判斷改為deleted_at == 0而不是None

這其中還引發了一個事情,資料庫中deleted_at欄位要從datetime類型改為bigint,因為歷史原因,我們的deleted_at都是datetime,現在我們要一併調整。

可回顧第66節: 測試平台系列(66) 數據驅動之基礎Model

//mp.weixin.qq.com/s?__biz=MzIyMjUwOTk5Mw==&mid=2247485632&idx=2&sn=8f3f4e1f8098c3718ce7d9c4783476bb&chksm=e82d2606df5aaf10fc1426430f2dcb301f6923264ed2d2836c6aa5ecd8e8882b098aa39c1840&token=1149953909&lang=zh_CN#rd

需要調整的地方

可以看到引用的地方非常之多,大概就下面幾個方向。

  1. 遇到Constructor.deleted_at == None的(判斷條件是否被刪除),要改為等於0

對應功能: 獲取前後置條件,刪除前後置條件等

  1. 執行case的日誌,要能夠區分前後置條件

對應功能: 用例執行前後置條件

  1. 接受ConstructorForm欄位要加上suffix,並且必填

對應功能: 新增/編輯前後置條件

  1. 查詢前後置條件的時候,要帶上suffix

對應功能: 前後置條件的複製

這一波改動挺大,也可能出現一些問題。如果有問題可以及時留言回饋。

前端改動

前端改動相對較小,只是在切換tab的時候多了一個suffix欄位的維護:

切換到後置條件,把suffix變為true,切換到前置條件則改為false。這樣編輯前後置條件的時候,只需要讀取那個suffix欄位即可。

當然還有一點微調,這裡由於篇幅問題就不展示了。參考commit:

//github.com/wuranxu/pityWeb/commit/86af44531c500c7acb22f2fb7a386ab00598551c

看看最終的效果