首页 > 解决方案 > 从文件加载值的配置模块的单元测试

问题描述

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

非常感谢任何帮助。

标签: pythonunit-testingpytest

解决方案


你写:

我如何以将配置模块与环境隔离的方式测试配置模块 [...]。

但是也

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

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

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

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

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


推荐阅读