Python 中的 Unit testing 文件写入

在 Python 中进行单元测试时,有时候需要测试文件写入操作。为了模拟文件写入并进行单元测试,你可以使用 Python 的 unittest 模块,并结合 io.StringIOtempfile 模块来模拟文件操作。

在这里插入图片描述

1、问题背景

在 Python 中,为 ConfigParser 编写一个简单的包装器,以便于存储和检索应用程序设置。

包装器具有两个方法,read 和 write,以及一组用于不同应用程序设置的属性。

write 方法只是 ConfigParser 的 write 方法的一个包装器,另外还创建了 ConfigParser 所需的文件对象。如下所示:

def write(self):f = open(self.path, "w")try:self.config_parser.write(f)finally:f.close()

希望编写单元测试来断言,如果无法写入文件,此方法会引发 IOError,反之,会调用 config 解析器的 write 方法。

借助模拟对象,第二个测试很容易处理。但是 open 调用让事情变得有点棘手。最终,必须创建一个文件对象才能传递给 config 解析器。在运行此代码时实际会创建一个文件,这对于单元测试来说不是很有用。是否有模拟文件创建的一些策略?可以以某种方式测试这段代码吗?还是它太简单而无法测试?

2、解决方案

解决方案 1

首先,实际上不需要对 open() 进行单元测试,因为可以合理地假设标准库是正确的。

其次,不想对文件系统进行操作以使 open() 生成所需的错误,因为那样就不是单元测试了,而是在通过包含文件系统来进行功能/集成测试。

因此,也许可以将全局命名空间中的 open() 替换为仅引发 IOError 的代理。虽然,可能需要确保在执行继续后将会还原。

但最后,测试有什么价值?代码片段中很少有是你自己的系统。即使替换 open() 最终也只是测试是否“Python 中 try 和 finally 语句有效?”。

建议只在文档字符串中添加一条记录期望值的语句。“如果无法写入文件,则引发 IOError。”然后继续。如果此方法获得一些复杂性(以及测试价值的话),稍后可以添加单元测试。

解决方案 2

实际上,在代码中只有 open 会引发异常。write() 的文档中没有提到任何异常。可能只针对错误的文件指针(由于 open 失败,此处不可能发生这种情况)而引发 ValueError 或其他异常。

为 open 做一个 IOError很容易。只需在其他地方创建文件并在那里打开它进行写入。或者可以更改其权限,以便自己无法访问。

可能需要在此处使用 with 语句,它会自己处理关闭操作。

在 Python 2.5 中,需要第一行。在更高版本中不需要。

from __future__ import with_statement # python 2.5 onlydef write(self):with open(self.path, 'w') as f:self.config_parser.write(f)

如果 open 成功,则保证会调用 write 方法,如果 open 引发 IOError,则不会调用 write 方法。不知道为何需要测试是否调用了 write。代码表明是这样做的。不要过度测试。 😉

解决方案 3

请记住,不需要测试 open() 或 ConfigParser 是否可用,它们不是代码的一部分,只需要测试是否正确使用它们。可以使用自己的 open() 来修补该模块,就像对实例属性那样,并且可以从中返回一个有助于进行测试的模拟。

但是,单元测试并不是唯一工具,这是一个足够简单且足以分析和“证明”其工作原理的功能。

以上三种方法用于在 Python 单元测试中测试文件写入操作。最终需要我们具体的根据实际情况选择适合的方法。如果有任何问题可以这里联系。

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

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

相关文章

Docker下Open WebUI,Ollama的安装实践

提示一下Open WebUI与ollama的关系。后端的同学可以理解为Open WebUI等于是个Navicat,Ollama就是具体的数据库实例。 官方安装文档: 🏡 Home | Open WebUI Open WebUI官网文档翻译: 注意: 使用Docker安装Open WebU…

58. 【Android教程】音频录制:MediaRecord

在第 57 节我们使用 MediaPlayer 实现了一个 mp3 播放器,除了播放 Android 还提供了 MediaRecorder 用于录音。Android 设备基本都会有一个麦克风,通过 MediaRecorder 可以打开麦克风进行语音采集,这一节我们就来学习如何在 Android 系统上实…

深入解析C++的auto自动类型推导(二)

目录 使用auto的好处 新标准新增功能 使用auto的限制 上一篇详细讲解了使用auto关键字进行自动类型推导时的推导规则,这一篇重点讲解auto的使用以及C14、C17、C20等新标准对auto的功能完善,最后再介绍auto的使用限制。上一篇请从这里阅读:…

线程池核心原理浅析

前言 由于系统资源是有限的,为了降低资源消耗,提高系统的性能和稳定性,引入了线程池对线程进行统一的管理和监控,本文将详细讲解线程池的使用、原理。 为什么使用线程池 池化思想 线程池主要用到了池化思想,池化思想…

【计算机科学速成课】笔记一

文章目录 写在前面1.计算机的早期历史2.电子计算机3.布尔运算和逻辑门4.二进制5.算术逻辑单元-ALU6.寄存器和内存 写在前面 所有的一切源于这样一个网站——CS自学指南。 这是新手小白入门计算机科学必要了解的知识——【计算机科学速成课】[40集全/精校] - Crash Course Comp…

Dragonfly 拓扑的路由算法

Dragonfly 拓扑的路由算法 1. Dragonfly 上的路由 (1)最小路由(2)非最小路由 2. 评估3. 存在问题 (1)吞吐量限制(2)较高的中间延迟 references Dragonfly 拓扑的路由算法 John Kim, William J. Dally 等人在 2008 年的 ISCA 中提出技术驱动、高度可扩展的 Dragonfly 拓扑。而…

在做题中学习(53): 寻找旋转数组中的最小值

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode) 解法:O(logn)->很可能就是二分查找 思路:再看看题目要求,可以画出旋转之后数组中元素的大小关系: 首先,数组是具有二段性的(适配二分查…

数据库(MySQL)—— 索引

数据库(MySQL)—— 索引 什么是索引创建索引使用 CREATE INDEX 语句使用 ALTER TABLE 语句在创建表时定义索引特殊类型索引注意事项 举个例子无索引的情况有索引的情况为什么索引快索引的结构 今天我们来看看MySQL中的索引: 什么是索引 MyS…

财政部、交通运输部:推动北斗导航等新技术与交通基础设施融合

财政部、交通运输部:推动北斗导航等新技术与交通基础设施深度融合 近日,为深入贯彻落实中共中央、国务院关于加快建设交通强国、数字中国等决策部署,推进公路水路交通基础设施数字转型、智能升级、融合创新,加快发展新质生产力&a…

VisualGDB:Linux动态库项目创建、编译及库的使用

此篇接上篇 《VisualGDB:为Linux项目添加系统依赖库》,在本篇中我们重点分享一下如何基于VisualGDB 在VS中创建Linux动态库项目,如何编译及使用创建的动态库。 一、VisualGDB创建Linux动态库项目 如下,我们创建一个Linux下的动态库项目MyMath 二、编译动态库 我们稍微…

哈夫曼编码python算法实现(图片版)

一、问题: 请使用哈夫曼编码方法对给定的字符串,进行编码,以满足发送的编码总长度最小,且方便译码。“AABBCCDDEEABCDDCDBAEEAAA” 二、过程: 三、结果:

手动实现简易版RPC(四)

手动实现简易版RPC(四) 往期内容 手动实现简易版RPC(一):RPC简介及系统架构 手动实现简易版RPC(二):简单RPC框架实现 手动实现简易版RPC(三):mock数据生成 前言 接上几篇博客我们实现了最…

【6D位姿估计】FoundationPose 跑通demo 训练记录

前言 本文记录在FoundationPose中,跑通基于CAD模型为输入的demo,输出位姿信息,可视化结果。 然后分享NeRF物体重建部分的训练,以及RGBD图为输入的demo。 1、搭建环境 方案1:基于docker镜像(推荐&#xf…

重置密码之后无法ssh登录

背景描述 我这边有个服务器S,我从ServerA可以ssh上去,但是我从堡垒机B无法ssh上去;一开始以为是密码问题,手动重置密码,但是依然无法登录进去;一直提示密码错误;改了好几次密码都不行 问题原因…

5.9号模拟前端面试10问

5.9号模拟前端面试10问 1.html语义化的理解 HTML语义化是指使用具有明确含义的HTML标签来描述内容&#xff0c;而不仅仅是使用<div>和<span>等通用容器标签。语义化的HTML代码更易于阅读和维护&#xff0c;同时也有助于搜索引擎优化&#xff08;SEO&#xff09;。…

达梦数据库限制用户登录IP测试

达梦数据库创建用户时可以限制登录ip和时间段。 创建测试测试用户 create user test1 identified by Test_1234 ALLOW_IP "192.168.100.101"; 限定该用户只能通过192.168.100.101地址登录数据库 连接测试 上图可见&#xff0c;192.168.100.101客户端可以连接上19…

wish、亚马逊怎么给店铺引流?怎么运用自养号测评提高流量的转化率?

作为全球知名的跨境电商平台&#xff0c;wish、亚马逊为卖家提供了一个拓展海外市场的机会。然而&#xff0c;在wish、亚马逊平台上建立和经营一家成功的店铺需要有效的引流策略。那么&#xff0c;Wish、亚马逊怎样才能给店铺引流呢&#xff1f; 一、Wish、亚马逊怎么给店铺引…

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…

javaMail快速部署——发邮件喽~

目录 功能阐述 前序步骤 &#xff08;1&#xff09;到QQ邮箱中获取到授权码 代码实现 坑 今天在写一个修改密码的功能的时候要用到邮箱的发送&#xff0c;然后因为这个项目比较老旧了&#xff0c;采用的是javaWeb和jsp的配置&#xff0c;对于我只使用过springBoot整合的ja…

苹果新款 M4 芯片专注于 AI

爆炸性消息&#xff01;苹果的新一代 M4 芯片来了&#xff01;这家伙拥有 38 万亿次操作的超强神经引擎&#xff0c;速度比苹果 A11 芯片的 NPU 快 60 倍&#xff01;虽然它的速度还没有达到 Snapdragon X Elite 的 45 TOPS&#xff0c;但苹果自夸 M4 将提供与最新 PC 芯片相同…