每天40分玩转Django:Django测试
Django测试
一、今日学习内容概述
| 学习模块 | 重要程度 | 主要内容 |
|---|---|---|
| 测试基础 | ⭐⭐⭐⭐⭐ | TestCase、断言方法 |
| 模型测试 | ⭐⭐⭐⭐⭐ | 模型方法、数据验证 |
| 视图测试 | ⭐⭐⭐⭐ | 请求处理、响应验证 |
| 表单测试 | ⭐⭐⭐⭐ | 表单验证、数据处理 |
| 覆盖率测试 | ⭐⭐⭐⭐ | coverage配置、报告生成 |
二、测试基础示例
2.1 基本测试类
# tests/test_base.py
from django.test import TestCase
from django.contrib.auth.models import User
from .models import Articleclass ArticleTestCase(TestCase):def setUp(self):"""测试前准备工作"""# 创建测试用户self.user = User.objects.create_user(username='testuser',email='test@example.com',password='testpass123')# 创建测试文章self.article = Article.objects.create(title='Test Article',content='Test Content',author=self.user)def tearDown(self):"""测试后清理工作"""self.user.delete()self.article.delete()def test_article_creation(self):"""测试文章创建"""self.assertEqual(self.article.title, 'Test Article')self.assertEqual(self.article.author, self.user)def test_article_str_representation(self):"""测试文章字符串表示"""self.assertEqual(str(self.article), 'Test Article')
2.2 测试工具类
# tests/test_utils.py
import unittest
from django.test import TestCase
from .utils import calculate_reading_time, generate_slugclass UtilsTestCase(TestCase):def test_reading_time_calculation(self):"""测试阅读时间计算"""# 准备测试数据content = ' '.join(['word'] * 500) # 500个单词# 调用测试函数reading_time = calculate_reading_time(content)# 验证结果(假设每分钟阅读200个单词)self.assertEqual(reading_time, 2.5)def test_slug_generation(self):"""测试slug生成"""test_cases = [('Hello World', 'hello-world'),('测试文章', 'ce-shi-wen-zhang'),('Python & Django', 'python-django'),]for title, expected_slug in test_cases:with self.subTest(title=title):self.assertEqual(generate_slug(title), expected_slug)
三、模型测试示例
# tests/test_models.py
from django.test import TestCase
from django.core.exceptions import ValidationError
from django.utils import timezone
from .models import Article, Categoryclass ArticleModelTest(TestCase):@classmethoddef setUpTestData(cls):"""创建测试数据"""cls.category = Category.objects.create(name='Test Category')cls.article = Article.objects.create(title='Test Article',content='Test Content',category=cls.category,status='draft')def test_title_max_length(self):"""测试标题长度限制"""article = Article.objects.get(id=self.article.id)max_length = article._meta.get_field('title').max_lengthself.assertEqual(max_length, 200)def test_article_label(self):"""测试字段标签"""article = Article.objects.get(id=self.article.id)title_label = article._meta.get_field('title').verbose_nameself.assertEqual(title_label, '标题')def test_publish_article(self):"""测试文章发布功能"""article = Article.objects.get(id=self.article.id)article.publish()self.assertEqual(article.status, 'published')self.assertIsNotNone(article.published_at)def test_article_ordering(self):"""测试文章排序"""Article.objects.create(title='Second Article',content='Content',category=self.category,status='published')articles = Article.objects.all()self.assertEqual(articles[0].title, 'Second Article')
四、视图测试示例
# tests/test_views.py
from django.test import TestCase, Client
from django.urls import reverse
from django.contrib.auth.models import User
from .models import Articleclass ArticleViewsTest(TestCase):def setUp(self):self.client = Client()self.user = User.objects.create_user(username='testuser',password='testpass123')self.article = Article.objects.create(title='Test Article',content='Test Content',author=self.user)def test_article_list_view(self):"""测试文章列表视图"""response = self.client.get(reverse('article_list'))self.assertEqual(response.status_code, 200)self.assertTemplateUsed(response, 'articles/article_list.html')self.assertContains(response, 'Test Article')def test_article_detail_view(self):"""测试文章详情视图"""response = self.client.get(reverse('article_detail', args=[self.article.id]))self.assertEqual(response.status_code, 200)self.assertTemplateUsed(response, 'articles/article_detail.html')self.assertEqual(response.context['article'], self.article)def test_create_article_view(self):"""测试创建文章视图"""self.client.login(username='testuser', password='testpass123')response = self.client.post(reverse('article_create'), {'title': 'New Article','content': 'New Content',})self.assertEqual(response.status_code, 302) # 重定向self.assertTrue(Article.objects.filter(title='New Article').exists())
五、表单测试示例
# tests/test_forms.py
from django.test import TestCase
from .forms import ArticleForm, CommentFormclass ArticleFormTest(TestCase):def test_article_form_valid_data(self):"""测试表单有效数据"""form = ArticleForm(data={'title': 'Test Article','content': 'Test Content','category': 1,'status': 'draft'})self.assertTrue(form.is_valid())def test_article_form_invalid_data(self):"""测试表单无效数据"""form = ArticleForm(data={})self.assertFalse(form.is_valid())self.assertEqual(len(form.errors), 3) # title, content, category 必填def test_article_form_title_max_length(self):"""测试标题长度限制"""form = ArticleForm(data={'title': 'x' * 201, # 超过最大长度'content': 'Test Content','category': 1})self.assertFalse(form.is_valid())self.assertIn('title', form.errors)
六、覆盖率测试配置
6.1 安装配置
# 安装coverage
pip install coverage# 运行测试并收集覆盖率数据
coverage run manage.py test# 生成覆盖率报告
coverage report
coverage html
6.2 配置文件
# .coveragerc
[run]
source = .
omit =*/migrations/**/tests/**/venv/*manage.py[report]
exclude_lines =pragma: no coverdef __repr__raise NotImplementedErrorif settings.DEBUGpass
七、测试流程图

八、高级测试技巧
8.1 异步测试
from django.test import TestCase
import asyncioclass AsyncTests(TestCase):async def test_async_view(self):"""测试异步视图"""response = await self.async_client.get('/async-view/')self.assertEqual(response.status_code, 200)async def test_async_task(self):"""测试异步任务"""result = await async_task()self.assertTrue(result)
8.2 测试fixtures
# tests/fixtures/test_data.json
[{"model": "app.category","pk": 1,"fields": {"name": "Test Category","description": "Test Description"}}
]# tests/test_with_fixtures.py
class CategoryTestCase(TestCase):fixtures = ['test_data.json']def test_category_exists(self):"""测试fixture数据加载"""category = Category.objects.get(pk=1)self.assertEqual(category.name, 'Test Category')
九、测试最佳实践
-
测试命名规范
- 文件名以test_开头
- 测试类以Test结尾
- 测试方法以test_开头
-
测试组织结构
- 按功能模块分组
- 保持测试独立性
- 避免测试间依赖
-
测试用例设计
- 包含边界条件
- 考虑异常情况
- 验证业务规则
-
性能优化
- 使用setUpTestData
- 合理使用事务
- 避免不必要的数据库操作
怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!
相关文章:
每天40分玩转Django:Django测试
Django测试 一、今日学习内容概述 学习模块重要程度主要内容测试基础⭐⭐⭐⭐⭐TestCase、断言方法模型测试⭐⭐⭐⭐⭐模型方法、数据验证视图测试⭐⭐⭐⭐请求处理、响应验证表单测试⭐⭐⭐⭐表单验证、数据处理覆盖率测试⭐⭐⭐⭐coverage配置、报告生成 二、测试基础示例…...
JS子页面调用父页面函数,监听刷新事件
目录 1.子页面调用父页面的函数 2.监听刷新事件 1.子页面调用父页面的方法 我们先来说说什么是子页面,在我这里子页面就是域名一样,然后使用iframe引入的页面就是我所说的子页面,为什么需要用到这个功能,是为了实现跨页面交互与…...
Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能
背景:现在有一个新需求,需要借助树结构来实现词库的分类管理,树的节点是不同的分类,不同的分类可以有自己的词库,所以父子节点是互不影响的;同样为了选择的方便性,提出了新需求,选择…...
详细介绍如何使用rapidjson读取json文件
本文主要详细介绍如何使用rapidjson库来实现.json文件的读取,分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中,{} 和 [] 分别表示不同的数据结构&…...
【Qt】显示类控件:QLabel、QLCDNumber、QProgressBar、QCalendarWidget
目录 QLabel QFrame 例子: textFormat pixmap、scaledContents alignment wordWrap、indent、margin buddy QLCDNumber 例子: QTimer QProgressBar 例子: QCalendarWidget 例子: QLabel 标签控件,用来显示…...
设计模式-访问者设计模式
介绍 访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 问题:在一个机构里面有两种员工,1.Teacher 2.Engineer 员…...
Spring框架IOC
目录 一、Spring框架的介绍 1.1 Spring框架的概述 1.2 Spring框架的优点 二、Spring的核心 IOC技术 2.1 什么是IOC 2.2 IOC的程序入门 2.3 IOC技术总结 2.4 Spring框架的Bean管理的配置文件方式 一、Spring框架的介绍 1.1 Spring框架的概述 Spring是一个开放源代码的…...
有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?
想找个 “免费” 的 ERP 软件? 咱得知道,ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全,能免费才怪呢!真要是有免费的,早就火遍大江南北,说不定把市场都垄断了&…...
思科CCNA认证都学什么考什么?
关注 工 仲 好:IT运维大本营CCNA考试要学的东西很多,你不要看它只是一个初级认证,但是它的专业内容知识是不少的,你想要学好也是需要下一番苦功的。 那么考CCNA需要学哪些东西呢?下面我们就来了解一下吧。 01、考CCN…...
模型部署学习笔记——模型部署关键知识点总结
模型部署学习笔记——模型部署关键知识点总结 模型部署学习笔记——模型部署关键知识点总结1. CUDA中Grid和Block的定义是什么?Shared Memory的定义?Bank Conflict的定义?Stream和Event的定义?2. TensorRT的工作流程?3…...
22智能 狄克斯特拉算法复习
狄克斯特拉算法 图 根据边有无方向分为: 有向图、无向图 根据边有无权重变量分为: 有权图、无权图 根据顶点是否连通分为: 连通图和非连通图入度:表示有多少条边指向该顶点出度:表示有多少条边从该顶点指出算法步骤&a…...
首个!艾灵参编的工业边缘计算国家标准正式发布
近日,艾灵参与编制的《面向工业应用的边缘计算 应用指南》(以下简称《标准》)国家标准正式发布,将于2025年5月1日起实施。这一里程碑式的成果,不仅标志着我国在工业边缘计算技术标准化领域取得了重大突破,成…...
curl也支持断点续传
curl断点续传 访问外网资源,特别是Github上比较大的资源,例如,笔者遇到的calico发布包,经常会遇到在浏览器上下载半途中断。 那么支持断点续传的下载工具,就是应对这种情况的好帮手! 简单的断点续传工具…...
交换机链路聚合(手动负载分担模式)(eNSP)
目录 交换机SW_C配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 交换机SW_D配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 验证: 链路聚合的端口清除: 交换机端口聚合的存在意义主要有以下几点: 增加带宽 提高冗余性和可靠性 实现负载均衡 降低成本 …...
jmeter 接口性能测试 学习笔记
目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1:测试接口接口准备线程组添加线程组配置线程组值线程数(Number of Threads)Ramp-Up 时间(Ramp-Up Period)循环次数(Loop Count&…...
`HashMap`、`Hashtable` 和 `HashSet`的区别
HashMap、Hashtable 和 HashSet 都是 Java 中常用的集合类,它们的功能和实现有所不同,尽管它们都使用哈希表(hash table)作为底层数据结构。以下是它们之间的主要区别: 1. HashMap 和 Hashtable 的区别 特性HashMapH…...
Arduino中解析JSON数据
JSON JSON(JavaScript Object Notation,即JavaScript对象表示法)是一种广泛采用的开放标准文件格式与数据交换格式。它兼具人类可读性和机器易解析性,使得数据的编写、阅读、生成及解析都变得十分便捷。JSON的设计不依赖于特定编…...
linux----文件访问(c语言)
linux文件访问相关函数 打开文件函数 - open 函数原型:int open(const char *pathname, int flags, mode_t mode);参数说明: pathname:这是要打开的文件的路径名,可以是绝对路径或者相对路径。例如,"/home/user/…...
源码分析之Openlayers中MousePosition鼠标位置控件
概述 本文主要介绍 Openlayers 中的MousePosition鼠标位置控件,该控件会创建一个元素在页面的右上方用来实时显示鼠标光标的位置坐标。该控件在实际应用很有效,可以实时获取鼠标位置,但是一般控件元素都会自定义。 源码分析 MousePosition…...
以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
深度学习框架YOLOV8模型如何训练水下生物检测数据集 构建基于YOLOv8➕pyqt5的水下生物检测系统 海胆‘, ‘海参‘, ‘扇贝‘, ‘海星‘, ‘水草
享基于YOLOv8➕pyqt5的水下生物检测系统内含7600张水下生物数据集 包括[‘海胆’, ‘海参’, ‘扇贝’, ‘海星’, ‘水草’],5类也可自行替换模型,使用该界面做其他检测 这是一个非常经典的计算机视觉应用项目,结合了深度学习的目标检测&…...
JavaScript PPTX操作终极指南:5分钟掌握PPT自动化生成技巧
JavaScript PPTX操作终极指南:5分钟掌握PPT自动化生成技巧 【免费下载链接】js-pptx Pure Javascript reader/writer for PowerPoint 项目地址: https://gitcode.com/gh_mirrors/js/js-pptx 在当今数字化时代,自动化办公已经成为提升工作效率的关…...
基于YOLOv5和swin-Unet的带钢缺陷智能识别系统
十一、基于YOLOv5和swin-Unet的带钢缺陷智能识别系统 1.带标签数据集,包括检测和分割数据集,其中检测数据共计6类,1800张图片。 2.含模型训练权重。 3.pyqt5设计的界面,带登录界面,注册界面和运行界面。 4.提供详细的环…...
013、部署篇:从本地开发到云原生(Docker/K8s)服务化部署
013、部署篇:从本地开发到云原生(Docker/K8s)服务化部署一、从一次深夜调试说起 上周三凌晨两点,我被报警短信吵醒——线上RAG服务的响应时间从200ms飙到了5秒。登录服务器一看,CPU跑满了,内存倒是还剩不少…...
泉盛UV-K5/K6固件自定义:解锁专业对讲机功能的终极指南
泉盛UV-K5/K6固件自定义:解锁专业对讲机功能的终极指南 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 你是否曾想过,一台…...
21.【RTL_Synthesis】Analyzing Synthesis Results(综合结果分析)
🔍 分析综合结果:从数字到洞察 我们已经学会了用 Yosys 把 RTL 综合成门级网表,也知道了如何用脚本批量处理不同工艺角。但综合工具跑完之后,我们得到了一堆数字:多少门、多少触发器、面积多大……这些数字到底意味着什…...
突破Windows与Android壁垒:APK-Installer重构跨平台应用安装体验
突破Windows与Android壁垒:APK-Installer重构跨平台应用安装体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化生活中,两个场景常常困…...
DeOldify性能基准测试:不同GPU配置下的处理速度对比
DeOldify性能基准测试:不同GPU配置下的处理速度对比 最近在折腾老照片修复,用上了DeOldify这个工具。效果确实惊艳,能把黑白照片变得色彩鲜活。但有个问题一直困扰我:处理速度。一张照片等几分钟还能接受,要是批量处理…...
【实战指南】ComfyUI-Florence2模型加载问题疑难解决:从异常排查到稳定运行的实践指南
【实战指南】ComfyUI-Florence2模型加载问题疑难解决:从异常排查到稳定运行的实践指南 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 在使用ComfyUI-Florence2视觉…...
Git 批量拉取所有远程分支到本地(Git Bash + CMD 双版本)
在使用 Git 开发时,经常需要将远程所有分支一次性拉取到本地,避免手动逐个创建。下面分别给出 Git Bash 和 Windows CMD 下的一键批量拉取脚本。一、Git Bash 脚本(适用于 Git Bash / Linux /macOS)bash运行git fetch originfor b…...
