Python入门(二十七)测试(二)

news2024/12/27 0:41:26

测试(二)

  • 1.测试类
  • 2.各种断言方法
  • 3.一个要测试的类
  • 4.测试AnonymousSurvey类
  • 5.方法setUp()

1.测试类

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

2.各种断言方法

Python在unittest.TestCase类中提供了很多断言方法。前面说过,断言方法检查你认为应该满足的条件是否确实满足。如果该条件确实满足,你对程序行为的假设就得到了确认,可以确信其中没有错误。如果你认为应该满足的条件实际上并不满足,Python将引发异常。

表11-1描述了6个常用的断言方法。使用这些方法可核实返回的值等于或不等于预期的值,返回的值为True或False,以及返回的值在列表中或不在列表中。只能在继承unittest.TestCase的类中使用这些方法,随后来看看如何在测试类时使用其中之一。

在这里插入图片描述

3.一个要测试的类

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

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

这个类首先存储了一个调查问题(见❶),并创建了一个空列表,用于存储答案。这个类包含打印调查问题的方法(见❷),在答案列表中添加新答案的方法(见❸),以及将存储在列表中的答案都打印出来的方法(见❹)。要创建该类的实例,只需提供一个问题即可。有了表示调查的实例后,就可使用show_question()来显示其中的问题,使用store_response()来存储答案并使用show_results()来显示调查结果。

为证明AnonymousSurvey类能够正确工作,编写一个使用它的程序:

from survey import 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 learnto 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类的当前行为。例如,允许每位用户输入多个答案时,可能会不小心修改处理单个答案的方式。要确认在开发这个模块时没有破坏既有行为,可以编写针对这个类的测试。

4.测试AnonymousSurvey类

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

  import unittest
  from survey import AnonymousSurvey

❶ class TestAnonymousSurvey(unittest.TestCase):
      """针对AnonymousSurvey类的测试。"""def test_store_single_response(self):
          """测试单个答案会被妥善地存储。"""
          question = "What language did you first learn to speak?"
❸         my_survey = AnonymousSurvey(question)
          my_survey.store_response('English')
❹         self.assertIn('English', my_survey.responses)

  if __name__ == '__main__':
      unittest.main()

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

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

当我们运行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)
❶         responses = ['English', 'Spanish', 'Mandarin']
          for response in responses:
              my_survey.store_response(response)for response in responses:
              self.assertIn(response, my_survey.responses)

  if __name__ == '__main__':
      unittest.main()

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

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

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

OK

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

5.方法setUp()

在前面的test_survey.py中,我们在每个测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了答案。unittest.TestCase类包含的方法setUp()让我们只需创建这些对象一次,就能在每个测试方法中使用。如果在TestCase类中包含了方法setUp(),Python将先运行它,再运行各个以test_打头的方法。这样,在你编写的每个测试方法中,都可使用在方法setUp()中创建的对象。

下面使用setUp()来创建一个调查对象和一组答案,供方法test_store_single_response()和test_store_three_responses()使用:

  import unittest
  from survey import AnonymousSurvey

  class TestAnonymousSurvey(unittest.TestCase):
      """针对AnonymousSurvey类的测试。"""

      def setUp(self):
          """
          创建一个调查对象和一组答案,供使用的测试方法使用。
          """
          question = "What language did you first learn to speak?"
❶         self.my_survey = AnonymousSurvey(question)
❷         self.responses = ['English', 'Spanish', 'Mandarin']

      def test_store_single_response(self):
          """测试单个答案会被妥善地存储。"""
          self.my_survey.store_response(self.responses[0])
          self.assertIn(self.responses[0], self.my_survey.responses)

      def test_store_three_responses(self):
          """测试三个答案会被妥善地存储。"""
          for response in self.responses:
              self.my_survey.store_response(response)
          for response in self.responses:
              self.assertIn(response, self.my_survey.responses)

  if __name__ == '__main__':
      unittest.main()

方法setUp()做了两件事情:创建一个调查对象(见❶),以及创建一个答案列表(见❷)。存储这两样东西的变量名包含前缀self(即存储在属性中),因此可在这个类的任何地方使用。这让两个测试方法都更简单,因为它们都不用创建调查对象和答案了。方法test_store_single_response()核实self.responses中的第一个答案self.responses[0]被妥善地存储,而方法test_store_three_response()核实self.responses中的全部三个答案都被妥善地存储。

再次运行test_survey.py时,这两个测试也都通过了。如果要扩展AnonymousSurvey,使其允许每位用户输入多个答案,这些测试将很有用。修改代码以接受多个答案后,可运行这些测试,确认存储单个答案或一系列答案的行为未受影响。

测试自己编写的类时,方法setUp()让测试方法编写起来更容易:可在setUp()方法中创建一系列实例并设置其属性,再在测试方法中直接使用这些实例。相比于在每个测试方法中都创建实例并设置其属性,这要容易得多。

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

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

相关文章

AI绘画——了解AI绘画爆火原因与工具,并生成几个端午绘画小作品

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.AI绘画 1.AI绘画爆火原因 2.AI绘画背后原理 二.AI绘画工具介绍 1.midjour…

IDC武连峰:应用数字安全免疫力理念,促进企业在数字时代韧性发展

作者:IDC中国副总裁、首席分析师 武连峰 数字安全免疫力是一个企业针对各种数字安全威胁时的防御机制,与人体免疫力相似,企业数字安全免疫力包含两类:企业安全文化意识与合规是先天性数字安全免疫力,今天任何一个企业…

vue使用swiper三行轮播问题

1、轮播图设置属性slidesPerColumn:3实现不了,解决方案如下: this.scheduleData是后台请求的数据,通过3个一组分组转换为this.scheduleListThreede 的数据! 2、逻辑处理如下: computed: { scheduleListThree: functi…

做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

前言 作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的sql查询语法必须要掌握。最近有部分做测试小伙伴表示sql查询不太会,问我有没有sql查询语…

list赋值方法add()...和set()简介

目录 一、方法展示 二、add() 方法介绍 2.1.add(E element) 2.1.1源码 2.1.2.实例截图 2.1.3.Null引起的题外话 2.2.add(int index, E element) 2.2.1.源码 2.2.2.示例截图 2.2.3. add()引起IndexOutOfBoundsException简介 三、addAll()方法…

CSS查缺补漏之《媒体查询@media与BFC》

示例代码如下&#xff1a; <div class"box">世界你好</div> .box {width: 200px;height: 200px;background-color: yellow;color: white;font-size: 24px;text-align: center;line-height: 200px; } 媒体类型 媒体类型允许指定文件将如何在不同媒体上…

OpenCV——《图像平滑》结果输出对比《形态学操作》

1.图像平滑 图像平滑是一项简单且使用频率很高的图像处理方法&#xff0c;可以用来压制、弱化或消除图像中的细节、突变、边缘和噪声&#xff0c;最常见的是用来减少图像上的噪声。 常用的滤波器主要为&#xff1a; 均值滤波器&#xff1a;并不能完全消除噪声&#xff0c;只能…

【服务器】搭建hMailServer 服务实现远程发送邮件

typora-copy-images-to: upload hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工具即可实现远程发送邮件,不需要使用公网服务器,不需要域名,而且邮件账号名称可以自定义. 下面以windows 10系统为环境,介绍使用方法: 1. 安装hMailServe…

小鹏G9高压平台800V电驱动实拍

近日&#xff0c;小鹏汽车董事长何小鹏在其个人社交账号上透露&#xff0c;小鹏G9正按原定计划按部就班推进节奏&#xff0c;将于8月启动预订&#xff0c;9月正式迎来上市&#xff0c;上市后很快就会启动用户交付。 图片来源&#xff1a;何小鹏官方微博 需要样件请联&#xff1…

Oracle DMP文件导入

dmp文件可以在Navicat中的 把dmp放入其中。然后用数据泵导入。遗憾的是报错 [ERR] ORA-39001: invalid argument value [ERR] ORA-39000: bad dump file specification [ERR] ORA-39143: dump file "/xxx.DMP" may be an original export dump file 改为imp工具&…

干货分享 | TSMaster标定模块自动化控制应用指南

本文目录&#xff1a; 一、TSMaster标定模块自动化控制的基础原理 1.1 TSMaster的标定系统变量 1.2 内部TSMaster调用C脚本实现标定模块的自动化控制 1.3 外部调用COM组件实现自动化标定 二、标定自动化控制场景与TSMaster实例 2.1 C脚本实现控制标定模块的启动与关闭的设…

Goby 漏洞发布|网神SecGate 3600防火墙 sys_export_conf_local_save 文件读取漏洞

漏洞名称&#xff1a;网神SecGate 3600防火墙 sys_export_conf_local_save 文件读取漏洞 English Name&#xff1a;Weaver OA PluginViewServlet Authentication Bypass Vulnerability CVSS core: 8.0 影响资产数&#xff1a;738 漏洞描述&#xff1a; 网神SecGate 3600防…

同一 tomcat 不同项目 session 共享实现

说明 这里仅讨论 同一个tomcat&#xff0c;部署了两个工程&#xff08;两个war包&#xff09;。不涉及不同tomcat,不涉及集群 背景 tomcat中的工程A包含用户登录、退出、权限控制等功能&#xff1b;工程B包含业务功能接口。工程A将用户登录信息加密响应给前端&#xff0c;前…

基于Java校园快递代取系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

NLP(五十五)LangChain入门

LangChain简介 背景 由于ChatGPT的发行&#xff0c;大模型&#xff08;Large Language Model, LLM&#xff09;已经变得非常流行了。也许你可能没有足够的资金和计算资源从头开始训练大模型&#xff0c;但你仍然可以使用大模型来做一些比较酷的事情&#xff0c;比如&#xff1…

大数据开发薪资怎么样

想必想入行的小伙伴在正式开始学习之前&#xff0c;都会考虑薪资这个可观因素。有不少小伙伴是看中了大数据的薪资选择加入这个行业的&#xff0c;想知道以后能找什么工作以及工作薪水&#xff0c;那不妨让我们以数据的方式来展示一下~ 猎聘大数据研究院发布了《2022未来人才就…

制造执行系统(MES)的核心功能是什么?

制造执行系统&#xff08;MES&#xff09;的核心功能是什么? 01 什么是MES 制造执行系统&#xff08;MES&#xff09;是一种用于监控、控制和优化制造过程的软件系统。它通过与企业资源计划&#xff08;ERP&#xff09;系统和自动化系统的集成&#xff0c;实现对生产过程的管…

小红书品牌营销策略分析!品牌方必看

小红书在品牌营销方面的策略非常成功&#xff0c;特别是在口碑营销、内容营销和小红书素人达人种草营销方面的运用。以下是伯乐网络传媒对这些策略的详细分析&#xff0c;想要做小红书营销推广的商家必看&#xff01; 一、口碑营销 对于小红书APP来说,口碑营销的传播主体就是小…

Android build.gradle文件

一、ABI&#xff08;Application Binary Interface&#xff09;应用程序二进制接口 其实ABI可以不设置&#xff0c;这样编译时&#xff0c;就会将项目里所有依赖资源包里的so库都打到最终的apk里。 但是&#xff0c;ABI支持多的话&#xff0c;apk也会大&#xff0c;所以一般只支…

MySQL数据库——存储引擎

MySQL数据库——存储引擎 一、MySQL存储引擎1.存储引擎的概念2.常用存储引擎3.存储引擎的分类4.企业选择存储引擎依据 二、MyISAM 存储引擎1 MyISAM的相关了解2 MyISAM的特点3 MyISAM表支持3种不同的存储格式4.MyISAM适用的生产场景 三、InnoDB 存储引擎1 InnoDB的相关了解2 In…