繁体   English   中英

用Python编写单元测试文件

[英]Unit testing file write in Python

我正在用Python编写ConfigParser的包装程序,以提供用于存储和检索应用程序设置的简便接口。

包装器有两种方法, readwrite ,以及用于不同应用程序设置的一组属性。

write方法只是ConfigParserwrite方法的包装,另外还创建了ConfigParser所需的文件对象。 看起来像这样:

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

我想编写一个单元测试,断言该方法在无法写入文件时引发IOError,而在另一种情况下,调用配置解析器的write方法。

使用模拟对象进行第二项测试非常容易。 但是open电话使事情变得有些棘手。 最终,我必须创建一个文件对象以传递给配置解析器。 运行此代码时实际上将创建文件的事实并不能使其对单元测试非常有用。 有一些模拟文件创建的策略吗? 这段代码可以通过某种方式进行测试吗? 还是测试太简单了?

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

接下来,您不想执行文件系统操作来获取open()来生成所需的错误,因为这样就无需进行单元测试,而是通过包含文件系统来进行功能/集成测试。

因此,您可以使用仅引发IOError的代理替换全局名称空间中的open() 但是,如果继续执行,可能需要确保您放回原处。

但是最后,测试有什么价值? 您自己的系统中的代码片段很少。 即使替换open()实际上实际上最终只是一个测试,内容为“ Python中的tryfinally语句是否起作用?”

我的建议? 只需在文档字符串中添加一条记录您的期望的语句即可。 “如果无法写入文件,则引发IOError。” 然后继续前进。 如果此方法增加了一些复杂性(以及测试的优点),则可以稍后添加单元测试。

实际上,只有open可能在您的代码中引发异常。 write()的文档未提及任何有关异常的内容。 可能仅是ValueError或用于错误文件指针的内容(由于打开失败而导致的情况,此处不是这种情况)。

使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。 该代码表明确实如此。 不要过度测试。 ;)

请记住,您不必测试open()或ConfigParser的工作-它们不是代码的一部分-您只需要测试是否正确使用它们即可。 您可以像实例属性一样,使用自己的open()对该模块进行猴子修补,并可以从中返回模拟内容来帮助您进行测试。

然而,单元测试是不是我唯一的工具,这是一个功能,这是很简单的分析和“证明”†,它的作品。

我确定,严格程度不如数学家所希望,但对我来说足够好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM