如何程序化测试受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
相关产品推荐
相关产品推荐

