关于“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 = questionself.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': 
breakmy_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博客

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

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

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

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

相关文章

Redis7--基础篇9(SpringBoot集成Redis)

1. jedis、lettuce、Redistemplate的关系 第一代为jedis,之后推出了lettuce,然后springboot继承了Redistemplate,现推荐使用Redistemplate。 总的来说,jedis、lettuce、Redistemplate都是java操作Redis数据库的驱动。 2. 本地Ja…

3700字!我这样的爬虫架构,如履薄冰

前言 在毕业设计中,用Java写下了第一个爬虫。2019年工作之后,从Python的requests原生爬虫库,学到分布式爬虫框架Scrapy,写了60个左右爬虫。然后写了十几篇有关于爬虫的文章。但大多都是围绕着程序设计、功能模块的角度写的&#…

【记录版】SpringBoot项目自动配置场景下查看Bean的定义

SpringBoot BeanDefinition 背景: 最近在看一些SpringBoot相关的一些源码框架,自从SpringBoot实现自动化配置后,很多框架的适配和实现对我们来说都是黑盒,我们不知道某个框架到底注册了多个容器实例,以及定位的位置在…

时尚炫酷动态图文幻灯片视频素材AE模板

这个After Effects模板以时尚和动态幻灯片为特色。可以编辑和自定义文本占位符、媒体占位符和颜色。用来展示照片或视频剪辑。不需要任何插件。 来自AE模板网:https://aemuban.com/28093.html

NineData成功举办|《国产数据库共话未来趋势》技术沙龙

12月16日周六下午,由NineData、PostgreSQL中文社区、PolarDB开源社区共同举办的《国产数据库共话未来趋势》技术沙龙,在NineData的报告厅成功举办。 《国产数据库共话未来趋势》技术沙龙合影 本次沙龙汇聚阿里云、玖章算术、百度云、飞轮科技、YMatrix、…

云原生系列2-GitLab和Jenkins

1、GitLab类似github,是个私有仓库 1、GitLab安装,至少8G内存4核cpu # 查找Gitlab镜像 docker search gitlab/gitlab-ce # gitlab镜像拉取 docker pull gitlab/gitlab-ce # 查看镜像 docker images # 本机先建3个目录,为了gitlab容器通过挂…

如何编写产品需求文档(PRD)?「附模板」

在数字化时代的快速变革中,产品开发不再是一个单向的、线性的过程。它涉及多方面的互动、多维度的考量,以及多个利益相关者的参与。那么,如何确保每个人都对产品的最终形态有一个清晰、一致的理解?如何确保每个人都在为同一个目标…

构建智慧储能物联网,4G工业路由器远程监测在线管理

物联网技术的发展为智慧储能管理带来了革命性的变化。其中,4G工业路由器IR5000通过丰富的连接能力如串口RS485/232或网口的方式,实现了与储能现场各设备的连接,包括电表、电能检测器、防孤岛装置、BMS电池管理系统、监控服务器、储能控制器、…

13/100 N字形变换 14/100整数反转 15/100字符串转换整数atoi 16/100回文数

题目13/100:N字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你的…

亚信安慧AntDB数据库引领大数据新纪元,星河案例彰显卓越表现

亚信科技及其附属公司亚信安慧在第六届大数据“星河”案例评选中,凭借其卓越的数据库技术实力,再次站在了行业的聚光灯下。这次的显著成果不仅是对亚信科技技术能力的肯定,更是对其在数据库领域持续创新和领先地位的认可。 图:亚信…

.NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证

public Task InvokeAsync(HttpContext context){// 获取终点路由特性var endpointFeature context.Features.Get<IEndpointFeature>();// 获取是否定义了特性var attribute endpointFeature?.Endpoint?.Metadata?.GetMetadata<AllowAnonymousAttribute>();if …

短视频账号矩阵系统源码3年开发技术搭建

一、短视频矩阵系统建模----技术api接口--获取用户授权 技术文档分享&#xff1a; 本系统采用MySQL数据库进行存储&#xff0c;数据库设计如下&#xff1a; 1.用户表&#xff08;user&#xff09;&#xff1a; - 用户ID&#xff08;user_id&#xff09; - 用户名&#xff08;…