【后端】【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.pswp.cn/pingmian/73439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73439.shtml
英文地址,請注明出處:http://en.pswp.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、啟用禁用流程