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

时间:2018-12-19 08:30:24

标签: python unit-testing pytest

单元测试的新手(使用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)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您写:

  

如何测试配置模块,使其与环境隔离。

而且

  

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

我以下列方式理解:您想测试“配置输入数据”链-> ConfigParser-> Configuration,以检查是否在“配置输入数据”中找到Configuration以预期的方式。顺便说一句,这是一个集成测试方案而不是单元测试方案。

关于您提到的隔离,我理解它是为了避免使用'config.ini'作为数据源,而是将其控制在您的控制之下。您已经提供了配置文件的名称作为构造函数的参数。这是一个很好的步骤,因为它使您可以从测试方面进行一些控制,即为您提供从测试中指定要使用的文件的选项。

但是,您甚至可以更进一步:ConfigParser类可以从字符串而不是文件中读取(该方法为read_string,是Python 3.2中的新增功能:https://docs.python.org/3/library/configparser.html)。如果更改代码以使测试可以控制Configuration指示ConfigParser从文件还是从字符串读取,则可以通过提供字符串作为输入来创建集成测试,从而将您与文件系统。

有许多方法可以更改代码,以便测试可以使它从字符串而不是从文件中进行解析:一种简单的方法是使ConfigParser对象本身成为函数的参数。这样,您可以从外部创建ConfigParser并从文件或字符串中读取它。另一个选择是从帮助程序方法中读取数据,您可以在测试中覆盖该方法。