单元测试的新手(使用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)
非常感谢任何帮助。
答案 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并从文件或字符串中读取它。另一个选择是从帮助程序方法中读取数据,您可以在测试中覆盖该方法。