当前位置: 首页 > news >正文

三、【数据建模篇】:用 Django Models 构建测试平台核心数据

【数据建模篇】:用 Django Models 构建测试平台核心数据

    • 前言
      • 我们要设计哪些核心数据?
      • 准备工作:创建 Django App
      • 开始设计数据模型 (Models)
        • 1. 通用基础模型 (可选但推荐)
        • 2. 项目模型 (Project)
        • 3. 模块模型 (Module)
        • 4. 测试用例模型 (TestCase)
      • 生成和应用数据库迁移
      • 在 Django Admin 中查看和管理数据 (可选的快速验证)
    • 总结

前言

  • 在上一篇,我们成功搭建了 Django 和 Vue3 的开发环境,就像给我们的“建筑工地”通了水电一样。今天,我们要开始真正的“建筑设计”了——为我们的测试平台设计数据模型。
  • 什么是数据模型?简单来说,数据模型就是我们测试平台需要存储和管理的信息的蓝图。比如,一个测试平台肯定要有“项目”、“测试用例”、“测试报告”这些东西,数据模型就是用来精确定义这些“东西”包含哪些信息(比如项目名称、用例步骤、报告结果等),以及它们之间是如何关联的。
  • 在 Django 中,我们使用 Models 来定义数据模型。你只需要用 Python 代码来描述你的数据结构,Django 会自动帮你处理与数据库交互的复杂细节(比如创建数据库表)。

我们要设计哪些核心数据?

一个基础的测试平台,通常会包含以下核心数据:

  1. 项目 (Project):管理不同的测试项目。
  2. 模块 (Module):项目下的功能模块,用于组织测试用例。
  3. 测试用例 (TestCase):具体的测试点,包含一系列操作步骤。
  4. 测试步骤 (TestStep):测试用例中的单个操作,如访问URL、点击按钮、校验结果等(为了简化入门,我们初期可以将步骤内置于用例中,后续可拆分)。
  5. 测试配置 (EnvironmentConfig / TestConfig):用于存储不同测试环境的配置信息,如URL、账户等 (初期简化,可放在项目中或后续添加)。
  6. 测试执行记录 (TestRun / ExecutionRecord):记录每一次测试任务的执行情况。
  7. 测试报告 (TestReport):汇总展示某次测试执行的结果。

为了让小白更容易上手,我们先从最核心的 项目 (Project)模块 (Module)测试用例 (TestCase) 开始设计,并逐步完善。

准备工作:创建 Django App

在 Django 中,项目通常由多个 App 组成,每个 App 负责一部分独立的功能。我们将创建一个名为 api 的 App 来存放我们测试平台后端的核心逻辑,包括数据模型。

  1. 激活 Python 虚拟环境

    • 打开Terminal:
      • Windows:venv\Scripts\activate
      • macOS/Linux: source venv/bin/activate
  2. 创建 Django 项目
    虽然我们之前安装了 Django,但还没有正式创建一个 Django 项目。一个 Django 项目是配置和多个应用的集合。
    test-platform 目录下 (确保 (venv) 已激活),执行:

    django-admin startproject backend .
    

    注意命令最后的那个点 .,它表示在当前目录 (test-platform) 下创建 Django 项目文件,而不是再新建一个同名子目录。

    执行后,你的 test-platform 目录结构如下图所示:

    在这里插入图片描述

    这里的 backend 文件夹是 Django 项目的配置目录,settings.py 是项目配置文件,而 manage.py 是Django 项目管理脚本工具,我们将频繁使用它。

  3. 创建 Django App
    现在,使用 manage.py 来创建我们的 api 应用。确保你在 test-platform 根目录下。

    python manage.py startapp api
    

    执行后,test-platform 目录下会新增一个 api 文件夹:

    在这里插入图片描述
    我们将在models.py这里定义数据模型。

  4. 注册 App
    创建了 App 之后,还需要告诉 Django 项目它的存在。打开 test-platform/backend/settings.py 文件,找到 INSTALLED_APPS 列表,在列表末尾添加我们的 api 应用:
    在这里插入图片描述

    # test-platform/backend/settings.pyINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework',  # 我们之前安装了DRF,在这里也注册上'api',             # 添加我们新建的 app
    ]
    

    记得保存文件。

开始设计数据模型 (Models)

现在,打开 test-platform/api/models.py 文件。这个文件初始只有一些注释。我们将在这里用 Python 类来定义我们的数据模型。

1. 通用基础模型 (可选但推荐)

为了代码复用和统一管理创建时间、更新时间等通用字段,我们可以先定义一个基础模型。

在这里插入图片描述

# test-platform/api/models.py
from django.db import modelsclass BaseModel(models.Model):"""公共模型,可添加创建时间/更新时间/逻辑删除等通用字段"""name = models.CharField(max_length=100, unique=True, verbose_name="名称")description = models.TextField(null=True, blank=True, verbose_name="描述")create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")class Meta:abstract = True  # 设置为抽象基类,不会在数据库中创建表ordering = ['-create_time'] # 默认按创建时间倒序def __str__(self):return self.name
  • models.Model: 所有 Django 模型都继承自它。
  • name = models.CharField(...): 定义一个字符类型字段,max_length 是最大长度,unique=True 表示名称不能重复,verbose_name 是在 Django admin 后台显示的友好名称。
  • description = models.TextField(...): 定义一个文本类型字段,null=True 表示数据库中可以为空,blank=True 表示在表单中可以不填。
  • create_time = models.DateTimeField(auto_now_add=True, ...): 日期时间字段,auto_now_add=True 表示在对象第一次创建时自动设置为当前时间。
  • update_time = models.DateTimeField(auto_now=True, ...): 日期时间字段,auto_now=True 表示在对象每次保存时自动更新为当前时间。
  • class Meta: 用于定义模型的元数据。
    • abstract = True: 表示 BaseModel 是一个抽象基类。它本身不会被创建成数据库表,而是用来被其他模型继承,从而共享这些通用字段。
    • ordering = ['-create_time']: 指定查询此模型的对象时,默认按创建时间降序排列 (最新的在前面)。
  • __str__(self): 定义当打印模型实例时,返回的内容。这里我们返回其名称。
2. 项目模型 (Project)

一个测试项目是我们组织测试的顶层单位。

在这里插入图片描述

# test-platform/api/models.py
# (继续在同一个文件中添加,BaseModel定义之后)class Project(BaseModel): # 继承自我们定义的 BaseModel"""项目表"""# name 和 description 字段已从 BaseModel 继承# create_time 和 update_time 字段已从 BaseModel 继承# 可以添加项目特有的字段,例如:#负责人owner = models.CharField(max_length=50, null=True, blank=True, verbose_name="负责人")#项目状态:0-规划中,1-进行中,2-已完成,3-搁置status = models.PositiveSmallIntegerField(default=1, verbose_name="项目状态", help_text="0:规划中, 1:进行中, 2:已完成, 3:搁置")class Meta:verbose_name = "项目" # 单数形式的友好名称verbose_name_plural = "项目列表" # 复数形式的友好名称ordering = ['-create_time'] # 也可以在这里覆盖或添加排序规则# __str__ 方法已从 BaseModel 继承

我们让 Project 模型继承了 BaseModel,所以它自动拥有了 name, description, create_time, update_time 字段。我们又添加了 ownerstatus 两个项目特有的字段。

3. 模块模型 (Module)

模块通常属于某个项目,用于对测试用例进行分类。

在这里插入图片描述

# test-platform/api/models.py
# (继续在同一个文件中添加)class Module(BaseModel):"""模块表"""# name 和 description 字段已从 BaseModel 继承# create_time 和 update_time 字段已从 BaseModel 继承project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name="所属项目", related_name="modules")# 'Project':关联到 Project 模型。# on_delete=models.CASCADE:级联删除。当其所属的 Project 被删除时,这个 Module 也会被自动删除。# verbose_name:友好名称。# related_name="modules":这允许我们从一个 Project 实例通过 `project_instance.modules.all()` 来获取其下所有的 Module 实例。class Meta:verbose_name = "模块"verbose_name_plural = "模块列表"# 同一个项目下的模块名不能重复unique_together = ('project', 'name') # project 和 name 组合起来必须唯一# __str__ 方法已从 BaseModel 继承,可以考虑重写以包含项目信息def __str__(self):return f"{self.project.name} - {self.name}"

这里最重要的是 project = models.ForeignKey(Project, ...),它定义了一个外键关系。这意味着一个模块必须属于一个项目。

4. 测试用例模型 (TestCase)

测试用例是测试的核心,它属于某个模块。

在这里插入图片描述

# test-platform/api/models.py
# (继续在同一个文件中添加)class TestCase(BaseModel):"""测试用例表"""# name 和 description 字段已从 BaseModel 继承# create_time 和 update_time 字段已从 BaseModel 继承module = models.ForeignKey(Module, on_delete=models.CASCADE, verbose_name="所属模块", related_name="testcases")# 用例级别: P0, P1, P2, P3priority_choices = [('P0', 'P0 - 最高'),('P1', 'P1 - 高'),('P2', 'P2 - 中'),('P3', 'P3 - 低'),]priority = models.CharField(max_length=2, choices=priority_choices, default='P1', verbose_name="优先级")# 前置条件precondition = models.TextField(null=True, blank=True, verbose_name="前置条件")# 测试步骤 (初期简化,直接存在用例中,可以用JSON格式或特定文本格式)# 更好的做法是单独创建一个 TestStep 模型,并与 TestCase 建立一对多关系steps_text = models.TextField(verbose_name="测试步骤 (文本描述)")# 预期结果expected_result = models.TextField(verbose_name="预期结果")# 用例类型:例如 功能测试,接口测试,UI测试 (初期可以简单点,后续扩展)case_type_choices = [('functional', '功能测试'),('api', '接口测试'),('ui', 'UI测试'),]case_type = models.CharField(max_length=20, choices=case_type_choices, default='functional', verbose_name="用例类型")# 维护人maintainer = models.CharField(max_length=50, null=True, blank=True, verbose_name="维护人")class Meta:verbose_name = "测试用例"verbose_name_plural = "测试用例列表"# 同一个模块下的用例名不能重复unique_together = ('module', 'name')# __str__ 方法已从 BaseModel 继承,可以考虑重写def __str__(self):return f"{self.module.project.name} - {self.module.name} - {self.name}"
  • priority = models.CharField(..., choices=priority_choices, ...): choices 参数允许你定义一个下拉选择列表。
  • steps_text: 我们暂时用一个大的文本字段来存储测试步骤,这对于入门比较简单。在更复杂的系统中,你可能会创建一个单独的 TestStep 模型,并让一个 TestCase 关联多个 TestStep

生成和应用数据库迁移

模型定义好了,但数据库还不知道这些。我们需要告诉 Django 根据我们的模型定义来创建或修改数据库表结构。这个过程叫做数据库迁移 (Migrations)

  1. 生成迁移文件
    在终端中 (确保在 test-platform 目录下,并且 (venv) 已激活),运行:

    python manage.py makemigrations api
    

    你会看到以下输出:

    在这里插入图片描述

    如果你的模型定义没有语法错误,Django 会检查 api/models.py 文件的改动,并在 api/migrations/ 目录下生成一个新的迁移文件, 0001_initial.py。这个文件描述了如何创建 Project, Module, TestCase 表。

    在这里插入图片描述

  2. 应用迁移到数据库
    迁移文件生成后,运行以下命令将这些更改应用到数据库(Django 默认使用 SQLite 文件数据库,它会在你项目根目录下自动创建一个 db.sqlite3 文件):

    python manage.py migrate
    

    你会看到以下输出,表示你的数据库表已经根据模型成功创建了!

    在这里插入图片描述
    在这里插入图片描述

验证数据库表 (可选,但推荐)

我们可以使用 SQLite 的浏览器工具(比如 DB Browser for SQLite)打开项目根目录下的 db.sqlite3 文件,查看是否生成了表,以及它们的列结构是否符合定义。

在这里插入图片描述

在 Django Admin 中查看和管理数据 (可选的快速验证)

Django 自带一个强大的后台管理界面 (Django Admin),我们可以用它来快速查看和添加数据,验证模型是否工作正常。

  1. 创建超级用户

    你需要一个管理员账号来登录 Django Admin。在终端运行:

    python manage.py createsuperuser
    

    按照提示输入用户名、邮箱(可以随便填一个格式正确的)、密码。

    在这里插入图片描述

  2. 注册模型到 Admin
    打开 test-platform/api/admin.py 文件,将我们的模型注册进去:
    在这里插入图片描述

    # test-platform/api/admin.py
    from django.contrib import admin
    from .models import Project, Module, TestCase # 导入你的模型# 注册模型到 admin 站点
    admin.site.register(Project)
    admin.site.register(Module)
    admin.site.register(TestCase)
    
  3. 启动开发服务器

    python manage.py runserver
    

    默认情况下,服务器会运行在 http://127.0.0.1:8000/
    在这里插入图片描述
    访问 http://127.0.0.1:8000/,安装成功如下图所示:
    在这里插入图片描述

  4. 访问 Admin 界面
    在浏览器中打开 http://127.0.0.1:8000/admin/
    使用你刚才创建的超级用户账号登录。
    在这里插入图片描述

    登录后,你能看到 “API” 部分,下面列出了 “模块列表”, “测试用例列表”, “项目列表”。你可以点击它们,尝试添加一些测试数据。
    在这里插入图片描述

通过 Django Admin 添加几条数据,验证下模型之间的关系是否按预期工作。比如:

  • 创建一个项目 “电商平台测试”。
    在这里插入图片描述

  • 在 “电商平台测试” 项目下创建一个模块 “用户登录模块”。
    在这里插入图片描述

  • 在 “用户登录模块” 下创建一个测试用例 “TC001_正确用户名密码登录”,再输入测试步骤和预期结果。
    在这里插入图片描述

总结

你已经成功为测试平台设计了核心的数据模型,并学会了以下内容:

  • ✅ 在 Django 中创建 App。
  • ✅ 使用 Python 类定义 Django Models (Project, Module, TestCase)。
  • ✅ 理解了字段类型、外键关系 (ForeignKey)、元数据 (class Meta) 的基本用法。
  • ✅ 生成并应用了数据库迁移 (makemigrations, migrate)。
  • ✅ 通过 Django Admin 快速验证了模型。

在下一篇文章中,我们将基于这些模型,开始使用 Django REST Framework (DRF) 来创建后端 API 接口,让前端能够通过网络来读取和操作这些数据。

http://www.xdnf.cn/news/544573.html

相关文章:

  • windows维护工具vip版
  • Django基础(二)Django 项目基础操作
  • NLP学习路线图(二): 概率论与统计学(贝叶斯定理、概率分布等)
  • GO语言学习(六)
  • WSL虚拟机整体迁移教程(如何将WSL从C盘迁移到其他盘)
  • 【计算机方向海外优质会议推荐】第二届图像处理、机器学习与模式识别国际学术会议(IPMLP 2025)
  • 下载Ubuntu 64 位
  • 图像处理基础知识
  • YOLOv8 的双 Backbone 架构:解锁目标检测新性能
  • Java EE初阶——定时器和线程池
  • 华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 与 Cline 快速构建AI编程助手
  • 游戏引擎学习第297天:将实体分离到Z层中
  • docker环境和dockerfile制作
  • 一洽小程序接入说明
  • 多模态大语言模型arxiv论文略读(八十五)
  • 20250520期:科研小白如何投稿一篇SCI?
  • 一文讲清python、anaconda的安装以及pycharm创建工程
  • [SpringBoot]Spring MVC(6.0)----图书管理系统(初)
  • mapbox进阶,纯前端geojson转shape,并将shape相关文件压缩成zip压缩包并下载
  • Mybatis面向接口编程
  • 塔能智能照明方案——贵州某地区市政照明改造实践
  • Android 中拖拽从一个组件到另外一个组件的写法(跨容器拖拽)
  • mysql不能聚合之数据清洗逗号
  • Docker中部署Alertmanager
  • 碰一碰发视频源码:技术架构与全链路解析
  • Node.js路径处理指南:如何安全获取当前脚本目录路径
  • Redis 命令大全
  • CentOS 7上BIND9配置DNS服务器指南
  • 扫盲笔记之NPM
  • 精益数据分析(72/126):MVP的核心法则——消除阻碍与聚焦关键指标