如何为Django项目中返回JSON数据的URL编写单元测试
Django JSON类型接口的单元测试编写方法
测试json_list这类返回模型JSON数据的路由,核心校验三个维度即可:路由可访问性、响应格式正确性、返回数据准确性,直接在对应app的tests.py里写测试用例就行,用Django自带的测试框架不需要额外依赖。
基础测试用例示例
from django.test import TestCase from django.urls import reverse from .models import 你的模型类 # 替换成你视图里用到的实际模型,比如Article、Goods class JsonListRouteTest(TestCase): def setUp(self): # 测试前置操作:构造隔离的测试数据,测试结束后会自动清理,不会影响现有数据库数据 self.test_data1 = 你的模型类.objects.create( # 填入模型必填字段,比如title="测试内容1", content="测试正文1" ) self.test_data2 = 你的模型类.objects.create( # title="测试内容2", content="测试正文2" ) # 通过路由名反向解析地址,后续路由前缀调整时不需要修改测试代码 self.target_url = reverse("json_list") def test_route_normal_access(self): """校验路由可以正常访问,响应格式为JSON""" resp = self.client.get(self.target_url) # 校验状态码为200 self.assertEqual(resp.status_code, 200) # 校验响应头为JSON格式 self.assertEqual(resp["Content-Type"], "application/json") def test_response_data_correct(self): """校验返回的JSON内容和数据库数据一致""" resp = self.client.get(self.target_url) resp_json = resp.json() # 如果你的接口直接返回模型列表,就直接校验长度 self.assertEqual(len(resp_json), 2) # 逐字段匹配数据即可,示例: # self.assertEqual(resp_json[0]["title"], self.test_data1.title) # self.assertEqual(resp_json[1]["title"], self.test_data2.title)
常见场景适配
- 如果接口需要登录才能访问,在
setUp方法里加测试用户登录逻辑即可:
from django.contrib.auth.models import User # setUp里追加 self.test_user = User.objects.create_user(username="testuser", password="testpass123") self.client.login(username="testuser", password="testpass123")
- 如果接口返回带统一外层包装(比如
{"code": 0, "data": [数据列表], "msg": "success"}),校验内容时先取对应字段再匹配,比如拿resp_json["data"]做数据长度、字段的校验。 - 不要在测试里硬编码写死
/list/作为请求地址,始终用reverse通过路由名解析地址,避免后续路由调整导致测试失效。
内容的提问来源于stack exchange,提问作者Ivan Campelo
相关产品推荐
相关产品推荐

