关于“Python”的核心知识点整理大全28

目录

11.1.5 添加新测试

11.2 测试类

11.2.1 各种断言方法

 unittestModule中的断言方法:

​编辑11.2.2 一个要测试的类

survey.py

language_survey.py

11.2.3 测试 AnonymousSurvey 类

test_survey.py

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


11.1.5 添加新测试

确定get_formatted_name()又能正确地处理简单的姓名后,我们再编写一个测试,用于测试 包含中间名的姓名。为此,我们在NamesTestCase类中再添加一个方法:

import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
 """测试name_function.py """
 def test_first_last_name(self):
 """能够正确地处理像Janis Joplin这样的姓名吗?"""
 formatted_name = get_formatted_name('janis', 'joplin')
 self.assertEqual(formatted_name, 'Janis Joplin')
 def test_first_last_middle_name(self):
 """能够正确地处理像Wolfgang Amadeus Mozart这样的姓名吗?"""
1 formatted_name = get_formatted_name(
 'wolfgang', 'mozart', 'amadeus')
 self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')
unittest.main()

我们将这个方法命名为test_first_last_middle_name()。方法名必须以test_打头,这样它才 会在我们运行test_name_function.py时自动运行。这个方法名清楚地指出了它测试的是get_ formatted_name()的哪个行为,这样,如果该测试未通过,我们就会马上知道受影响的是哪种类 型的姓名。在TestCase类中使用很长的方法名是可以的;这些方法的名称必须是描述性的,这才 能让你明白测试未通过时的输出;这些方法由Python自动调用,你根本不用编写调用它们的代码。

为测试函数get_formatted_name(),我们使用名、姓和中间名调用它(见1),再使用 assertEqual()检查返回的姓名是否与预期的姓名(名、中间名和姓)一致。我们再次运行 test_name_function.py时,两个测试都通过了:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

太好了!现在我们知道,这个函数又能正确地处理像Janis Joplin这样的姓名了,我们还深信 它也能够正确地处理像Wolfgang Amadeus Mozart这样的姓名。

11.2 测试类

在本章前半部分,你编写了针对单个函数的测试,下面来编写针对类的测试。很多程序中都 会用到类,因此能够证明你的类能够正确地工作会大有裨益。如果针对类的测试通过了,你就能 确信对类所做的改进没有意外地破坏其原有的行为。

11.2.1 各种断言方法

Python在unittest.TestCase类中提供了很多断言方法。前面说过,断言方法检查你认为应 该满足的条件是否确实满足。如果该条件确实满足,你对程序行为的假设就得到了确认,你就可 以确信其中没有错误。如果你认为应该满足的条件实际上并不满足,Python将引发异常。 表11-1描述了6个常用的断言方法。使用这些方法可核实返回的值等于或不等于预期的值、 返回的值为True或False、返回的值在列表中或不在列表中。你只能在继承unittest.TestCase的 类中使用这些方法,下面来看看如何在测试类时使用其中的一个。

 unittestModule中的断言方法:

11.2.2 一个要测试的类

类的测试与函数的测试相似——你所做的大部分工作都是测试类中方法的行为,但存在一些 不同之处,下面来编写一个类进行测试。来看一个帮助管理匿名调查的类:

survey.py
class AnonymousSurvey():
 """收集匿名调查问卷的答案"""
1 def __init__(self, question):
 """存储一个问题,并为存储答案做准备"""
 self.question = question
 self.responses = []
2 def show_question(self):
 """显示调查问卷"""
 print(question)
3 def store_response(self, new_response):
 """存储单份调查答卷"""
 self.responses.append(new_response)
4 def show_results(self):
 """显示收集到的所有答卷"""
 print("Survey results:")
 for response in responses:
 print('- ' + response)

这个类首先存储了一个你指定的调查问题(见1),并创建了一个空列表,用于存储答案。 这个类包含打印调查问题的方法(见2)、在答案列表中添加新答案的方法(见3)以及将存储 在列表中的答案都打印出来的方法(见4)。要创建这个类的实例,只需提供一个问题即可。有 了表示调查的实例后,就可使用show_question()来显示其中的问题,可使用store_response()来 存储答案,并使用show_results()来显示调查结果。 为证明AnonymousSurvey类能够正确地工作,我们来编写一个使用它的程序:

language_survey.py
from survey import AnonymousSurvey
#定义一个问题,并创建一个表示调查的AnonymousSurvey对象
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
#显示问题并存储答案
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
 response = input("Language: ")
 if response == 'q': 
break
 my_survey.store_response(response)
# 显示调查结果
print("\nThank you to everyone who participated in the survey!")
my_survey.show_results() 

这个程序定义了一个问题("What language did you first learn to speak? "),并使用这个 问题创建了一个AnonymousSurvey对象。接下来,这个程序调用show_question()来显示问题,并 提示用户输入答案。收到每个答案的同时将其存储起来。用户输入所有答案(输入q要求退出) 后,调用show_results()来打印调查结果:

What language did you first learn to speak?
Enter 'q' at any time to quit.
Language: English
Language: Spanish
Language: English
Language: Mandarin
Language: q
Thank you to everyone who participated in the survey!
Survey results:
- English
- Spanish
- English
- Mandarin 

AnonymousSurvey类可用于进行简单的匿名调查。假设我们将它放在了模块survey中,并想进 行改进:让每位用户都可输入多个答案;编写一个方法,它只列出不同的答案,并指出每个答案 出现了多少次;再编写一个类,用于管理非匿名调查。 进行上述修改存在风险,可能会影响AnonymousSurvey类的当前行为。例如,允许每位用户输 入多个答案时,可能不小心修改了处理单个答案的方式。要确认在开发这个模块时没有破坏既有 行为,可以编写针对这个类的测试。

11.2.3 测试 AnonymousSurvey 类

下面来编写一个测试,对AnonymousSurvey类的行为的一个方面进行验证:如果用户面对调查 问题时只提供了一个答案,这个答案也能被妥善地存储。为此,我们将在这个答案被存储后,使 用方法assertIn()来核实它包含在答案列表中:

test_survey.py
import unittest
from survey import AnonymousSurvey
1 class TestAnonmyousSurvey(unittest.TestCase):
 """针对AnonymousSurvey类的测试"""
2 def test_store_single_response(self):
 """测试单个答案会被妥善地存储"""
 question = "What language did you first learn to speak?"
3 my_survey = AnonymousSurvey(question)
 my_survey.store_response('English')
4 self.assertIn('English', my_survey.responses)
unittest.main()

我们首先导入了模块unittest以及要测试的类AnonymousSurvey。我们将测试用例命名为 TestAnonymousSurvey,它也继承了unittest.TestCase(见1)。第一个测试方法验证调查问题的 单个答案被存储后,会包含在调查结果列表中。对于这个方法,一个不错的描述性名称是 test_store_single_response()(见2)。如果这个测试未通过,我们就能通过输出中的方法名得 知,在存储单个调查答案方面存在问题。

要测试类的行为,需要创建其实例。在3处,我们使用问题"What language did you first learn to speak?"创建了一个名为my_survey的实例,然后使用方法store_response()存储了单个答案 English。接下来,我们检查English是否包含在列表my_survey.responses中,以核实这个答案是 否被妥善地存储了(见4)。 当我们运行test_survey.py时,测试通过了:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK

这很好,但只能收集一个答案的调查用途不大。下面来核实用户提供三个答案时,它们也将 被妥善地存储。为此,我们在TestAnonymousSurvey中再添加一个方法:

import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
 """针对AnonymousSurvey类的测试"""
 def test_store_single_response(self):
 """测试单个答案会被妥善地存储"""
 --snip--
 def test_store_three_responses(self):
 """测试三个答案会被妥善地存储"""
 question = "What language did you first learn to speak?"
 my_survey = AnonymousSurvey(question)
1 responses = ['English', 'Spanish', 'Mandarin']
 for response in responses: 
 my_survey.store_response(response)
2 for response in responses:
 self.assertIn(response, my_survey.responses)
unittest.main()

我们将这个方法命名为test_store_three_responses(),并像test_store_single_response() 一样,在其中创建一个调查对象。我们定义了一个包含三个不同答案的列表(见1),再对其中 每个答案都调用store_response()。存储这些答案后,我们使用一个循环来确认每个答案都包含 在my_survey.responses中(见2)。

我们再次运行test_survey.py时,两个测试(针对单个答案的测试和针对三个答案的测试)都 通过了:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

前述做法的效果很好,但这些测试有些重复的地方。下面使用unittest的另一项功能来提高 它们的效率。

关于“Python”的核心知识点整理大全25-CSDN博客

关于“Python”的核心知识点整理大全12-CSDN博客

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UART协议——FPGA代码篇

一.串口(UART)协议简介 UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用UART 串口通信的端口,这些参数必须匹配,否则通 起始位:表示数据传输的开…

如何在Eclipse中安装WindowBuilder插件,详解过程

第一步:找到自己安装eclipse的版本,在Help-关于eclipse里面,即Version 第二步:去下面这个网站找到对应的 link(Update Site),这一步很重要,不然版本下载错了之后还得删除WindowBuil…

【计算机网络】TCP协议——3. 可靠性策略效率策略

前言 TCP是一种可靠的协议,提供了多种策略来确保数据的可靠性传输。 可靠并不是保证每次发送的数据,对方都一定收到;而是尽最大可能让数据送达目的主机,即使丢包也可以知道丢包。 目录 一. 确认应答和捎带应答机制 二. 超时重…

什么是关键词排名蚂蚁SEO

关键词排名是指通过搜索引擎优化(SEO)技术,将特定的关键词与网站相关联,从而提高网站在搜索引擎中的排名。关键词排名对于网站的流量和用户转化率具有至关重要的影响,因此它是SEO工作中最核心的部分之一。 如何联系蚂…

机器学习 | SVM支持向量机

欲穷千里目,更上一层楼。 一个空间的混乱在更高维度的空间往往意味着秩序。 Machine-Learning: 《机器学习必修课:经典算法与Python实战》配套代码 - Gitee.com 1、核心思想及原理 针对线性模型中分类两类点的直线如何确定。这是一个ill-posed problem。…

【工作流Activiti】Activiti的使用

1、数据库支持 Activiti 运行必须要有数据库的支持&#xff0c;支持的数据库有&#xff1a;mysql、oracle、postgres、mssql、db2、h2 2、Activiti环境 我们直接在当前项目&#xff1a;guigu-oa-parent做Activiti入门讲解 2.1、引入依赖 <!--引入activiti的springboot启动…

苹果个人开发者如何实现应用下载安装

作为苹果个人开发者&#xff0c;你可以为iOS设备用户提供应用程序&#xff0c;而用户将能够通过下载和安装这些应用来丰富他们的设备体验。本文将详细介绍个人开发者实现应用下载安装的步骤&#xff0c;包括开发和上架应用程序到App Store。 图片来源&#xff1a;苹果个人开发者…

P2P应用

目录 一.P2P的简介 二.P2P的工作方式 1.具有集中目录服务器的P2P工作方式 2.具有全分布式结构的P2P文件共享程序 一.P2P的简介 P2P(对等连接)&#xff0c;是指两台主机在通信时&#xff0c;并不区分哪一个是服务请求方和哪一个是服务提供方。只要两台主机都运行了对等连接…

【06】GeoScene海图或者电子航道图数据自动化质检

1 S-58错误管理器验证产品 在你编辑数据时进行快速的质量检查可以使用S-58错误管理器&#xff0c;S-58错误管理器工具允许您使用IHO S-58验证标准来验证海事数据库中的产品。你可以验证整个产品&#xff0c;或验证产品的当前范围。 1.1验证产品 使用S-58错误管理器工具完成以…

Android vs. iOS:移动操作系统的对决

导言 Android和iOS作为两大主流移动操作系统&#xff0c;影响着数十亿用户的数字生活。Android和iOS&#xff0c;作为移动操作系统的巅峰代表&#xff0c;它们的竞争塑造了全球数十亿用户的数字化生活。本文将深入探讨这两个系统的起源、特点以及它们在用户体验、开发者生态和市…

Linux 特殊符号

目录 1. # 注释 2. &#xff1b;命令分隔符 3. .. 上级目录 4. . 当前目录 5. " " 换行&#xff0c;解析变量 6. 换行&#xff0c;不解析变量 7. \ 和 / 8. &#xff01;历史命令调用&#xff0c;取反 9. * 通配符 10. $ 调用变量 11. | 管道 12. || …

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker&#xff1f; Docker 是一种容器引擎&#xff0c;可以在容器内运行一段代码&#xff0c;Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。要构建镜像&#xff0c;docker 使用一个名为 Dockerfile 的文件&#xff0c;Dockerfile 是一个包…

【二分查找】【z型搜索】LeetCode240:搜索二维矩阵

LeetCoe240搜索矩阵 作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 本文涉及的基础知识点 二分查找算法合集 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的…

Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码

问题 今天在代码里面输出 console.log 信息直接指向了 vue.js&#xff0c;并且代码里面写了 debgger 也不生效 解决 f12 找到浏览器的这个设置图标 找到这个 ignore list 的 custom exclusion rules 取消掉 /node_modules/|/bower_components/ 这样就正常了

【图神经网络】社区检测

社区检测 社区是许多网络的特性&#xff0c;一个特定的网络可能有多个社区&#xff0c;社区内的节点之间连接紧密。 网络节点在社区内部形成紧密的连接&#xff0c;而在社区之间则形成松散连接。 社区检测技术对于社交媒体算法来说非常有用&#xff0c;可以发现具有共同兴趣…

TrustZone之顶层软件架构

在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…

sqlserver dba日常操作

查询慢sql的方法 1.whoisactive 安装方法 http://whoisactive.com/downloads/下载地址 将下载好的zip包放到sqlserver服务器中 文件-打开-文件-下载好的zip包-在查询窗口点击执行 新建一个查询窗口&#xff0c;输入sp_whoisactive&#xff0c;获取当前运行的所有sql语句 使用…

【计算机网络】TCP协议——2.连接管理(三次握手,四次挥手)

目录 前言 一. 建立连接——三次握手 1. 三次握手过程描述 2. TCP连接建立相关问题 二. 释放连接——四次挥手 1. 四次挥手过程描述 2. TCP连接释放相关问题 三. TCP状态转换 结束语 前言 TCP——传输控制协议(Transmission Control Protocol)。是一种面向连接的传…

Android 性能优化一篇解决

前言 使用java编写的源代码编译后生成了对于的class文件&#xff0c;但是class文件是一个非常标准的文件&#xff0c;市面上很多软件都可以对class文件进行反编译&#xff0c;为了我们app的安全性&#xff0c;就需要使用到Android代码混淆这一功能。针对 Java 的混淆&#xff…

不同版本QT使用qmake时创建QML项目的区别

不同版本QT使用qmake时创建QML项目的区别 文章目录 不同版本QT使用qmake时创建QML项目的区别一、QT5新建QML项目1.1 目录结构1.2 .pro 文件内容1.3 main.cpp1.4 main.qml 二、QT6新建QML项目2.1 目录结构2.2 .pro文件内容2.3 main.cpp2.4 main.qml 三、两个版本使用资源文件的区…