如何在python单元测试中模拟导入模块中的全局变量?
我有一个特殊的场景,如下面的帖子 但不同的是,我的数据库模块还有一个全局变量,需要模拟如何在python单元测试中模拟导入模块中的全局变量?,python,python-3.x,unit-testing,pytest,python-unittest,Python,Python 3.x,Unit Testing,Pytest,Python Unittest,我有一个特殊的场景,如下面的帖子 但不同的是,我的数据库模块还有一个全局变量,需要模拟 """Initialzation""" from database.db_init import DB from common.common_util import CommonUtil as util db_username = util.get_value_from_ssm_parameter_store( '/_userna
"""Initialzation"""
from database.db_init import DB
from common.common_util import CommonUtil as util
db_username = util.get_value_from_ssm_parameter_store(
'/_username')
db_password = util.get_value_from_ssm_parameter_store(
'/rds/_password')
db_host = DB.get_rds_host()
def create_session():
"""this will create a db session"""
db = DB(user=db_username, password=db_password,
host=db_host, database='test')
Session = db.getSession()
session = Session()
return session
我模拟了从_ssm_parameter_store()函数中获取_value_,甚至模拟变量为@patch('database.db_username','test'),还尝试在我的unittest类中使用database.db_username=MagicMock(return_value='test')
但aws仍然面临着挑战。有人能帮我模拟导入模块中的全局变量吗?因为
util.get\u value\u from\u ssm\u parameter\u store()
和DB.get\u rds\u host()
方法在session.py
的模块范围内执行
在从session
模块导入create\u session
功能之前,应先修补这些方法
例如
common/common_util.py
:
class CommonUtil:
@静力学方法
def从参数存储(键)获取值:
打印('调用真实aws')
数据库/db_init.py
:
课堂会话:
通过
DB类:
@静力学方法
def get_rds_host():
返回“127.0.0.1”
def uuu init uuuu(自我、用户、密码、主机、数据库)->无:
通过
def getSession(self):
返回会话
session.py
:
from database.db\u init import db
从common.common_util导入CommonUtil作为util
db\u username=util.get\u value\u from\u ssm\u parameter\u store(
“/\u用户名”)
db\u password=util.get\u value\u来自\u ssm\u参数\u存储(
“/rds/_密码”)
db_host=db.get_rds_host()
def create_会话():
“”“这将创建数据库会话”“”
db=db(用户=db\u用户名,密码=db\u密码,
host=db\u主机,数据库='test')
Session=db.getSession()
会话=会话()
返回会话
测试会话.py
:
导入单元测试
从unittest.mock导入补丁,mock,调用
从common.common_util导入CommonUtil作为util
从database.db_init导入数据库
def get_value_from_ssm_参数_store_副作用(键):
如果key=='/_username':
返回“邓丽君”
如果key=='/rds/_password':
返回“123456”
原始\u从\u ssm\u参数\u存储获取\u值\u=util.get\u值\u从\u ssm\u参数\u存储获取
原始\u获取\u rds\u主机=DB.get\u rds\u主机
util.get_value_from_ssm_parameter_store=Mock(side_effect=get_value_from_ssm_parameter_store_side_effect)
DB.get\u rds\u host=Mock(返回值=192.168.1.1')
类TestSession(unittest.TestCase):
@修补程序('session.DB',autospec=True)
def测试创建会话(自、模拟数据库):
从会话导入创建会话
db\u instance=mock\u db.return\u值
mock_session=mock()
db_instance.getSession.return_value=mock_session
创建会话()
mock_DB.assert_用('teresa teng','123456','192.168.1.1','test'一次调用___)
util.get_value_from_ssm_parameter_store.assert_有_调用([call('/_username')、call('/rds/_password'))
db_instance.getSession.assert_调用了_once()
#恢复模拟
util.get_value_from_ssm_parameter_store=原始_get_value_from_ssm_parameter_store
DB.get\u rds\u host=原始\u get\u rds\u主机
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
unittest.main()
单元测试结果:
⚡ coverage run /Users/dulin/workspace/github.com/mrdulin/python-codelab/src/stackoverflow/64329623/test_session.py && coverage report -m --include='./src/**'
.
----------------------------------------------------------------------
Ran 1 test in 0.011s
OK
Name Stmts Miss Cover Missing
--------------------------------------------------------------------------------
src/stackoverflow/64329623/common/common_util.py 4 1 75% 4
src/stackoverflow/64329623/database/db_init.py 10 3 70% 8, 11, 14
src/stackoverflow/64329623/session.py 10 0 100%
src/stackoverflow/64329623/test_session.py 28 0 100%
--------------------------------------------------------------------------------
TOTAL 52 4 92%