Django实现接口自动化平台(七)数据库设计

上一章:

Django实现接口自动化平台(六)httprunner(2.x)基本使用【持续更新中】_做测试的喵酱的博客-CSDN博客

下一章:

Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客

一、数据库设计

接口自动化平台,内置引擎,使用的是httprunner2,所以数据库设计与httprunner2的数据结构相似。

1.1 一共涉及到9张表

  • 项目模型
  • 接口模型
  • 用例模型
  • 配置模型
  • 套件模型
  • 内置函数模型
  • 环境变量模型
  • 测试报告模型
  • 用户模型

登录相关:

  • 用户表:auth_user

接口自动化相关:

  • 项目表:tb_projects
  • 接口表:tb_interfaces
  • case表:tb_testcases
  • 测试套件表:tb_testsuits
  • 接口环境配置表:tb_configures
  • 全局环境配置表:tb_envs
  • 测试报告表:tb_reposts
  • 内置函数表:tb_debugtalks

1.2 表之间的关系

Django实现接口自动化平台(七)数据库设计_第1张图片

 1、一个项目,(项目表tb_projects)对应一个内置函数( tb_debugtalks 函数表 )

2、一个项目,对应一个测试套

3、一个项目,对应多个接口。

4、一个接口,对应多个用例

5、一个接口,对应一套环境

tb_reports:

  • id
  • name
  • result
  • success
  • html
  • summary
  • create_time
  • update_time
  • is_delete

tb_projects:

  • id
  • name
  • leader
  • tester
  • projrammer
  • publish_app
  • desc
  • create_time
  • update_time
  • is_delete

tb_interfaces:

  • id
  • name
  • project
  • tester
  • desc
  • create_time
  • update_time
  • is_delete

tb_testcases:

  • id
  • name
  • interface
  • include
  • author
  • request
  • create_time
  • update_time
  • is_delete

 tb_debugtalks

  • id (主键)
  • name
  • debugtalk
  • project (外键 tb_projects)
  • create_time
  • update_time

tb_envs:

  • id
  • name
  • base_url
  • desc
  • create_time
  • update_time
  • is_delete

tb_testsuites:

  • id
  • name
  • project
  • include
  • request
  • create_time
  • update_time
  • is_delete

tb_configures:

  • id
  • name
  • interface
  • author
  • request
  • create_time
  • update_time
  • is_delete

二、创建子应用

注意:

用户表已经在二、三章实现了。

Django实现接口自动化平台(二)认证&授权&登录【持续更新中】_做测试的喵酱的博客-CSDN博客

Django实现接口自动化平台(三)实现注册功能【持续更新中】_做测试的喵酱的博客-CSDN博客

2.1 、创建子应用

python manage.py startapp projects

python manage.py startapp interfaces

python manage.py startapp testcases

python manage.py startapp testsuits

python manage.py startapp configures

python manage.py startapp envs

python manage.py startapp reports

python manage.py startapp debugtalks

2.2 、注册应用

在setting.py 下配置INSTALLED_APPS

Django实现接口自动化平台(七)数据库设计_第2张图片

    'projects',
    'interfaces',
    'users',
    'testcases',
    'configures',
    'reports',
    'debugtalks',
    'testsuites',
    'envs',

2.3 统一管理应用

我们整个项目,会涉及到大量的应用。如果应用文件夹都在根目录下,会显得比较乱。

所以我们可以在根目录下,创建一个名为apps的package,将所有应用移动到apps下。

1、在项目根目录下,创建 package,apps

2、将所有的应用,用鼠标拖动到apps下,

Django实现接口自动化平台(七)数据库设计_第3张图片

 注意,在拖动应用的时候,弹窗中,不要进行任何勾选。

最终效果:

Django实现接口自动化平台(七)数据库设计_第4张图片

3、设置应用apps路径

在setting.py下,配置apps的绝对路径

# apps绝对路径
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

Django实现接口自动化平台(七)数据库设计_第5张图片

 注意:

a、BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

BASE_DIR是项目的根路径

b、apps的绝对路径:os.path.join(BASE_DIR, 'apps')

c、配置文件,在寻找应用文件时,是在sys.path中寻找的。

sys.path是一个list

为了项目配置文件,能找到我们apps的路径,需要将路径插入到sys.path中。

sys.path.insert(0,)插入到第一位,为了寻找快一点。

4、右键,设置apps文件。Mark Directory as ------Sources Root

将apps文件,设置为资源文件。(非必需操作)

这样以后在pycharm中,在引用apps中的应用时,会自动联想出来,方便我们写代码。

Django实现接口自动化平台(七)数据库设计_第6张图片

三、数据库模型设计

3.1基础模型类 BaseModel

在utils文件夹下,创建基础模型类。utils/base_models.py

# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 05 -25
# @File: base_model.py
# desc:
from django.db import models


class BaseModel(models.Model):
    # id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间')

    class Meta:
        # 在内部类Meta中,一旦指定abstract = True,那么当前模型类为抽象模型类,在迁移时不会创建表,仅仅是为了供其他类继承
        abstract = True

注意:

在内部类Meta中,一旦指定abstract = True,那么当前模型类为抽象模型类,在迁移时不会创建表,仅仅是为了供其他类继承。

3.2 测试报告模型类Reports

apps/reports/models.py
from django.db import models

from utils.base_models import BaseModel


class Reports(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('报告名称', max_length=200, unique=True, help_text='报告名称')
    result = models.BooleanField('执行结果', default=1, help_text='执行结果')   # 1为成功, 0为失败
    count = models.IntegerField('用例总数', help_text='总用例数')
    success = models.IntegerField('成功总数', help_text='成功总数')
    html = models.TextField('报告HTML源码', help_text='报告HTML源码', null=True, blank=True, default='')
    summary = models.TextField('报告详情', help_text='报告详情', null=True, blank=True, default='')

    class Meta:
        db_table = 'tb_reports'
        verbose_name = '测试报告'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

3.3 全局环境变量模型类 Envs

apps/envs/models.py

from django.db import models

from utils.base_models import BaseModel


class Envs(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField(verbose_name='环境名称', max_length=200, unique=True, help_text='环境名称')
    base_url = models.URLField(verbose_name='请求base url', max_length=200, help_text='请求base url')
    desc = models.CharField(verbose_name='简要描述', max_length=200, help_text='简要描述')

    class Meta:
        db_table = 'tb_envs'
        verbose_name = '环境信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

3.4 项目表模型类 Projects

apps/projects/models.py

from django.db import models

from utils.base_models import BaseModel


class Projects(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('项目名称', max_length=200, unique=True, help_text='项目名称')
    leader = models.CharField('负责人', max_length=50, help_text='项目负责人')
    tester = models.CharField('测试人员', max_length=50, help_text='项目测试人员')
    programmer = models.CharField('开发人员', max_length=50, help_text='开发人员')
    publish_app = models.CharField('发布应用', max_length=100, help_text='发布应用')
    desc = models.CharField('简要描述', max_length=200, null=True, blank=True, default='', help_text='简要描述')

    class Meta:
        db_table = 'tb_projects'
        verbose_name = '项目信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

3.5 接口表模型类 Interfaces

apps/interfaces/models.py

from django.db import models

from utils.base_models import BaseModel


class Interfaces(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('接口名称', max_length=200, unique=True, help_text='接口名称')
    project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
                                related_name='interfaces', help_text='所属项目')
    tester = models.CharField('测试人员', max_length=50, help_text='测试人员')
    desc = models.CharField('简要描述', max_length=200, null=True, blank=True, help_text='简要描述')

    class Meta:
        db_table = 'tb_interfaces'
        verbose_name = '接口信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

3.6 内置函数表的模型类DebugTalks

apps/debugtalks/models.py

from django.db import models

from utils.base_models import BaseModel


class DebugTalks(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('debugtalk文件名称', max_length=200, default='debugtalk.py', help_text='debugtalk文件名称')
    debugtalk = models.TextField(null=True, default='#debugtalk.py', help_text='debugtalk.py文件')
    project = models.OneToOneField('projects.Projects', on_delete=models.CASCADE,
                                   related_name='debugtalks', help_text='所属项目')

    class Meta:
        db_table = 'tb_debugtalks'
        verbose_name = 'debugtalk.py文件'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

3.7 测试套的模型类

apps/testsuites/models.py

from django.db import models

from utils.base_models import BaseModel


class Testsuits(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('套件名称', max_length=200, unique=True, help_text='套件名称')
    project = models.ForeignKey('projects.Projects', on_delete=models.CASCADE,
                                related_name='testsuits', help_text='所属项目')
    include = models.TextField('包含的接口', null=False, help_text='包含的接口')

    class Meta:
        db_table = 'tb_testsuits'
        verbose_name = '套件信息'
        verbose_name_plural = verbose_name
        ordering = ('id', )

    def __str__(self):
        return self.name

3.8 用例表的模型类

apps/testcases/models.py

from django.db import models

from utils.base_models import BaseModel


class Testcases(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('用例名称', max_length=50, unique=True, help_text='用例名称')
    interface = models.ForeignKey('interfaces.Interfaces', on_delete=models.CASCADE,
                                  help_text='所属接口')
    include = models.TextField('前置', null=True, help_text='用例执行前置顺序')
    author = models.CharField('编写人员', max_length=50, help_text='编写人员')
    request = models.TextField('请求信息', help_text='请求信息')

    class Meta:
        db_table = 'tb_testcases'
        verbose_name = '用例信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

3.9 接口环境配置的模型类

apps/configures/models.py

from django.db import models

from utils.base_models import BaseModel


class Configures(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('配置名称', max_length=50, help_text='配置名称')
    interface = models.ForeignKey('interfaces.Interfaces',
                                  on_delete=models.CASCADE,
                                  related_name='configures',
                                  help_text='所属接口')
    author = models.CharField('编写人员', max_length=50, help_text='编写人员')
    request = models.TextField('请求信息', help_text='请求信息')

    class Meta:
        db_table = 'tb_configures'
        verbose_name = '配置信息'
        verbose_name_plural = verbose_name
        ordering = ('id',)

    def __str__(self):
        return self.name

你可能感兴趣的:(测开工具,Python,自动化,运维)