创建第一个Django app-part5

发布时间 2023-08-25 10:20:07作者: 人要靠自己you

自动化测试

开始第一个测试

首先有一个bug

python3 manage.py shell

创建一个测试来暴露这个 bug

将下面的代码写入 polls 应用里的 tests.py 文件内

点击查看代码
from django.test import TestCase

# Create your tests here.
import datetime
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);
        print(time)
        future_question = Question(pub_date = time, question_text="future question")
        '''
        它的返回值应该是False
        '''
        self.assertIs(future_question.was_published_recently(), False) 

运行测试

python3 manage.py test polls

查看输出

点击查看代码
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
2023-09-24 01:55:14.798935+00:00
F
======================================================================
FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
was_published_recently() returns False for questions whose pub_date
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/xuteng/Desktop/Study/Python/Django/mysite/polls/tests.py", line 21, in test_was_published_recently_with_future_question
    self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (failures=1)
Destroying test database for alias 'default'...

运行过程

  1. python manage.py test polls 将会寻找 polls 应用里的测试代码
  2. 它找到了 django.test.TestCase 的一个子类
  3. 它创建一个特殊的数据库供测试使用
  4. 它在类中寻找测试方法——以 test 开头的方法
  5. 在 test_was_published_recently_with_future_question 方法中,它创建了一个 pub_date 值为 30 天后的 Question 实例
  6. 接着使用 assertls() 方法,发现 was_published_recently() 返回了 True,而我们期望它返回 False
  7. 测试系统通知我们哪些测试样例失败了,和造成测试失败的代码所在的行号

修复这个bug

修改polls.models

点击查看代码
def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

测试结果

点击查看代码
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
2023-09-24 02:02:22.203513+00:00
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
Destroying test database for alias 'default'...

更加全面的测试

点击查看代码
from django.test import TestCase

# Create your tests here.
import datetime
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);
        print(time)
        future_question = Question(pub_date = time, question_text="future question")
        '''
        它的返回值应该是False
        '''
        self.assertIs(future_question.was_published_recently(), False) 

    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)

‘’‘
测试结果:

Found 3 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
2023-09-24 02:05:30.209024+00:00
...
----------------------------------------------------------------------
Ran 3 tests in 0.004s

OK
Destroying test database for alias 'default'...

’‘’