如何为Django ListView列表视图编写集成测试(附示例)
Django HomeView 集成测试参考实现
以下测试用例基于Django自带测试框架编写,覆盖视图核心逻辑,可直接放在对应app的tests.py或测试目录下的视图测试文件中使用。
测试覆盖核心场景
- 无参数访问时视图正常响应、模板渲染正确、上下文变量符合预期
- 分页逻辑(每页10条)运行正常
- 携带
q参数时,多字段模糊搜索逻辑生效,搜索关键词正确传入上下文 - 无匹配搜索结果时返回空列表不报错
测试代码示例
from django.test import TestCase, Client from django.urls import reverse from .models import Donor class HomeViewTest(TestCase): def setUp(self): # 初始化测试客户端、视图访问路径 self.client = Client() # 注意:将reverse内的'home'替换为你项目中HomeView绑定的URL name值 self.view_url = reverse('home') # 构造测试基础数据,共13条,满足分页测试场景 self.test_donor1 = Donor.objects.create( name="张三", location="北京", sex="男", age=28, blood_group="A型" ) self.test_donor2 = Donor.objects.create( name="李四", location="上海", sex="男", age=32, blood_group="B型" ) self.test_donor3 = Donor.objects.create( name="王五", location="广州", sex="女", age=25, blood_group="O型" ) for idx in range(10): Donor.objects.create( name=f"测试捐血者{idx}", location="深圳", sex="男", age=20+idx, blood_group="AB型" ) def test_base_view_response(self): """测试无参数访问视图的基础响应""" resp = self.client.get(self.view_url) # 校验状态码为200 self.assertEqual(resp.status_code, 200) # 校验使用正确模板 self.assertTemplateUsed(resp, 'recipient/home.html') # 校验上下文存在donors变量 self.assertIn('donors', resp.context) # 校验无搜索参数时q值为None self.assertIsNone(resp.context['q']) def test_pagination_logic(self): """测试分页逻辑正确性""" # 第一页应返回10条数据 resp_page1 = self.client.get(self.view_url) self.assertEqual(len(resp_page1.context['donors']), 10) # 第二页应返回剩余3条数据 resp_page2 = self.client.get(f"{self.view_url}?page=2") self.assertEqual(resp_page2.status_code, 200) self.assertEqual(len(resp_page2.context['donors']), 3) def test_search_filter_logic(self): """测试多字段搜索逻辑正确性""" # 按姓名搜索 resp_name = self.client.get(f"{self.view_url}?q=张三") self.assertEqual(resp_name.status_code, 200) self.assertEqual(len(resp_name.context['donors']), 1) self.assertEqual(resp_name.context['donors'][0].name, "张三") self.assertEqual(resp_name.context['q'], "张三") # 按血型搜索 resp_blood = self.client.get(f"{self.view_url}?q=B型") self.assertEqual(len(resp_blood.context['donors']), 1) self.assertEqual(resp_blood.context['donors'][0].blood_group, "B型") # 按地点搜索 resp_loc = self.client.get(f"{self.view_url}?q=广州") self.assertEqual(len(resp_loc.context['donors']), 1) self.assertEqual(resp_loc.context['donors'][0].location, "广州") # 无匹配结果场景 resp_empty = self.client.get(f"{self.view_url}?q=不存在的关键词xyz") self.assertEqual(len(resp_empty.context['donors']), 0)
测试运行说明
- 全量运行项目测试:在项目根目录执行命令
python manage.py test - 仅运行当前视图测试:执行命令
python manage.py test 你的app名称.tests.HomeViewTest - 运行前注意替换代码中URL反向解析的参数值,测试数据的字段赋值要和Donor模型的字段约束保持一致,避免测试数据创建失败。
内容的提问来源于stack exchange,提问作者syed towfiqur rahim
相关产品推荐
相关产品推荐

