You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何程序化测试受Django-oauth-toolkit保护的Django API?

Django OAuth2 保护API的单元测试简化方案

不用折腾复杂的伪认证,直接在测试用例里生成合法的Bearer Token就行,步骤很简单:

1. 提前准备测试数据

在测试类的setUp方法里创建测试用户、OAuth2应用,再生成有效的访问token,这些都是测试前的一次性操作:

from django.test import TestCase
from django.contrib.auth.models import User
from oauth2_provider.models import Application, AccessToken
from datetime import datetime, timedelta

class MeetingAPITest(TestCase):
    def setUp(self):
        # 创建测试用户
        self.user = User.objects.create_user(username='testuser', password='testpass123')
        # 创建OAuth2应用,配置要和你项目里的应用类型匹配
        self.application = Application.objects.create(
            name='Test App',
            client_type=Application.CLIENT_CONFIDENTIAL,
            authorization_grant_type=Application.GRANT_PASSWORD,
            user=self.user,
        )
        # 生成有效期内的访问token
        self.access_token = AccessToken.objects.create(
            user=self.user,
            token='test-token-123',
            application=self.application,
            expires=datetime.now() + timedelta(days=1),
            scope='read'  # 权限范围要和你的API要求一致
        )

2. 测试请求携带token

在发起测试请求时,把token放到Authorization请求头里就行:

def test_get_meeting_list(self):
    response = self.client.get(
        '/meetings/',
        HTTP_AUTHORIZATION=f'Bearer {self.access_token.token}'
    )
    self.assertEqual(response.status_code, 200)

更简化的方式:用官方测试基类

Django OAuth Toolkit提供了OAuth2TestCase基类,能帮你省去不少重复代码:

from oauth2_provider.test import OAuth2TestCase
from oauth2_provider.models import Application

class MeetingAPITest(OAuth2TestCase):
    def setUp(self):
        super().setUp()
        self.user = self.create_user(username='testuser', password='testpass123')
        self.application = self.create_application(
            name='Test App',
            user=self.user,
            client_type=Application.CLIENT_CONFIDENTIAL,
            authorization_grant_type=Application.GRANT_PASSWORD
        )
        # 直接生成token
        self.access_token = self.get_access_token(self.user)

    def test_get_meeting_list(self):
        response = self.client.get(
            '/meetings/',
            HTTP_AUTHORIZATION=f'Bearer {self.access_token.token}'
        )
        self.assertEqual(response.status_code, 200)

这种方式用真实的token生成逻辑,比伪认证更可靠,代码也简洁很多。

内容的提问来源于stack exchange,提问作者Étalo Holanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:39:55