手机网站 微信网站,好看的扁平化网站,网站建设报价选兴田德润,网页前端制作招聘Django测试
一、今日学习内容概述
学习模块重要程度主要内容测试基础⭐⭐⭐⭐⭐TestCase、断言方法模型测试⭐⭐⭐⭐⭐模型方法、数据验证视图测试⭐⭐⭐⭐请求处理、响应验证表单测试⭐⭐⭐⭐表单验证、数据处理覆盖率测试⭐⭐⭐⭐coverage配置、报告生成
二、测试基础示例…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(usernametestuser,emailtestexample.com,passwordtestpass123)# 创建测试文章self.article Article.objects.create(titleTest Article,contentTest Content,authorself.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(titletitle):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(nameTest Category)cls.article Article.objects.create(titleTest Article,contentTest Content,categorycls.category,statusdraft)def test_title_max_length(self):测试标题长度限制article Article.objects.get(idself.article.id)max_length article._meta.get_field(title).max_lengthself.assertEqual(max_length, 200)def test_article_label(self):测试字段标签article Article.objects.get(idself.article.id)title_label article._meta.get_field(title).verbose_nameself.assertEqual(title_label, 标题)def test_publish_article(self):测试文章发布功能article Article.objects.get(idself.article.id)article.publish()self.assertEqual(article.status, published)self.assertIsNotNone(article.published_at)def test_article_ordering(self):测试文章排序Article.objects.create(titleSecond Article,contentContent,categoryself.category,statuspublished)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(usernametestuser,passwordtestpass123)self.article Article.objects.create(titleTest Article,contentTest Content,authorself.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(usernametestuser, passwordtestpass123)response self.client.post(reverse(article_create), {title: New Article,content: New Content,})self.assertEqual(response.status_code, 302) # 重定向self.assertTrue(Article.objects.filter(titleNew 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 html6.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(pk1)self.assertEqual(category.name, Test Category)九、测试最佳实践 测试命名规范 文件名以test_开头测试类以Test结尾测试方法以test_开头 测试组织结构 按功能模块分组保持测试独立性避免测试间依赖 测试用例设计 包含边界条件考虑异常情况验证业务规则 性能优化 使用setUpTestData合理使用事务避免不必要的数据库操作 怎么样今天的内容还满意吗再次感谢朋友们的观看关注GZH凡人的AI工具箱回复666送您价值199的AI大礼包。最后祝您早日实现财务自由还请给个赞谢谢