djang5 官网_polls_app_05( 关于代码测试)

这篇教程从 教程4 结束的地方开始。已经构建了一个网络投票应用程序,现在将为其创建一些自动化测试。

1. 原因:

雅各布·卡普兰-莫斯(Jacob Kaplan-Moss),Django的原始开发者之一,说过:“没有测试的代码在设计上就是有缺陷的。”

2. Bug:

原始代码:
在这里插入图片描述

通过使用shell检查一个日期在未来的问题上的方法来确认这个bug:

python manage.py shell
>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> # create a Question instance with pub_date 30 days in the future
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # was it published recently?
>>> future_question.was_published_recently()
True

由于未来的事情不算是“最近的”,这显然是不正确的。

将以下内容放入polls应用程序的tests.py文件中:

import datetime
from django.test import TestCase
from django.utils import timezone
from .models import Questionclass QuestionModelTests(TestCase):def test_was_published_recently_with_future_question(self):"""was_published_recently() returns False for questions whose pub_dateis 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

结果:
在这里插入图片描述

2. 修复Bug:

修改代码为:

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

就像这样:
在这里插入图片描述
再次测试:

python manage.py test polls

结果:
在这里插入图片描述
添加更多的测试:

def test_was_published_recently_with_old_question(self):"""was_published_recently() returns False for questions whose pub_dateis 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_dateis 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 test polls

结果:
在这里插入图片描述

4. view视图测试

1. 进入 Django Shell

首先,你需要进入 Django 的 shell 环境。在项目根目录下运行以下命令:

python manage.py shell

这将启动一个 Python 解释器,允许你与 Django 项目进行交互。

2. 设置测试环境

在 shell 中,导入并调用 setup_test_environment 函数,以便配置测试环境:

>>> from django.test.utils import setup_test_environment
>>> setup_test_environment()

这一步是必要的,它设置了测试环境,使得你可以进行测试而不会影响实际的数据。

3. 创建客户端实例

接下来,导入 Client 类并创建一个实例,用于模拟 HTTP 请求:

>>> from django.test import Client
>>> # create an instance of the client for our use
>>> client = Client()

Client 类是 Django 测试框架的一部分,用于模拟用户与你的应用的交互。

4. 发送请求并处理响应

访问不存在的页面

尝试访问根路径 /,并检查响应状态码:

>>> # get a response from '/'
>>> response = client.get("/")
Not Found: /
>>> # we should expect a 404 from that address; if you instead see an
>>> # "Invalid HTTP_HOST header" error and a 400 response, you probably
>>> # omitted the setup_test_environment() call described earlier.
>>> response.status_code
404

预期会得到一个 404 状态码,表示页面未找到。

访问存在的页面

接下来,访问 /polls/ 路径,并检查响应状态码和内容:

>>> # on the other hand we should expect to find something at '/polls/'
>>> # we'll use 'reverse()' rather than a hardcoded URL
>>> from django.urls import reverse
>>> response = client.get(reverse("polls:index"))
>>> response.status_code
200
>>> response.content
b'\n    <ul>\n    \n        <li><a href="/polls/1/">What&#x27;s up?</a></li>\n    \n    </ul>\n\n'
>>> response.context["latest_question_list"]
<QuerySet [<Question: What's up?>]>
  • 使用 reverse() 函数来获取 URL,而不是硬编码 URL。
  • 检查响应状态码,预期为 200,表示请求成功。
  • 查看响应内容,这里是一个简单的 HTML 列表。
  • 访问响应上下文中的 latest_question_list,预期为一个包含问题的 QuerySet

5. Indexview视图测试

class IndexView(generic.ListView):template_name = "polls/index.html"context_object_name = "latest_question_list"def get_queryset(self):"""返回最后五个发布的问卷。"""return Question.objects.order_by("-pub_date")[:5]

解释

  • IndexView 继承自 generic.ListView,用于展示问卷列表。
  • template_name 指定了使用的模板文件。
  • context_object_name 定义了在模板中使用的变量名。
  • get_queryset 方法返回按发布日期排序的最后五个问卷。

修改 get_queryset 方法

from django.utils import timezonedef get_queryset(self):"""返回最后五个已发布的问卷(不包括那些设置为将来发布的问卷)。"""return Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[:5]

解释

  • 引入 timezone 模块以获取当前时间。
  • 修改 get_queryset 方法,只返回发布日期小于或等于当前时间的问卷。

create_question 函数

from django.urls import reverse
from datetime import datetimedef create_question(question_text, days):"""创建一个问卷,给定 `question_text` 并在当前时间基础上偏移 `days` 天发布(负数表示过去,正数表示未来)。"""time = timezone.now() + datetime.timedelta(days=days)return Question.objects.create(question_text=question_text, pub_date=time)

解释

  • 引入 reverse 用于反向解析URL。
  • 引入 datetime 模块用于处理时间。
  • create_question 函数用于创建问卷,可以指定问卷文本和发布时间偏移。

QuestionIndexViewTests 类

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 theindex 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 onthe 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 questionsare 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],)

解释

  • QuestionIndexViewTests 类用于测试 IndexView 的不同情况。
  • test_no_questions 测试没有问卷时的情况。
  • test_past_question 测试过去问卷的显示。
  • test_future_question 测试未来问卷不显示。
  • test_future_question_and_past_question 测试同时存在过去和未来问卷时的情况。
  • test_two_past_questions 测试显示多个过去问卷的情况。

在终端运行:

python manage.py shell

结果为:在这里插入图片描述

6. DetailView视图测试

修改DetailView:

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())

如图:
在这里插入图片描述
测试代码:

class QuestionDetailViewTests(TestCase):def test_future_question(self):"""The detail view of a question with a pub_date in the futurereturns 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 pastdisplays 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)

在终端运行:

python manage.py shell

结果显示如下:
在这里插入图片描述
参考链接:https://docs.djangoproject.com/en/5.1/intro/tutorial05/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14510.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

准双向/弱上拉(标准8051输出模式)、仅为输入(高阻)、开漏输出、推挽输出、上拉电阻、下拉电阻都是什么?

准双向/弱上拉&#xff08;标准8051输出模式&#xff09;&#xff1a; 弱上拉&#xff1a;即输出的1驱动能力是有限的 准双向&#xff1a;可以输入也可以输出 为什么是弱上拉呢&#xff1f; 当三极管断开的时候&#xff0c;“内部输入”处应该是高电平&#xff08;前提的后端…

Linux高阶——1110—死锁问题原子访问线程控制与调度线程同步

目录 1、旋转锁 2、死锁问题 死锁问题举例&#xff1a; 1、双线程死锁 代码 成功截图 2、单线程死锁 死锁问题处理&#xff1a; 死锁问题预防&#xff1a; 有向图 3、原子访问 1、原子访问概念 2、原子访问可用函数 原代码 未加锁代码输出 修改后代码 修改后截…

python入门3

IDE的概念 IDE(Integrated Development Environment)又被称为集成开发环境。说白了&#xff0c;就是有一款图形化界面的软件&#xff0c;它集成了编辑代码&#xff0c;编译代码&#xff0c;分析代码&#xff0c;执行代码以及调试代码等功能。在我们Python开发中&#xff0c;最常…

Ollama—87.4k star 的开源大模型服务框架!!

这一年来&#xff0c;AI 发展的越来越快&#xff0c;大模型使用的门槛也越来越低&#xff0c;每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——ollama。 项目介绍 Ollama 是一个开源的大语言模型&#xff08;LLM&#xff09;服务工具…

mysql中的EXISTS和NOT EXISTS使用详解

本文来编写一个实例说下mysql中的EXISTS和NOT EXISTS使用详解 文章目录 exists用法SQL中in, not in, exists, not exists的区别使用实例本文小结 exists用法 exists: 如果括号内子查询语句返回结果不为空&#xff0c;说明where条件成立&#xff0c;就会执行主SQL语句。如果括号…

海量数据去重的哈希与布尔过滤器

目录 散列表 hash与平衡二叉树比较: 散列表组成: hash函数 作用&#xff1a; 怎么选择hash&#xff1a; 选择标准: 常用hash: hash的操作: hash冲突 产生原因 如何描述冲突程度: 解决冲突: 在合理范围内:used < size: 不在合理范围内&#xff08;used > s…

快速掌握——python类 封装[私有属性方法]、继承【python进阶】(内附代码)

1.类的定义 与 实例化对象 在python中使用class关键字创建一个类。 举例子 class Stu(object):id 1001name 张三def __init__(self):passdef fun1(self):pass# 实例化对象 s1 Stu() s2 Stu() print(s1.name) print(s2.name) 第一个方法 __init__是一种特殊的方法&#x…

PO 证书链

提到服务器间证书交换会不会头大,这两天遇到一个B2B接口的通讯证书问题,借机涨姿势,分享之 通常服务器之间通讯证书使用有两种方式: 如果不是生产机,可以简单的使用自签名证书,自签名证书就是下面这两个信息相同,都是自己,工具这里就不介绍了,多的是。双方互换证书,你…

HarmonyOS App 购物助手工具的开发与设计

文章目录 摘要引言功能需求分析技术方案与设计架构设计技术选型 代码示例Demo数据抓取模块数据存储模块历史价格查询和数据可视化模块完整界面布局和调用示例代码详解 QA环节总结参考资料 摘要 随着促销活动的增多&#xff0c;用户面临真假折扣的困惑&#xff0c;特别是在一些…

MPTCP协议

介绍 多路径TCP或 MPTCP协议是标准的扩展传输控制协议并在中进行了描述 RFC 8684号文件它允许设备同时使用多个接口通过单个MPTCP连接发送和接收TCP数据包。MPTCP可以聚合多个接口的带宽&#xff0c;也可以选择延迟最低的接口。它还允许在一条路径断开时进行故障切换&#xff…

1. 初始认识 Spring Cloud

1. 初始认识 Spring Cloud 文章目录 1. 初始认识 Spring Cloud前言2. Spring Cloud 基本介绍3. 系统架构的演变过程3.1 单机架构3.2 动静分离架构&#xff1a;静态缓存 文件存储3.3 分布式架构&#xff1a;业务拆分 负载均衡3.4 微服务架构&#xff1a;使用 Spring Cloud 4. …

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

【rf】robotframework自动化测试环境搭建

robotframework自动化测试环境搭建 前言&#xff1a; 1、在2019年之前&#xff0c;robotframework-ride的版本一直是1.5.2.1&#xff0c;是2016年1月份的版本&#xff0c;只能安装在python2.7的环境上&#xff0c;导致如果想同时使用robotframework做测试且又需要python3环境…

opencv入门学习总结

opencv学习总结 不多bb&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 案例一&#xff1a; import cv2 # 返回当前安装的 OpenCV 库的版本信息 并且是字符串格式 print(cv2.getVersionString()) """ 作用&#xff1a;它可以读取不同格式的图像文…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet&#xff0c;它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程&#xff08;如图一所示&#xff09;。在训练阶段&#xff0c;目标边界框逐渐扩散到随机分布&#xff0c;模型学习逆转这一加噪过程。在推理阶段&#…

加深深度学习矩阵计算理解--用人类直觉 走进线性代数(非应试)

文章目录 前言一、向量二、线性组合、空间与基三、矩阵和线性变换四、矩阵乘法与线性变化复合1、矩阵乘法代表线性变换的复合2、实例说明 五、三维空间的线性变换1、基本性质2、直觉理解3、矩阵表示 六、行列式一、行列式的定义2、行列式在空间中的抽象理解 七、逆矩阵 列空间秩…

AIGC学习笔记(5)——AI大模型开发工程师

文章目录 AI大模型开发工程师004 垂直领域的智能在线搜索平台1 智能在线搜索平台需求分析大模型不够“聪明”增强大模型的方式需求分析2 智能在线搜索平台方案设计方案设计技术选型大模型版本GLM-4大模型注册使用Google Cloud平台注册创建可编程的搜索引擎3 智能在线搜索平台代…

【C++滑动窗口】1234. 替换子串得到平衡字符串|1877

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 LeetCode1234. 替换子串得到平衡字符串 有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4 次&#xff0c;那么它就…

源码分享-Springboot+Vue大学生社团活动平台附源码,sql文件,配套论文

源码获取: 复制链接到浏览器打开即可领取 夸克网盘领取链接&#xff1a;https://pan.quark.cn/s/187d2ca0e3ec 百度网盘领取链接&#xff1a;https://pan.baidu.com/s/1apbO6k1cEqFXV-USf0I2IA?pwdccaj 提取码: ccaj 1.1课题背景及意义 随着现代网络技术发展&#xff0…

南山前海13元一份的猪脚饭

​今天没有带饭&#xff0c;中午打算去中国国有资本资本风投大厦的工地餐点吃个打工餐。 ​快到工地餐点就看到不少工友已经开始津津有味吃饭了哈。其实树下也有很多小鸟在觅食&#xff0c;可能是找一些剩饭吃的样子&#xff0c;大部分是麻雀为主。​ ​肚子有些饿&#xff0c;…