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



















