vlambda博客
学习文章列表

6.Django基于模拟浏览器的测试用例编写、python-slugify、django-taggit

内容提要:

  • 使用django.test.Client编写模拟浏览器访问的测试用例,实用库python-slugify(url别名)、django-taggit(标签管理)学习。


Django高级实战-开发企业及问答网站》作者Jack

——学习来源





6.1
编写模拟浏览器调用的测试用例
  • 视图代码的测试用例,除了前面讲过的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请求的返回值中取值


7.1
django第三方实用库

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',
    ]