5、 测试

这里写目录标题

  • 1、自动化测试简介
    • (1)自动化测试是什么
    • (2)为什么要写测试
      • 测试节约你的时间
      • 发现错误,预防错误
      • 测试使得代码更有吸引力
  • 2、基础测试策略
  • 3、开始写第一个测试
    • (1)首先得有个bug
    • (2)创建一个猜测来暴露这个bug
    • (3)运行测试
    • (4)修复这个bug
    • (5)更全面的测试
  • 4、测试视图
    • (1)针对视图的测试
    • (2)Django测试工具之Client
    • (3)改善视图代码
    • (4)测试新视图
    • (5)测试DetailView
  • 5、当需要测试的时候,测试用例越多越好
  • 6、深入代码测试

1、自动化测试简介

(1)自动化测试是什么

测试在不同层次中都存在。有些测试关注很小的细节(函数返回值是否满足预期),而另一些测试检查对某个软件的一系列操作(某一用户属兔序列是否造成了预期结果),我们使用shell来测试某一方法的功能,或者运行某个应用并输入数据来检查它的行为。
自动化测试是某个系统帮你完成的。当你创建好了一系列测试,每次修改应用代码后,可以自动检查出修改后的代码是否还像预期那样工作。而不需要花费大量时间手动测试。

(2)为什么要写测试

对写复杂项目有用

测试节约你的时间

手动测试浪费时间,要考虑大量数据,但是自动化测试能够帮助我们在几秒钟内完成这件事情

发现错误,预防错误

测试能够帮助我们清晰代码的意图

测试使得代码更有吸引力

测试让其他开发者知道你的代码通过了测试

2、基础测试策略

测试驱动——写代码之前写测试

3、开始写第一个测试

(1)首先得有个bug

现在我们就有一个bug
我们的要求是如果Question是在一天之内发布的,Question.was_published_recently()方法返回True,但是这个方法在Question的pub_date比这个时间还晚的情况下仍然返回True

py 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

在这里插入图片描述
很明显这是一个错误

(2)创建一个猜测来暴露这个bug

我们刚刚手动做的测试就是自动化测试应该做的工作
在 polls/tests.py 中编写以下代码

from django.test import TestCase
import datetime
from django.utils import timezone
from .models import Questionclass QuestionModelTests(TestCase):def test_was_published_recetly_with_future_question(self):time=timezone.now()+datetime.timedelta(days=30)future_question=Question(pub_date=time)self.assertIs(future_question.was_published_recently(),False)

解释一下 assertis 的作用:

future_question.was_published_recently() 调用 was_published_recently 方法,返回一个布尔值。
self.assertIs(future_question.was_published_recently(), False) 断言 future_question.was_published_recently() 的返回值是 False,即检查 was_published_recently 方法的结果是否与 False 是同一个对象。
如果 was_published_recently() 返回 False,断言通过;否则,断言失败,测试报告将显示失败的信息。

(3)运行测试

py manage.py test polls

在这里插入图片描述
这个过程中发生了什么呢
在这里插入图片描述

(4)修复这个bug

在 polls/models 中

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

再次运行测试
在这里插入图片描述
现在通过了测试,可以认为之后都不会出现这个错误了

(5)更全面的测试

在 tests.py 中增加

    def test_was_published_recently_with_old_question(self):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):time=timezone.now()-datetime.timedelta(hours=23,minutes=59,seconds=59)recent_question=Question(pub_time=time)self.assertIs(recent_question.was_published_recently(),True)

4、测试视图

现在还有一个问题是 我们的polls应用对所有应用“一视同仁”,当pub_date为未来的某一天时,这个问题也照常发布,但是应该在未来的那个时刻发布才对

(1)针对视图的测试

为了修复这个bug,我们这次先编写测试,再去写代码,也就是“测试驱动”,其实这两者的顺序不是很重要

在开始之前先来看一下需要用到的工具

(2)Django测试工具之Client

dango提供了一个测试使用的Client 来模拟用户和视图层代码的交互,我们能够在 tests 以及 shell 中使用它

先从shell开始,要做一些在tests 中不是必须的工作:配置测试环境:
在这里插入图片描述

(3)改善视图代码

我们创建一个未来的投票也会显示,现在来修复这个问题

    def get_queryset(self):return Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[:5]

__lte 是 Django 查询语法中的 “小于或等于”(less than or equal to)的表示方法。

(4)测试新视图

def create_question(question_text,days):time=timezone.now()+datetime.timedelta(days=days)return Question.objects.create(question_text=question_text,pub_date=time)class QuestionIndexView(TestCase):def test_no_question(self):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):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):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_and_past_question(self):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):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"],[question1,question2])       

assertIs, assertEqual, assertContains, 和 assertQuerySetEqual 是 Django 测试框架中的一些常用断言方法,用于在单元测试中进行各种类型的断言
assertIs:作用:断言两个对象是同一个对象(即,两个对象的引用是相同的)
assertEqual:作用:断言两个对象相等(即,两个对象的值相等)。

测试就是假装一些管理员的输入,然后通过用户端的表现是否符合预期来判断加入的改变是否破坏了原有的系统状态

(5)测试DetailView

对于未来的投票,如果用户输入了正确的url 还是可以访问到它们,所以我们在DetailView里增加一些约束内容

polls.view.py

class DetailView(generic.DetailView):model = Questiontemplate_name = "polls/detail.html"def get_queryset(self):return Question.objects.filter(pub_date__lte=timezone.now())

test.py

class QuestionDetailViewTests(TestCase):def test_future_question(self):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):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)

5、当需要测试的时候,测试用例越多越好

写完测试就可以忘掉它啦,所以可以让它肆意增长
对于测试有以下建议

  • 对每个模型、视图建立单独的 TestClass
  • 每个测试方法只测试一个功能
  • 给测试起直观的名字

6、深入代码测试

Django中的测试

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Not Invented Here 不是在这里发明的 / Proudly found elsewhere 自豪地在其他地方找到

注&#xff1a; 机翻&#xff0c;未校对。 两篇关于创新管理的小文章 Not Invented Here 不是在这里发明的 In the history of organizational success, the enterprises that dominate tend to flawlessly execute on ideas that were created elsewhere. Examine just abo…

智慧水利解决方案:从理论到实践的全面跨越,展示其在水资源管理、水灾害预警、水生态保护等方面的创新应用

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、智慧水利的理论框架与技术体系 1、理论框架 2、技术体系 三、智慧水利在水资源管理中的应用 1、水资源优化配置 2、水量水质协同管理 四、智慧水利在水灾害预警中的应用 1、洪水预警与应急响应 2、干旱监测与评…

Mediapipe-姿态估计实例

Mediapipe简介 Mediapipe 是由 Google Research 开发的一款开源框架&#xff0c;旨在帮助开发者轻松地构建、测试和部署复杂的多模态、多任务的机器学习模型。它特别擅长于实时处理和分析音频、视频等多媒体数据。以下是 Mediapipe 的一些关键特点和组件&#xff1a; 关键特点…

基于微信小程序的音乐播放平台

基于微信小程序的音乐播放平台 音乐播放小程序项目简介技术栈功能模块项目流程系统E-R图项目页面 音乐播放小程序 项目简介 微信音乐小程序旨在提供一个简洁高效的音乐播放平台&#xff0c;用户可以方便地搜索、播放和收藏自己喜欢的音乐。整个项目采用前后端分离的架构&…

WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

环境&#xff1a; Win10 专业版 DELL7080 问题描述&#xff1a; WIN10开机突然&#xff0c;过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解决方案&#xff1a; 1.找到MEMORY.DMP文件内容&#xff0c;分析一下 Microsoft (R) Windows Debugger Version 10…

主机安全-开源HIDS字节跳动Elkeid安装使用

目录 概述什么是HIDSHIDS与NIDS的区别EDR、XDR是啥&#xff1f; Elkeid架构Elkeid Agent && Agent centerElkeid DriverElkeid RASPElkeid HUBService DiscoveryManager安装数据采集规则&告警 参考 概述 什么是HIDS HIDS&#xff08; host-based intrusion detec…

使用Gitee仓库镜像管理功能实现Gitee与Github 双向同步

进入你所需要同步的仓库&#xff0c;点击「管理」->「镜像仓库管理」&#xff0c;点击「添加镜像」选项&#xff1b; 如果你的Gitee账号还没有绑定过 GitHub 帐号&#xff0c;先根据弹窗的提示绑定 GitHub 帐号&#xff1b; 添加镜像时候&#xff0c;在「镜像方向」中选择…

二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5

前端&#xff1a;UNIAPP 后端&#xff1a;ThinkPHP 数据库&#xff1a; Mysql 前端使用的uniapp 可以打包APP H5 小程序 系统提供了完善的网络借贷体系&#xff0c;为金融中介平台提供从获客到贷后管理全流程服务&#xff0c;解决了借贷手续繁琐、流程缓慢等问题 此源码为运营…

管理Linux本地用户和组

什么是用户 用户账户在可以运行命令的不同人员和程序之间提供安全界限。 在Linux系统中&#xff0c;系统通过分配唯一的标识号&#xff08;用户ID或UID&#xff09;来区分不同的用户帐户。 在Linux系统中&#xff0c;用户帐户有以下三种主要类型&#xff1a; 超级用户 负责…

分布式一致性算法:Raft学习

分布式一致性算法&#xff1a;Raft学习 1 什么是分布式系统&#xff1f; 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。这些节点可能位于不同的物理位置&#xff0c;但它们协同工作以提供一个统一的计算平台或服务。分布式系统…

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中&#xff0c;如何让虚拟人物的动作更加自然、真实&#xff0c;已经成为一个重要课题。AI4Animation项目&#xff0c;一个由 Sebastian Starke 主导的开源框架&#xff0c;为Unity开发者提供了强大的工具集&#xff0c;以实现这一目标。本文…

OrangePi AIpro在安防领域的深思和实战(旷视科技CNN模型ShuffleNetV1开发案例测试)

一、前言 公司最近有个项目是安防领域的&#xff0c;主要用在边缘结点&#xff0c;虽然已做成形&#xff0c;但是还是存在一些缺陷&#xff0c;例如&#xff1a;算力问题&#xff0c;开发板的成熟问题&#xff0c;已经各种技术的解决方案落地问题。目前我们集成了很多功能&…

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架&#xff0c;支持所有主要操作系统&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写&#xff0c;包括计算机视觉、几何、媒体处理、网络和渲染&#x…

实现多层感知机

目录 多层感知机&#xff1a; 介绍&#xff1a; 代码实现&#xff1a; 运行结果&#xff1a; 问题答疑&#xff1a; 线性变换与非线性变换 参数含义 为什么清除梯度&#xff1f; 反向传播的作用 为什么更新权重&#xff1f; 多层感知机&#xff1a; 介绍&#xff1a;…

taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)

前言 CVE-2021-44983 是一个影响 taoCMS 3.0.1 的远程代码执行&#xff08;RCE&#xff09;漏洞。该漏洞允许攻击者通过上传恶意文件并在服务器上执行任意代码来利用这一安全缺陷。 漏洞描述 taoCMS 是一个内容管理系统&#xff08;CMS&#xff09;&#xff0c;用于创建和管…

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

一、项目介绍 眼疾识别系统&#xff0c;使用Python作为主要编程语言进行开发&#xff0c;基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法&#xff0c;通过对眼疾图片4种数据集进行训练&#xff08;‘白内障’, ‘糖尿病性视网膜病变’, ‘青光眼’, ‘正常’&…

jenkins系列-05-jenkins构建golang程序

下载go1.20.2.linux-arm64.tar.gz 并存放到jenkins home目录&#xff1a; 写一个golang demo程序&#xff1a;静态文件服务器&#xff1a;https://gitee.com/jelex/jenkins_golang package mainimport ("encoding/base64""flag""fmt""lo…

window下安装go环境

一、go官网下载安装包 官网地址如下&#xff1a;https://golang.google.cn/dl/ 选择对应系统的安装包&#xff0c;这里是window系统&#xff0c;可以选择zip包&#xff0c;下载完解压就可以使用 二、配置环境变量 这里的截图配置以win11为例 我的文件解压目录是 D:\Software…

力扣32.最长有效括号

力扣32.最长有效括号 class Solution {public:int longestValidParentheses(string s) {int n s.size();int res0;int start -1;vector<int> st;for(int i0;i<n;i){if(s[i] ()st.push_back(i);else{//前面没有( , (开启下一段)下一段的开始更新为当前下标if(st.emp…

机器学习和人工智能在农业的应用——案例分析

作者主页: 知孤云出岫 目录 引言机器学习和人工智能在农业的应用1. 精准农业作物健康监测土壤分析 2. 作物产量预测3. 农业机器人自动化播种和收割智能灌溉 4. 农业市场分析价格预测需求预测 机器学习和人工智能带来的变革1. 提高生产效率2. 降低生产成本3. 提升作物产量和质量…