python - 从文件加载值的配置模块的单元测试
问题描述
单元测试新手(使用 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
以检查是否会以Configuration
预期的方式找到“配置输入数据”。顺便说一句,这是一个集成测试场景而不是单元测试场景。
关于您提到的隔离,我理解您不想使用“config.ini”作为数据源,而是在您的控制之下。您已经将配置文件的名称作为参数提供给构造函数。这是一个很好的步骤,因为它使您可以从测试方面进行一些控制,即让您可以选择指定要从测试中使用的文件。
但是,您甚至可以更进一步:ConfigParser
该类可以从字符串而不是文件中读取(该方法是read_string
Python 3.2 中的新方法:https ://docs.python.org/3/library/configparser.html )。如果您更改代码以使测试可以控制是Configuration
指示ConfigParser
从文件读取还是从字符串读取,您可以通过提供字符串作为输入来创建集成测试,从而将您与文件系统隔离开来。
有很多方法可以更改代码,以便测试可以使其从字符串而不是文件中解析:一种简单的方法是,使ConfigParser
对象本身成为函数的参数。这样,您将从外部创建 ConfigParser 并从文件或字符串中读取它。另一种选择是,从帮助方法中读取,您可以在测试中覆盖该方法。
推荐阅读
- c# - 有没有办法在linq中做到这一点?
- javascript - CORS - Java 和 Javascript
- python-3.x - 当我们指定负小数时,函数如何工作
- .net - 错误 - 托管服务器上的 403.14 IIS,但本地应用程序有效
- netcdf4 - 使用 Python 进行 THREDDS 和 METAR 绘图
- terraform - Terraform 资源中的条件嵌套块
- javascript - 在 JavaScript 中使用 prompt() 存储用户输入的最佳方法是什么?
- android - 在颤振中加载自定义 ML 模型时出错
- python - 蛇状簇的聚类算法
- python-3.x - python中的SQL sum() over() 等价物