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

相关推荐
学测绘的小杨6 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz31012 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐13 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱1 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot1 天前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海1 天前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱1 天前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽2 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码2 天前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱2 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理