5、 测试

news2024/11/13 23:33:32

这里写目录标题

  • 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 Question

class 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 = Question
    template_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.coloradmin.cn/o/1928336.html

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

相关文章

目标检测之单类别NMS

long time no see! 在目标检测中&#xff0c;常见的是多类别NMS&#xff0c;也就是只对相同类别的boxes来计算IOU&#xff1b;但现实场景中经常遇到同一个物体被识别成2个类别&#xff0c;也就是模型认为它既是类别1也是类别2.这时候通过多类别nms就过滤不掉这种重叠的框。所以…

Android Studio - adb.exe已停止运作的解决方案

adb.exe 是Android Debug Bridge 的缩写&#xff0c;它是Android SDK 中的一个调试工具&#xff0c;允许开发者通过命令行界面与设备进行交互&#xff0c;执行各种操作&#xff0c;如运行设备的shell、管理模拟器或设备的端口映射、在计算机和设备之间上传/下载文件、将本地APK…

元服务体验-服务发现

服务发现&#xff0c;无论线上或线下的方式都可以发现元服务。 线上&#xff1a;基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。用户可以在设备的负一屏、全局搜索、应用市场、桌面等场景发现元服务。 线下&#xff1a;用户在 HarmonyOS Connect标签…

Flask启动5000端口后关不掉了?

事情是这样的&#xff1a; 使用python app.py启动flask应用后&#xff0c;又启动了另一个flask测试应用&#xff0c;也能启动成功&#xff0c;也没有报设么端口冲突&#xff0c;关闭黑窗口后&#xff0c;访问还是有守护进程在运行&#xff0c; 为什么我知道5000还在运行&#…

转型Web3开发第二课:Dapp开发入门基础 | 01 | 安装MetaMask

前言 完成了《转型 Web3 开发第一课》之后&#xff0c;得到了不少读者的认可&#xff0c;很多都在问什么时候开始下一课&#xff0c;近期终于抽出了时间开始搞起这第二课。 这第二课的主题为「Dapp开发入门基础」&#xff0c;即想要转型做 Dapp 开发的人员&#xff0c;不管是…

01数据结构 - 顺序表

这里是只讲干货不讲废话的炽念&#xff0c;这个系列的文章是为了我自己以后复习数据结构而写&#xff0c;所以可能会用一种我自己能够听懂的方式来描述&#xff0c;不会像书本上那么枯燥和无聊&#xff0c;且全系列的代码均是可运行的代码&#xff0c;关键地方会给出注释^_^ 全…

CSS-0_3 CSS和单位

文章目录 CSS的值和单位属性值长度单位CSS和绝对单位CSS和相对单位百分比em & rem视口 颜色单位 碎碎念 CSS的值和单位 我们知道&#xff0c;CSS是由属性和属性值所组成的表 随着CSS的发展&#xff0c;属性不说几千也有几百&#xff0c;我从来不支持去背诵所有的可能性。…

AWS Aurora Postgres 的开源替代品:存储和计算分离 | 开源日报 No.278

neondatabase/neon Stars: 13.0k License: Apache-2.0 Neon 是一个无服务器的开源替代品&#xff0c;用于 AWS Aurora Postgres。它将存储和计算分离&#xff0c;通过在节点集群中重新分配数据来替换 PostgreSQL 存储层。 提供自动扩展、分支和无限存储。Neon 安装包括计算节…

图解PyTorch中的Transpose操作

在PyTorch中&#xff0c;我们时常会对张量进行转置操作。若张量是二维的&#xff0c;则非常容易理解。若张量维度更高&#xff0c;则会令人摸不到头脑。 高维张量究竟是怎么转置的&#xff1f;简单来说&#xff0c;就是将参与转置的维度抽出来&#xff0c;将内侧的子张量视为一…

设计模式学习(二)工厂模式——抽象工厂模式

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式 背景抽象工厂模式优点与缺点参考文章 背景 现在我需要开发一个相机操作模块&#xff0c;它可能在Windows下运行&#xff0c;也可能在Linux下运行。由于在厂家提供的SDK中&#xff0c;Windows下的SDK和Linux下…

DROO论文笔记

推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址&#xff1a;用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址&#xff1a;DR…

统计学9——分类数据统计

知识结构 内容精读 1.分类数据与$\chi^2$统计量 分类数据在第一章已经进行了详细介绍&#xff0c;就是对数据进行分类的结果&#xff0c;特征是&#xff0c;调查结果虽然用数值表示&#xff0c;但不同数值描述了调查对象的不同特征。由此分类数据的结果是频数&#xff0c;而$…

git链接远程仓库

【 一 】ssh链接远程仓库 删除git仓库 【 1 】初步使用方法 1、之前把本地代码&#xff0c;以https形式&#xff0c;提交到了远程仓库 # - git remote add origin https://gitee.com/bai-zhitao/lufy.git- 输入用户名密码2、ssh认证&#xff0c;只需要配置一次&#xff…

uniapp踩坑之项目:uni-table垂直居中和水平居中

uni-table 中的水平居中uni-td align"center"&#xff0c;css里的属性vertical-align: middle //html 水平居中<uni-table ref"table" :loading"loading" border stripe emptyText"暂无更多数据"><uni-tr><uni-th :wid…

车载音视频MediaPlayer优化方案

媒体播放现状 从手机到车载&#xff0c;在很多地方还是有很大的不同。针对多媒体的场景Android车机目前大部分结构大致结构如下图&#xff1a; 从以上图看出的问题&#xff1a; 各个音视频APP单独实现播控界面&#xff0c;播放链路不一致&#xff0c;使用的底层播放器和音频焦…

JavaEE:Spring Web简单小项目实践二(用户登录实现)

学习目的&#xff1a; 1、理解前后端交互过程 2、学习接口传参&#xff0c;数据返回以及页面展示 1、准备工作 创建SpringBoot项目&#xff0c;引入Spring Web依赖&#xff0c;添加前端页面到项目中。 前端代码&#xff1a; login.html <!DOCTYPE html> <html lang&…

云备份服务端

文件使用工具和json序列化反序列化工具 //文件和json工具类的设计实现 #ifndef __UTIL__ #define __UTIL__ #include<iostream> #include<fstream> #include<string> #include <vector> #include<sys/stat.h> #include"bundle.h" #inc…

68、Flink DataStream Connector 之文件系统详解

文件系统 1.概述 连接器提供了 BATCH 模式和 STREAMING 模式统一的 Source 和 Sink。 Flink FileSystem abstraction支持连接器对文件系统进行&#xff08;分区&#xff09;文件读写&#xff0c;文件系统连接器为 BATCH 和 STREAMING 模式提供了相同的保证&#xff0c;而且对…

数字孪生Digital Twin 结合建筑信息模型 BIM 在AIoT 智慧城市建设中Web 可视化大屏实践...

智慧城市建设通过将城市中的建筑、基础设施等构建 BIM 模型&#xff0c;并与实时采集的数据相结合&#xff0c;创建数字孪生体。可以实现对城市能源消耗、交通流量、环境质量等的实时监测和预测&#xff0c;优化城市规划和资源分配。 01 数字孪生 Digital Twin 数字孪生 Digita…

Spring MVC 全注解开发

1. Spring MVC 全注解开发 文章目录 1. Spring MVC 全注解开发2. web.xml 文件 的替代2.1 Servlet3.0新特性2.2 编写 WebAppInitializer 3. Spring MVC的配置3.1 Spring MVC的配置&#xff1a;开启注解驱动3.2 Spring MVC的配置&#xff1a;视图解析器3.3 Spring MVC的配置&…