【后端】【Django】Django DRF API 单元测试完整方案(基于 `TestCase`)

Django DRF API 单元测试完整方案(基于 TestCase

一、方案概述

使用 django.test.TestCaserest_framework.test.APIClient 进行 API 单元测试,确保 API 正确性、权限控制、数据返回格式、业务逻辑 等。


二、基本步骤

  1. 使用 setUp() 初始化测试环境

    • 创建 API 客户端 APIClient()
    • 预先插入数据库测试数据(如普通用户、管理员用户等)
    • 生成 Token 进行身份认证(如 TokenAuthentication
  2. 编写测试用例

    • 发送 GETPOSTPUTDELETE 请求
    • 断言 HTTP 状态码、数据格式、权限逻辑等
  3. 运行测试

    • 执行 python manage.py test 运行测试

三、测试场景 1:权限控制(用户管理 API)

HTTP 方法端点功能描述
POST/api/users/创建用户
GET/api/users/获取用户列表(需要身份认证)
GET/api/users/{id}/获取用户详情(仅管理员可查看)
PUT/api/users/{id}/更新用户信息(仅限用户本人)
DELETE/api/users/{id}/删除用户(仅管理员可删除)
完整的 API 测试代码
from django.test import TestCase
from rest_framework.test import APIClient
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Tokenclass UserAPITestCase(TestCase):"""用户 API 测试"""def setUp(self):"""初始化 API 客户端,并创建测试用户和管理员"""self.client = APIClient()# 创建普通用户self.user = User.objects.create_user(username="testuser", email="test@example.com", password="password123")# 创建管理员用户self.admin_user = User.objects.create_superuser(username="admin", email="admin@example.com", password="adminpass")# 生成 Tokenself.token, _ = Token.objects.get_or_create(user=self.user)self.admin_token, _ = Token.objects.get_or_create(user=self.admin_user)def test_get_users_without_authentication(self):"""测试未登录获取用户列表,应该返回 403"""response = self.client.get("/api/users/")self.assertEqual(response.status_code, 403)def test_get_users_with_authentication(self):"""测试登录后获取用户列表"""self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token.key}")response = self.client.get("/api/users/")self.assertEqual(response.status_code, 200)

四、测试场景 2:API 依赖前置 setUp()(菜品管理 API)

HTTP 方法端点功能描述
POST/api/categories/创建菜品分类
GET/api/categories/获取菜品分类列表
POST/api/dishes/创建菜品(必须指定已有的菜品分类)
GET/api/dishes/获取菜品列表
完整的 API 测试代码
from django.test import TestCase
from rest_framework.test import APIClient
from myapp.models import Category, Dishclass DishAPITestCase(TestCase):"""菜品 API 测试"""def setUp(self):"""初始化 API 客户端,并创建测试数据"""self.client = APIClient()# 创建一个分类self.category = Category.objects.create(name="热菜")def test_create_dish_with_valid_category(self):"""测试创建菜品(分类有效)"""data = {"name": "宫保鸡丁", "price": "25.00", "category": self.category.id}response = self.client.post("/api/dishes/", data, format="json")self.assertEqual(response.status_code, 201)self.assertEqual(response.data["name"], "宫保鸡丁")def test_create_dish_with_invalid_category(self):"""测试创建菜品(分类不存在)"""data = {"name": "鱼香肉丝", "price": "22.00", "category": 999}  # 不存在的分类 IDresponse = self.client.post("/api/dishes/", data, format="json")self.assertEqual(response.status_code, 400)self.assertIn("分类不存在", response.data["category"])

五、运行测试

python manage.py test myapp

六、方案总结

功能方法断言
获取用户列表(未登录)test_get_users_without_authentication()self.assertEqual(response.status_code, 403)
获取用户列表(已登录)test_get_users_with_authentication()self.assertEqual(response.status_code, 200)
创建菜品(分类有效)test_create_dish_with_valid_category()self.assertEqual(response.status_code, 201)
创建菜品(分类不存在)test_create_dish_with_invalid_category()self.assertEqual(response.status_code, 400)

覆盖了权限控制 + API 依赖数据,确保 Django DRF API 的稳定性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文生图语义识别插件使用(controlnet)

1. 插件下载(github) https://github.com/Mikubill/sd-webui-controlnet https://github.com/lllyasviel/ControlNet2. 模型下载(hugging face) https://github.com/Mikubill/sd-webui-controlnet/wiki/Model-download https://huggingface.co/bdsqlsz/qinglong_controlnet-l…

学者观察 | web3.0产业发展与技术融合——北京大学研究员肖臻

导语 肖臻老师认为在未来很长一段时间内,Web 3.0将和现在的Web 2.0共存。Web 3.0和人工智能(AI)的融合发展前景非常广阔,Web 3.0致力于打造去中心化的互联网生态系统,赋予用户更大的数据所有权和控制权,而…

【模型压缩+推理加速】知识蒸馏综述解读

知识蒸馏综述解读 论文: https://arxiv.org/abs/2006.05525 最近Deepseek R1的技术报告中,训练部分提到使用了知识蒸馏,就像系统性的看看蒸馏算法的原理。看了很多的博客,很多都没有详细把知识蒸馏系统的讲清楚。我们还是读一下…

vivo 湖仓架构的性能提升之旅

作者:郭小龙 vivo互联网 大数据高级研发工程师 导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景&#xff0c…

代码随想录算法训练营第十四天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

今日题目 226.翻转二叉树 题目链接:226. 翻转二叉树 - 力扣(LeetCode) 思考:翻转二叉树,就是对每一个根节点,都交换左右节点,左右节点进入递归继续交换它们的左右节点。 代码: # De…

Java设计模式--单例模式

单例模式(构造器私有) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 反射可以破坏单例模式…

2025年如何避免使用验证码求解器时被IP封禁

引言 2025年,验证码求解器已成为自动化网络抓取和其他在线流程的关键工具。然而,自动化用户面临的一个常见挑战是IP封禁。当网站检测到自动化活动时,通常会阻止发出请求的IP地址,导致验证码挑战无法解决。本文将探讨使用验证码求…

JVM详解(包括JVM内存模型与GC垃圾回收)

📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…

【无标题】大亚湾文化体育场多美啊。

请推荐一些常用并且免费的,可直接在线运行【Python】代码的平台并列出对应网址 好的,用户想让我推荐一些常用且免费的、可以直接在线运行Python代码的平台,并且需要列出对应的网址。我需要先回想一下自己知道的在线Python运行环境&#xff0…

权限提升—Windows权限提升土豆家族溢出漏洞通杀全系

前言 OK,Java安全更新不下去了,实在是太难啦啊,想起来提权这一块没怎么更新过,接下来都主要是更新提权这一块的文章了,Java安全的话以后有耐心再搞了。 手动提权 今天主要是讲这个手动的提权,手动提权相…

Vue3 知识点总结

Vue3 知识点总结 1. 核心概念 1.1 Composition API 1.1.1 setup 函数 setup是Vue3中的新的配置项,是组件内使用Composition API的入口在setup中定义的变量和方法需要return才能在模板中使用setup执行时机在beforeCreate之前,this不可用 export defa…

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL错误解决:Invalid default value for xxx_time’问题分析与修复方案 问题描述 在MySQL数据库操作中,当尝试创建或修改表结构时,可能会遇到以下错误信息: [bug] [42000][1067] Invalid default value for xxx_time这个错误…

Go环境相关理解

Linux上安装的环境变量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ‌go.mod文件定义了模块的路径和依赖版本‌。它遵循 语义化版本2.0.0规范,记录了当前项目所依…

Next.js 深度解析:全栈React框架的架构哲学与实践精髓

Next.js 作为 React 生态中最流行的全栈框架,已经超越了简单的SSR工具,发展成为完整的Web开发解决方案。以下从八个维度进行深度剖析: 一、核心架构设计 双引擎驱动模型 页面路由系统:基于文件系统的约定式路由渲染引擎&#xff…

禾赛盈利了,但激光雷达没有胜利

还远没有到激光雷达党欢呼的时候。 3月,随着禾赛科技公布2024年报,全世界第一家也是唯一一家实现全年盈利的激光雷达上市公司诞生,为了这个盈利目标,禾赛科技奋斗了十年。 但极大的出货量和不高的盈利水平,让禾赛科技…

心房颤动新机制:ATM/p53通路早期抑制

急性心肌梗死(AMI)是心血管疾病中的“大魔头”,它悄无声息地侵蚀着心脏的肌肉,导致心脏功能受损,严重时甚至危及生命。而心房颤动(AF),这一常见的心律失常,往往在AMI后悄…

Linux 安装 Redis

虚拟机安装 linux https://www.bilibili.com/video/BVldD42177qg?p16 1、安装 gcc,编译环境 yum y install gcc-g 2、将 redis-7.2.4.tar.gz放到 linux。如,放到 opt 里 3、进入/opt 目录下,解压 tar -zxvf redis-7.2.4.tar.gz 4、进入 redis-7.2.4.tar…

六级备考 词汇量积累(day11)

sculpture 雕像 allege 指责,声称 pledge 发誓 breach 违背,违反 defaulty 违约,违反 infringe 侵犯 infringing on small farmers interest blacmail 勒索 idle 无所事事的 deceive 欺骗 perceive 察觉 conceive 设想 conception 设想 verdi…

关于金碟K3,禁用和启用需要流程审批后执行

真是难受,是设计师蠢呢自己问题比较多呢,现在都还没有弄好 点击禁用和启用,通过流程来执行 到底是蠢呢还是设计问题,搞了半日没有效果,搞那么复杂! 而且有样板都没有草鞋成功 BOS设计,表单属性,操作列表: 1、启用禁用流程