Python 中的 Unit testing 文件写入

news2024/12/23 22:43:14

在 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 only

def 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.coloradmin.cn/o/1651967.html

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

相关文章

Chromium编译指南2024 Windows11篇-GN 工具生成构建文件(六)

前言 在《Chromium编译指南2024(五)》我们已经获取了 Chromium 的源代码并且同步了相关的第三方依赖。 现在,我们将进一步学习如何使用 GN 工具生成构建文件,为后续的编译工作做好准备。 1. 使用gn工具生成构建文件 再次在Win…

禅道20.0.stable发布啦,重构底层PHP和UI框架,用户体验全新升级

禅道20.0.stable版本终于正式发布啦! 自2023年4月启动以来,经过一年多的努力,我们动员了全公司的产研力量,致力于为用户提供全新的用户体验。 本次版本升级主要包括两个方面:一是用户体验全新升级,二是整体…

4diacIDE同时编译不同版本踩坑记录

4diac不同版本依赖插件版本及jdk版本是不同的,当你需要搭建不同版本4diacIDE开发环境时,就会出现各种问题。最近一个月github上项目提交记录比较多,出现了不少坑。以下记录下此背景下的解决方法: 1、首先由于.target依赖的eclipse…

搭建电商ERP系统电商独立站最实用的电商API商品数据采集接口||电商API接口接入

通常搭建电商独立站需要接入的商品数据接口包括: 1. 商品信息接口:包括商品基本信息(名称、描述、价格等)、图片信息、库存信息、分类信息等。 2. 库存信息接口:用于同步更新商品的库存情况,保证实时性…

DC-DC电路中电感的下方该不该挖空

DC-DC电路中的电感下方该不该挖空? 在回答这个问题之前,先来了解一下DC-DC电路中常见的功率电感类型 一.DC-DC电路常用功率电感类型 图1 DC-DC电路常用电感类型 这四种类型电感,按照无屏蔽电感→磁封胶半屏蔽电感→组装式全屏蔽…

I forgot my Plex Account PIN; how can I reset it? How can I change my PIN?

If you’ve set a PIN on your Plex account, it’s possible to reset or remove that PIN. Related Page: Plex Home Regular Plex Account If you know the current PIN If the current PIN is known, then simply edit the current PIN on the Settings > Users &…

uni-app 多列picker切换列显示对应内容

html部分&#xff1a; <view class"uni-list"><view class"uni-list-cell"><view class"uni-list-cell-left">选择用户</view><view class"uni-list-cell-db"><picker mode"multiSelector"…

python绘制等高线函数参数说明

文章目录 函数说明参数说明返回值示例生成双峰山体数据代码案例生成三维的空间双峰山形函数 plt.contour 是 Matplotlib 库中的一个函数&#xff0c;用于绘制等高线图。等高线图是一种特殊的地图&#xff0c;其中等高线表示相同高度的等值线。 函数说明 matplotlib.pyplot.co…

2024年四川省中小企业数字化转型城市试点申报对象要求、时间安排

一、重点任务 &#xff08;一&#xff09;聚焦企业需求&#xff0c;加快中小企业数字化转型。以中小企业数字化转型为契机&#xff0c;促进数字经济和实体经济深度融合。优先将数字化转型需求迫切、具备一定数字化基础的专精特新中小企业纳入试点范围。围绕中小企业创新、市场…

【BUUCTF】Crypto_RSA(铜锁/openssl使用系列)

【BUUCTF】Crypto_RSA&#xff08;铜锁/openssl使用系列&#xff09; 1、题目 在一次RSA密钥对生成中&#xff0c;假设p473398607161&#xff0c;q4511491&#xff0c;e17 求解出d作为flga提交 2、解析 RSA加密过程&#xff1a; 1&#xff09;选择素数&#xff1a;选择两个不…

AI绘画是什么?分享11张精美的AI绘画图片

AI绘画是什么&#xff1f; AI绘画是指利用人工智能技术来生成艺术作品的一种创作方式。通过训练机器学习算法&#xff0c;使计算机能够学习艺术家的风格和技巧&#xff0c;并自动生成类似的绘画作品。这种技术可以模仿各种绘画风格&#xff0c;如印象派、抽象艺术、写实主义等&…

Shopify如何安装Google Search Console

1&#xff0c;注册google search console账号 注册链接 https://search.google.com/search-console/about 2&#xff0c;输入网址 有两种方式&#xff0c;&#xff0c;都可使用&#xff0c;看个人习惯&#xff0c;我这边后续使用网址前缀来操作 3&#xff0c;填写网址后点击继…

618购物狂欢有哪些值得买的?五款心水好物真实分享!

618购物狂欢即将到来&#xff0c;你是不是已经迫不及待地期待着各种优惠和折扣&#xff1f;在这个充满购物狂欢的时刻&#xff0c;大家可能会犹豫在众多商品中该如何选择。不用担心&#xff01;我已经为大家精心挑选了五款心水好物&#xff0c;并进行了真实的分享&#xff0c;帮…

【C#】DateTime类型数组含有null?并排序

代码 internal class Program{static void Main(string[] args){List<DateTime?> dateTimes new List<DateTime?> { null,DateTime.MinValue,DateTime.MaxValue};var temp new List<DateTime?> { };dateTimes.Sort();//dateTimes.Reverse();foreach (va…

基于springboot的校园食堂订餐系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

如何保护数据安全?迅软DSE加密系统给信息撑把保护伞!

信息安全当然需要保护&#xff0c;不然企业的信息可以发给任何人&#xff0c;普通信息还好&#xff0c;如果是重要机密呢&#xff0c;企业重要信息被发出去后可能会造成一些麻烦&#xff0c;所以可以使用加密系统&#xff0c;对数据进行安全保护&#xff0c;防止泄密问题&#…

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…

详解:牵牛易帮-免费知识库工具的弊端

众所周知&#xff0c;知识库工具已成为企业必不可少的一部分&#xff0c;它们可以提升工作效率、优化客户体验。牵牛易帮作为一款免费的知识库工具&#xff0c;吸引了众多小微企业和个人用户。然而&#xff0c;免费是有两面性的&#xff0c;牵牛易帮也不例外。本文将对牵牛易帮…

等离子刻蚀中的化学键是如何断裂与生成的?

知 识星球&#xff08;星球名&#xff1a; 芯片制造与封测社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; 我看 到一本书上 说刻蚀SiO2需要C&#xff0c;这个C会和SiO2中的O结合。 较弱的 si和f结合从而被刻蚀。 但是另一本书上写Si…

封装一个可以最小化和展开的弹窗组件

gl-dialog 大概思路&#xff1a; 在弹窗组件内部引入gl-dialog-collapse&#xff0c;这个组件主要用于存储已经被最小化的弹窗&#xff08;基础数据&#xff09; 弹窗内部的数据如何在父组件拿到是通过作用域插槽来实现的 gl-dialog接收一个tempData这个数据会在内部被记录下来…