Django登录与令牌获取功能测试实现方法咨询
Django登录功能测试代码实现
核心测试流程
测试主要覆盖三个关键环节:
- 发起登录请求并验证令牌获取
- 携带合法令牌访问受保护视图
- 验证未授权状态下的访问限制
代码实现(以JWT认证为例)
假设你的项目采用JWT令牌认证,登录接口为/api/login/,受保护视图包括/api/profile/和/api/dashboard/:
from django.test import TestCase from django.contrib.auth.models import User from rest_framework.test import APIClient from rest_framework import status class LoginFlowTests(TestCase): def setUp(self): # 初始化测试环境 self.client = APIClient() # 创建测试用户 self.test_user = User.objects.create_user( username='test_user', password='test_pass_123', email='test@example.com' ) # 定义接口路径 self.login_endpoint = '/api/login/' self.profile_endpoint = '/api/profile/' self.dashboard_endpoint = '/api/dashboard/' def test_full_login_and_protected_access(self): # 1. 发起登录请求获取令牌 login_payload = { 'username': 'test_user', 'password': 'test_pass_123' } login_response = self.client.post(self.login_endpoint, login_payload, format='json') # 验证登录成功并拿到令牌 self.assertEqual(login_response.status_code, status.HTTP_200_OK) self.assertIn('token', login_response.data) auth_token = login_response.data['token'] # 2. 携带令牌访问个人资料视图 self.client.credentials(HTTP_AUTHORIZATION=f'Bearer {auth_token}') profile_response = self.client.get(self.profile_endpoint) self.assertEqual(profile_response.status_code, status.HTTP_200_OK) self.assertEqual(profile_response.data['username'], 'test_user') # 3. 携带令牌访问仪表盘视图 dashboard_response = self.client.get(self.dashboard_endpoint) self.assertEqual(dashboard_response.status_code, status.HTTP_200_OK) def test_unauthorized_access_blocked(self): # 未携带令牌直接访问受保护视图,验证返回401 profile_response = self.client.get(self.profile_endpoint) self.assertEqual(profile_response.status_code, status.HTTP_401_UNAUTHORIZED) dashboard_response = self.client.get(self.dashboard_endpoint) self.assertEqual(dashboard_response.status_code, status.HTTP_401_UNAUTHORIZED)
适配Session认证的测试写法
如果你的项目用Django原生Session认证,只需调整登录和验证逻辑:
def test_session_based_login_flow(self): # 发起表单登录请求 login_payload = { 'username': 'test_user', 'password': 'test_pass_123' } login_response = self.client.post('/accounts/login/', login_payload) # 验证登录成功(通常会重定向) self.assertEqual(login_response.status_code, status.HTTP_302_FOUND) # 访问受保护视图 profile_response = self.client.get('/accounts/profile/') self.assertEqual(profile_response.status_code, status.HTTP_200_OK)
关键说明
setUp方法:提前初始化测试用户和客户端,避免重复代码client.credentials():为请求头添加认证令牌,模拟已登录状态- 核心验证点:登录状态码、令牌存在性、受保护视图的权限控制、未授权拦截逻辑
内容的提问来源于stack exchange,提问作者kokorodo
相关产品推荐
相关产品推荐

