【數據建模篇】:用 Django Models 構建測試平臺核心數據
- 前言
- 我們要設計哪些核心數據?
- 準備工作:創建 Django App
- 開始設計數據模型 (Models)
- 1. 通用基礎模型 (可選但推薦)
- 2. 項目模型 (Project)
- 3. 模塊模型 (Module)
- 4. 測試用例模型 (TestCase)
- 生成和應用數據庫遷移
- 在 Django Admin 中查看和管理數據 (可選的快速驗證)
- 總結
前言
- 在上一篇,我們成功搭建了 Django 和 Vue3 的開發環境,就像給我們的“建筑工地”通了水電一樣。今天,我們要開始真正的“建筑設計”了——為我們的測試平臺設計數據模型。
- 什么是數據模型?簡單來說,數據模型就是我們測試平臺需要存儲和管理的信息的藍圖。比如,一個測試平臺肯定要有“項目”、“測試用例”、“測試報告”這些東西,數據模型就是用來精確定義這些“東西”包含哪些信息(比如項目名稱、用例步驟、報告結果等),以及它們之間是如何關聯的。
- 在 Django 中,我們使用 Models 來定義數據模型。你只需要用 Python 代碼來描述你的數據結構,Django 會自動幫你處理與數據庫交互的復雜細節(比如創建數據庫表)。
我們要設計哪些核心數據?
一個基礎的測試平臺,通常會包含以下核心數據:
- 項目 (Project):管理不同的測試項目。
- 模塊 (Module):項目下的功能模塊,用于組織測試用例。
- 測試用例 (TestCase):具體的測試點,包含一系列操作步驟。
- 測試步驟 (TestStep):測試用例中的單個操作,如訪問URL、點擊按鈕、校驗結果等(為了簡化入門,我們初期可以將步驟內置于用例中,后續可拆分)。
- 測試配置 (EnvironmentConfig / TestConfig):用于存儲不同測試環境的配置信息,如URL、賬戶等 (初期簡化,可放在項目中或后續添加)。
- 測試執行記錄 (TestRun / ExecutionRecord):記錄每一次測試任務的執行情況。
- 測試報告 (TestReport):匯總展示某次測試執行的結果。
為了讓小白更容易上手,我們先從最核心的 項目 (Project)、模塊 (Module) 和 測試用例 (TestCase) 開始設計,并逐步完善。
準備工作:創建 Django App
在 Django 中,項目通常由多個 App 組成,每個 App 負責一部分獨立的功能。我們將創建一個名為 api
的 App 來存放我們測試平臺后端的核心邏輯,包括數據模型。
-
激活 Python 虛擬環境:
- 打開Terminal:
- Windows:
venv\Scripts\activate
- macOS/Linux:
source venv/bin/activate
- Windows:
- 打開Terminal:
-
創建 Django 項目:
雖然我們之前安裝了 Django,但還沒有正式創建一個 Django 項目。一個 Django 項目是配置和多個應用的集合。
在test-platform
目錄下 (確保(venv)
已激活),執行:django-admin startproject backend .
注意命令最后的那個點
.
,它表示在當前目錄 (test-platform
) 下創建 Django 項目文件,而不是再新建一個同名子目錄。執行后,你的
test-platform
目錄結構如下圖所示:這里的
backend
文件夾是 Django 項目的配置目錄,settings.py
是項目配置文件,而manage.py
是Django 項目管理腳本工具,我們將頻繁使用它。 -
創建 Django App:
現在,使用manage.py
來創建我們的api
應用。確保你在test-platform
根目錄下。python manage.py startapp api
執行后,
test-platform
目錄下會新增一個api
文件夾:
我們將在models.py
這里定義數據模型。 -
注冊 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
字段。我們又添加了 owner
和 status
兩個項目特有的字段。
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)。
-
生成遷移文件:
在終端中 (確保在test-platform
目錄下,并且(venv)
已激活),運行:python manage.py makemigrations api
你會看到以下輸出:
如果你的模型定義沒有語法錯誤,Django 會檢查
api/models.py
文件的改動,并在api/migrations/
目錄下生成一個新的遷移文件,0001_initial.py
。這個文件描述了如何創建Project
,Module
,TestCase
表。 -
應用遷移到數據庫:
遷移文件生成后,運行以下命令將這些更改應用到數據庫(Django 默認使用 SQLite 文件數據庫,它會在你項目根目錄下自動創建一個db.sqlite3
文件):python manage.py migrate
你會看到以下輸出,表示你的數據庫表已經根據模型成功創建了!
驗證數據庫表 (可選,但推薦)
我們可以使用 SQLite 的瀏覽器工具(比如 DB Browser for SQLite)打開項目根目錄下的 db.sqlite3
文件,查看是否生成了表,以及它們的列結構是否符合定義。
在 Django Admin 中查看和管理數據 (可選的快速驗證)
Django 自帶一個強大的后臺管理界面 (Django Admin),我們可以用它來快速查看和添加數據,驗證模型是否工作正常。
-
創建超級用戶:
你需要一個管理員賬號來登錄 Django Admin。在終端運行:
python manage.py createsuperuser
按照提示輸入用戶名、郵箱(可以隨便填一個格式正確的)、密碼。
-
注冊模型到 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)
-
啟動開發服務器:
python manage.py runserver
默認情況下,服務器會運行在
http://127.0.0.1:8000/
。
訪問http://127.0.0.1:8000/
,安裝成功如下圖所示:
-
訪問 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 接口,讓前端能夠通過網絡來讀取和操作這些數據。