尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Django REST Framework 测试提速:django-test-plus APITestCase 完全指南

Django REST Framework 测试提速:django-test-plus APITestCase 完全指南 Django REST Framework 测试提速django-test-plus APITestCase 完全指南【免费下载链接】django-test-plusUseful additions to Djangos default TestCase项目地址: https://gitcode.com/gh_mirrors/dj/django-test-plusdjango-test-plus 是一款专为 Django 测试提速而生的开源增强库它提供的APITestCase将 Django 默认 TestCase 与 Django REST Framework 的APIClient无缝整合让你用更少的样板代码完成 DRF API 测试写得快、跑得稳、读得懂。本文面向新手带你从零上手这套完整测试方案。为什么 APITestCase 能给你的 DRF 测试提速 用过 Django REST Framework 的开发者都有共鸣写 API 测试时大量时间耗在了样板代码上。传统痛点django-test-plus 的解法每次请求都要reverse(view-name, args[...])直接按 URL 名称请求self.get(view-name)手动断言assertEqual(response.status_code, 200)一句话断言self.response_200()反复传递 response 对象给各种断言最近一次响应和上下文自动保存断言开箱即用手动创建测试用户、配置认证make_user()一行造用户login()上下文自动切换N1 查询隐患难以发现assertNumQueriesLessThan()守住查询数量上限它的定位是增量增强APITestCase继承自 Django 官方 TestCase你已知的所有断言、事务隔离、数据库清理行为全部保留可以逐个方法渐进式采用零迁移成本。一键安装pip 两条命令搞定 ✅pip install django-test-plus pip install djangorestframework 小提示使用APITestCase的前提是项目已安装 Django REST Framework。该库支持 Django 4.2 LTS 至 6.x、Python 3.10 至 3.15。APITestCase 快速上手只改一行继承APITestCase定义在test_plus/test.py文件中核心逻辑非常直观——在setUp()阶段把测试客户端替换成 DRF 的APIClient客户端的加载逻辑在test_plus/compat.py中。你只需要继承它然后享受 DRF 客户端 test-plus 助力的双重便利from test_plus import APITestCase class MyAPITestCase(APITestCase): def test_post(self): data {prop: value} self.post(view-json, datadata, extra{format: json}) self.response_200()对比一下默认django.test.TestCase的等价写法你需要导入reverse、手动拼 URL、调用self.client.post(url, formatjson)、再断言状态码——至少多出 3 行样板而self.post()返回后最近一次响应已自动存入self.last_response断言无需再传参。如果你更喜欢显式定义也可以自己声明一个DRF 测试文档在docs/usage.md中from test_plus import TestCase from rest_framework.test import APIClient class APITestCase(TestCase): client_class APIClientDRF 测试常见场景实践 状态码断言可读性拉满所有response_###()方法都会自动作用于最近一次响应def test_create(self): self.post(api-list, data{name: x}, extra{format: json}) self.response_201() # 创建成功 def test_forbidden(self): self.get(api-detail, pk1) self.response_403() # 未认证被拒绝此外还有一整套语义化断言assert_http_200_ok()、assert_http_404_not_found()等覆盖 MDN 文档中的主流状态码定义在test_plus/status_codes.py在 IDE 中可直接搜索补全。一行造用户 上下文切换登录测试 API 权限逻辑时最繁琐的就是准备用户和认证def test_auth(self): user self.make_user(u1) # 一行创建默认密码 password self.assertLoginRequired(my-protected-view) with self.login(user): # 自动登录退出上下文自动登出 self.get_check_200(my-protected-view)make_user()还支持传入权限列表如perms[myapp.create_widget]和自定义 Factory Boy 工厂类方便适配定制过的用户模型。用查询计数拦截 N1 性能回退API 列表接口最容易出现 N1 问题。test-plus 的查询断言不锁定精确数字而是设一个上限数据变动也不会频繁改测试def test_list_performance(self): with self.assertNumQueriesLessThan(7): self.get(api-list)pytest 用户福音tp_api 零配置接入如果你用 pytest pytest-django插件注册于test_plus/plugin.py通过pytest11自动注册无需任何额外配置直接申请 fixture 即可def test_api(tp_api, db): response tp_api.client.post(myapi, formatjson) assert response.status_code 200tp使用普通 Django 测试客户端获得全部 test-plus 方法tp_api使用 DRFAPIClient背书的同一套助手api_client裸的 DRF 客户端供自由组合⚠️ 注意tp/tp_api不自动管理数据库访问凡涉及make_user()、login()或查询计数辅助方法的测试请同时申请 pytest-django 的dbfixture。核心方法速查表 方法作用self.get(url-name)/post()按名称发起请求自动反解 URL支持 args/kwargsself.response_200()断言最近响应状态码另备assert_http_200_ok()self.get_check_200(url-name)请求并断言 200一步到位self.make_user(u1)创建测试用户支持权限与工厂类with self.login(user):以指定用户身份测试自动登出assertNumQueriesLessThan(n)断言查询次数低于 n拦截 N1assertGoodView(url-name)一行验证 200 响应 查询数 50总结django-test-plus 用APITestCase把 Django REST Framework 测试中最重复的三件事——发请求、断状态码、管认证——压缩成了直觉化的一行行方法。无论 unittest 还是 pytest 风格、无论函数视图还是 DRF 序列化器这套助手都能让你从样板代码中解放出来把精力放回业务逻辑本身。装上它你的 API 测试套件从今天起就会变得更快、更短、更好维护。【免费下载链接】django-test-plusUseful additions to Djangos default TestCase项目地址: https://gitcode.com/gh_mirrors/dj/django-test-plus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表