Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文件加载值的配置模块的单元测试_Python_Unit Testing_Pytest - Fatal编程技术网

Python 从文件加载值的配置模块的单元测试

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

对单元测试(使用pytest)不熟悉,并尝试了解如何测试配置模块,该模块从ini文件加载其值,并将其与环境隔离

我想测试文件中的值是否与加载到配置实例中的值相同

如图所示,ini文件在模块中是硬编码的,但不希望在可能不可用时绑定到config.ini

这是配置模块的简化版本:

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,并从文件或字符串中读取它。另一个选项是,从助手方法读取数据,您可以在测试中覆盖它。

太棒了!谢谢,这很有道理!我曾考虑模拟文件或构建文件对象本身,但这要好得多。