文章列表
2 分钟阅读

Django 测试入门:Model、View、API 测试怎么写

更新说明:新增 Django 测试实践。


系列:Python Web 工程实践

第 6 / 8 篇

  1. Python Web 项目配置管理:环境变量、.env 和生产配置怎么拆
  2. Python Web 项目如何连接数据库:SQLAlchemy、Django ORM、迁移怎么选
  3. Alembic 数据库迁移入门:表结构变更怎么安全上线
  4. Django 数据库迁移实战:makemigrations 和 migrate 背后的坑
  5. FastAPI 项目测试指南:pytest、TestClient、依赖覆盖怎么用
  6. Django 测试入门:Model、View、API 测试怎么写
  7. FastAPI 分层架构:router、service、repository 怎么拆
  8. PostgreSQL 基础:索引、事务、慢查询怎么理解

Django 项目有一套成熟的测试工具。刚开始不用追求覆盖率很高,先把模型规则、核心视图和 API 行为测起来,就能少掉很多低级回归。

如果你还在熟悉 Django,可以先看 Django 安装与使用指南

Model 测试

模型测试适合验证字段默认值、方法和约束。

tests/test_models.py
from django.test import TestCase
from blog.models import Article
class ArticleModelTest(TestCase):
def test_slug_is_unique(self):
Article.objects.create(title="A", slug="hello")
with self.assertRaises(Exception):
Article.objects.create(title="B", slug="hello")

如果模型有业务方法,也应该测返回结果。

def test_article_display_title(self):
article = Article(title="Hello", slug="hello")
self.assertEqual(str(article), "Hello")

View 测试

普通页面可以用 Django 测试客户端。

tests/test_views.py
from django.test import TestCase
from django.urls import reverse
class ArticleViewTest(TestCase):
def test_article_list_page(self):
response = self.client.get(reverse("article-list"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "文章")

不要只测 200。页面上关键文案、跳转、空状态都可以顺手测一下。

登录状态

需要登录的页面,要分别测匿名用户和已登录用户。

from django.contrib.auth import get_user_model
def test_dashboard_requires_login(self):
response = self.client.get(reverse("dashboard"))
self.assertEqual(response.status_code, 302)
def test_dashboard_logged_in(self):
user = get_user_model().objects.create_user("u", password="pass")
self.client.force_login(user)
response = self.client.get(reverse("dashboard"))
self.assertEqual(response.status_code, 200)

force_login 适合测试业务页面,不需要每次都走登录表单。

DRF API 测试

如果项目用了 Django REST Framework,可以用 APIClient

tests/test_api.py
from rest_framework.test import APITestCase
class ArticleApiTest(APITestCase):
def test_list_articles(self):
response = self.client.get("/api/articles/")
self.assertEqual(response.status_code, 200)

DRF 入门可以参考 Django REST Framework 入门:把 Django 做成 API

哪些测试最值得先写

优先级可以这样排:

  1. 登录、权限、鉴权
  2. 核心创建和修改流程
  3. 关键模型规则
  4. API 参数校验
  5. 页面空状态和异常状态

总结

Django 测试的收益在回归阶段很明显。只要项目开始有迁移、权限和 API,就应该把测试加进日常开发流程。先覆盖登录、权限和核心写入流程,通常比追求高覆盖率更实用。