大家好,我是米洛,正在打造一个能用版测试平台。求点赞!求重视!求共享!

项目地址: pity.readthedocs.io/

重视公众号: 米洛的测开日记,让咱们进一步沟通。

回顾

上一节咱们讲了适配异步办法的装饰器,这几节咱们持续来死磕用例逻辑部分。之前已经完善了数据构造器相关的功用,下面咱们来进行一系列的改造来支撑数据驱动

今日就讲一下根底Model。

本节概述

友情提示: 最近几节会涉及到很多改动,能够直接拉取代码查看对应的改动。

Github地址: github.com/wuranxu/pit…

大约的改动部分是,用例的参数不再是单一的,关于同一个场景进行多组数据的测试。

构思

咱们的case目前都是写死的数据,以咱们的查询存在用户接口为例子,咱们是编写了一个case,然后将name写定在url里边:

测试平台系列(66) 数据驱动之基础Model

其实这个name能够有很多组数据,假如只是name在发生改变,得写很多条几乎相同的case,那可谓是绵羊放了山羊屁。

所以咱们能够把数据抽离出来,有用过ddt的或许都知道,unittest+ddt就能够完结数据驱动,并且它会为你生成N多个用例。

所以咱们的方针便是要和它达成相同的作用。

说了那么多废话,我便是不说怎么做!!!其实,咱们维护一个数据表,里边专门存放测试数据,然后和case经过case_id进行关联,在用例履行的时分取出case的数据不就好了吗?

是的,大约的作用便是这样,可是完结起来还有许多阻碍,后面咱们一一道来

规划数据表

假如按照以往的尿性,我肯定会规划这样的表:

# 注意这儿都是伪代码
class TestCaseData(BaseModel):
    id = Column(INT)
    created_at = Column(DATETIME)
    updated_at = Column(DATETIME)
    deleted_at = Column(DATETIME)
    create_user = Column(INT)
    update_user = Column(INT)

这些都是除了表中心字段以外的不得不添加的根底字段,那每次都写这么多字段,说实话我有点烦了。

何不界说一个根底的model,然后业务model只保留最中心的字段呢?有了这个主意今后,我就停不下来了,所以我花了些时间完结这个事情。下面便是实践进程

规划根底Model

咱们知道SqlAlchemy是具有BaseModel类的,一切的类模型都得承继之。

所以咱们的根底Model也得承继它。在models目录下树立文件 basic.py

from datetime import datetime
from sqlalchemy import INT, DATETIME, Column, BIGINT
from app.models import Base
class PityBase(Base):
    id = Column(INT, primary_key=True)
    created_at = Column(DATETIME, nullable=False)
    updated_at = Column(DATETIME, nullable=False)
    deleted_at = Column(BIGINT, nullable=False, default=0)
    create_user = Column(INT, nullable=False)
    update_user = Column(INT, nullable=False)
    def __init__(self, user, id=0):
        self.created_at = datetime.now()
        self.updated_at = datetime.now()
        self.create_user = user
        self.update_user = user
        self.id = id

注意由于软删去的原因,咱们把deleted_at改成了BIGINT,而非datetime对象,假如有疑问可看我之前的软删去相关文章。

这样咱们就界说好了PityBase类。接着咱们来说下数据表的规划,其实咱们的数据表,你是不确定用户需要多少字段的。本身我以为这样的数据很适合放到mongo里边,它支撑不同类型的数据放到一张表,也能够不界说字段。

但已然咱们用的是Mysql,那咱们只能把咱们的数据字段写为JSON数据字符串),经过序列化/反序列化的方式完结咱们的需求。(虽然序列化/反序列影响性能)

测试数据表

"""
测试数据表, 用来存储各个环境下的测试数据,用于数据驱动
"""
__author__ = "miluo"
from sqlalchemy import Column, INT, String, UniqueConstraint, TEXT
from app.models.basic import PityBase
class PityTestcaseData(PityBase):
    env = Column(INT, nullable=False)
    case_id = Column(INT, nullable=False)
    name = Column(String(32), nullable=False)
    json_data = Column(TEXT, nullable=False)
    __table_args__ = (
        UniqueConstraint('env', 'case_id', 'name', 'deleted_at'),
    )
    __tablename__ = "pity_testcase_data"
    def __init__(self, env, case_id, name, json_data, user, id=0):
        super().__init__(user, id)
        self.env = env
        self.case_id = case_id
        self.name = name
        self.json_data = json_data

咱们存放了env,case_id,name和json_data这4个字段,并设置了联合唯一索引,防止数据重复。

或许有的人会猎奇,这个name是啥,name其实是数据的一个标识,也便是个别名罢了,用于标识你的这组数据。

里边的__init__办法,调用了父类的__init__(),完结了一切字段的赋值工作。

这就完事了吗?

其实没有那么简略,咱们还需要对PityModel(根底Model)进行一个改动,咱们得加一个__abstract__变量,并设置它为True,这样就能满意咱们的要求了。细心的朋友能够去掉__abstract__变量试试,你的PityModel会被以为是一个新的数据表,随之会引来报错

测试平台系列(66) 数据驱动之基础Model

今日的内容就先提到这儿,下一节咱们讲TestcaseData的相关操作以及其他改变。今后咱们的数据表,如有新增,都会集成自PityModel类,会省不少事儿