6.Django基于模拟浏览器的测试用例编写、python-slugify、django-taggit
内容提要:
使用django.test.Client编写模拟浏览器访问的测试用例,实用库python-slugify(url别名)、django-taggit(标签管理)学习。
《Django高级实战-开发企业及问答网站》作者Jack
——学习来源
视图代码的测试用例,除了前面讲过的django.test.RequestFactory,也可以使用dajngo.test.Client模拟浏览器的请求方式走整个django响应流程。
django.test中的Client类,用于模仿浏览器http请求。示例代码:
from django.test import Client
# 创建客户端
self.client = Clist()代码示例:
from django.test import client
from django.urls import reverse
from test_plus.test import TestCase
from .models import News
class NewsViewsTest(TestCase):
def setUp(self):
self.other_client = Client()
# 用户登录
self.client.login(username="user01",password="password")
self.other_client.login(username="user02",password="password")
self.first_news = News.objects.create(
user=self.user,
content="第一条记录"
)
self.second_news = News.objects.create(
user=self.user,
content="第二条记录"
)
self.third_news = News.objects.create(
user=self.other_user,
content="第二条记录",
reply=True,
parent=self.first_news
)
def test_news_list(self):
"""测试列表页功能"""
response self.client.get(reverse("news:list"))
assert response.status_code == 200
assert self.first_news in response.context["news_list"]
assert self.second_news in response.context["news_list"]
assert self.thrid_news not in response.context["news_list"]
def test_delete_news(self):
"""删除动态"""
initial_count = News.objects.count()
response = self.client.post(reverse("news:delete_news",kwargs={"pk":self.second_news.pk} ))
assert response.status_code = 302
assert News.objects.count() == initial_count - 1
def test_post_new(self):
initial_count = News.objects.count()
response = self.client.post(
reverse("news:post_news"),{"post":"内容文字"},
HTTP_X_REQUESTED_WITH="XMLHttpRequest" # 表示发送ajax请求
)
assert response.status_code == 200
assert News.objects.count() == initial_count + 1
def test_like_news(self):
response = self.client.post(
reverse("news:like_post"),{"news":self.first_news.pk},
HTTP_X_REQUESTED_WITH="XMLHttpRequest"
)
assert response.status_code == 200
assert self.first_news_count_likers() == 1
assert self.user in self.first_news.get_likers()
assert response.json()["likes"] == 1 # 从ajax请求的返回值中取值
python-slugify生成url别名
slugify是指可以根据一段标题,生成一个符合标题内容的拼音字符串(通常被称为url的别名)。
uuslug,用于生成一串uuid的url别名。
slugify的使用:
from slugify import slugify
text = "这里是标题内容"
print(slugify(text))
# 输出zhe-li-shi-biao-ti-nei-rong在models.py中集成slugify:
# models.py
# 重写模型中save方法即可
class Article(models.Model):
...省略...
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
self.slug = slugify(self.title)
super().save()
django-taggit标签tag管理
django-taggit用于管理标签。
在models.py中集成django-taggit:
from taggit.managers import TaggableManager
class Article(models.Model):
...省略...
tags = TaggableManager(help_text="多个标签使用英文逗号隔开",verbose_name="标签")# setting.py中添加taggit应用
THIRD_PARTY_APPS = [
...省略...
'taggit',
]