Python 从文件加载值的配置模块的单元测试
对单元测试(使用pytest)不熟悉,并尝试了解如何测试配置模块,该模块从ini文件加载其值,并将其与环境隔离 我想测试文件中的值是否与加载到配置实例中的值相同 如图所示,ini文件在模块中是硬编码的,但不希望在可能不可用时绑定到config.ini 这是配置模块的简化版本:Python 从文件加载值的配置模块的单元测试,python,unit-testing,pytest,Python,Unit Testing,Pytest,对单元测试(使用pytest)不熟悉,并尝试了解如何测试配置模块,该模块从ini文件加载其值,并将其与环境隔离 我想测试文件中的值是否与加载到配置实例中的值相同 如图所示,ini文件在模块中是硬编码的,但不希望在可能不可用时绑定到config.ini 这是配置模块的简化版本: from configparser import ConfigParser class Configuration(): def __init__(self, ini_file): parser
from configparser import ConfigParser
class Configuration():
def __init__(self, ini_file):
parser = ConfigParser()
parser.read(ini_file)
for section_name in parser.sections():
self.__dict__.update(parser.items(section_name))
config = Configuration('config.ini')
我访问以下配置值:
from config import config
print(config.port)
非常感谢您的帮助。您写道:
如何以将配置模块与其环境隔离的方式测试配置模块[…]
而且
我想测试文件中的值是否与加载到配置实例中的值相同
我的理解如下:您希望测试链“配置输入数据”->ConfigParser
->configuration
,以检查是否会以预期的方式在配置中找到“配置输入数据”。顺便说一句,这是一个集成测试场景,而不是单元测试场景
关于您提到的隔离,我的理解是,您不想使用'config.ini'作为数据源,而是您可以控制的东西。您已经将配置文件的名称作为参数提供给构造函数。这是一个很好的步骤,因为它从测试方面为您提供了一些控制,也就是说,为您提供了从测试中指定要使用的文件的选项
但是,您甚至可以进一步了解这一点:ConfigParser
类可以从字符串而不是文件中读取(方法是read\u string
,在Python 3.2中是新的:)。如果更改代码,以便测试可以控制Configuration
是否指示ConfigParser
读取文件或字符串,则可以通过提供字符串作为输入来创建集成测试,从而将您与文件系统隔离
有许多方法可以更改代码,以便测试可以使其从字符串而不是从文件进行解析:一种简单的方法是,将ConfigParser
对象本身作为函数的参数。这样,您就可以从外部创建ConfigParser,并从文件或字符串中读取它。另一个选项是,从助手方法读取数据,您可以在测试中覆盖它。太棒了!谢谢,这很有道理!我曾考虑模拟文件或构建文件对象本身,但这要好得多。