• Django 入门学习总结6 - 测试


    1、介绍自动化测试

    测试的主要工作是检查代码的运行情况。测试有全覆盖和部分覆盖。

    自动测试表示测试工作由系统自动完成。

    在大型系统中,有许多组件有很复杂的交互。一个小的变化可能会带来意想不到的后果

    测试能发现问题,并以此解决问题。

    测试驱动开发

    在polls/tests.py文件中,建立 测试方法:

    import datetime

    from django.test import TestCase
    from django.utils import timezone

    from .models import Question


    class QuestionModelTests(TestCase):
        def test_was_published_recently_with_future_question(self):
            """
            was_published_recently() returns False for questions whose pub_date
            is in the future.
            """
            time = timezone.now() + datetime.timedelta(days=30)
            future_question = Question(pub_date=time)
            self.assertIs(future_question.was_published_recently(), False)

    在终端中输入以下命令,对投票系统进行测试:

    python manage.py test polls

    则输出以下信息。

    表明系统有bug,测试失败。

    修改文件polls/models.py为:

    def was_published_recently(self):
            now = timezone.now()
            return now - datetime.timedelta(days=1) <= self.pub_date <= now

    重新测试,则bug消失。

    更复杂的测试

    在测试文件中输入更多的测试方法:

    def test_was_published_recently_with_old_question(self):
            """
            was_published_recently() returns False for questions whose pub_date
            is older than 1 day.
            """
            time = timezone.now() - datetime.timedelta(days=1, seconds=1)
            old_question = Question(pub_date=time)
            self.assertIs(old_question.was_published_recently(), False)


        def test_was_published_recently_with_recent_question(self):
            """
            was_published_recently() returns True for questions whose pub_date
            is within the last day.
            """
            time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59)
            recent_question = Question(pub_date=time)
            self.assertIs(recent_question.was_published_recently(), True)

    现在有三个测试方法,分别对应于过去、最近和未来的问题。

    可以在客户端建立测试环境来对网页进行测试。

    在命令提示符下输入:

    python manage.py shell

    from django.test.utils import setup_test_environment

    setup_test_environment()

    导入客户端

    from django.test import Client

    建立一个客户端实例对象

    client = Client()

    修改polls/tests.py文件:

    from django.urls import reverse

    添加以下内容:

    def create_question(question_text, days):
            """
            Create a question with the given `question_text` and published the
            given number of `days` offset to now (negative for questions published
            in the past, positive for questions that have yet to be published).
            """
            time = timezone.now() + datetime.timedelta(days=days)
            return Question.objects.create(question_text=question_text, pub_date=time)


        class QuestionIndexViewTests(TestCase):
            def test_no_questions(self):
                """
                If no questions exist, an appropriate message is displayed.
                """
                response = self.client.get(reverse("polls:index"))
                self.assertEqual(response.status_code, 200)
                self.assertContains(response, "No polls are available.")
                self.assertQuerySetEqual(response.context["latest_question_list"], [])

            def test_past_question(self):
                """
                Questions with a pub_date in the past are displayed on the
                index page.
                """
                question = create_question(question_text="Past question.", days=-30)
                response = self.client.get(reverse("polls:index"))
                self.assertQuerySetEqual(
                    response.context["latest_question_list"],
                    [question],
                )

            def test_future_question(self):
                """
                Questions with a pub_date in the future aren't displayed on
                the index page.
                """
                create_question(question_text="Future question.", days=30)
                response = self.client.get(reverse("polls:index"))
                self.assertContains(response, "No polls are available.")
                self.assertQuerySetEqual(response.context["latest_question_list"], [])

            def test_future_question_and_past_question(self):
                """
                Even if both past and future questions exist, only past questions
                are displayed.
                """
                question = create_question(question_text="Past question.", days=-30)
                create_question(question_text="Future question.", days=30)
                response = self.client.get(reverse("polls:index"))
                self.assertQuerySetEqual(
                    response.context["latest_question_list"],
                    [question],
                )

            def test_two_past_questions(self):
                """
                The questions index page may display multiple questions.
                """
                question1 = create_question(question_text="Past question 1.", days=-30)
                question2 = create_question(question_text="Past question 2.", days=-5)
                response = self.client.get(reverse("polls:index"))
                self.assertQuerySetEqual(
                    response.context["latest_question_list"],
                    [question2, question1],
                )

    在polls/views.py中,添加以下内容:

    class DetailView(generic.DetailView):
            ...

            def get_queryset(self):
                """
                Excludes any questions that aren't published yet.
                """
                return Question.objects.filter(pub_date__lte=timezone.now())

    在polls/tests.py中,添加以下的内容:

    class QuestionDetailViewTests(TestCase):
            def test_future_question(self):
                """
                The detail view of a question with a pub_date in the future
                returns a 404 not found.
                """
                future_question = create_question(question_text="Future question.", days=5)
                url = reverse("polls:detail", args=(future_question.id,))
                response = self.client.get(url)
                self.assertEqual(response.status_code, 404)

            def test_past_question(self):
                """
                The detail view of a question with a pub_date in the past
                displays the question's text.
                """
                past_question = create_question(question_text="Past Question.", days=-5)
                url = reverse("polls:detail", args=(past_question.id,))
                response = self.client.get(url)
                self.assertContains(response, past_question.question_text)

    错误更:如果使用self.assertQuerySetEqual 收到一条错误消息“DeviceTest object has no attribute assertQuerySetEqual

    应将assertQuerySetEqual  替换为:assertEqual

  • 相关阅读:
    MySQL数据库备份与恢复 未完成版。。。
    Redis常见命令
    实现EnvironmentAware接口 将配置文件中的属性放置到系统环境变量中
    略带点艺术气息的目标检测框
    如何应对数仓资源不足导致的核心任务延迟
    文件I/O
    MySQL —— 索引
    【面试题】JS 中这些继承方式你知道吗?
    前、后端通用的可视化逻辑编排
    每天一个知识点- rabbitMq 如何防止消息不丢失
  • 原文地址:https://blog.csdn.net/computerclass/article/details/134518819