pytest未执行chats/__init__.py导致环境变量无法读取问题排查
问题分析与解决思路
首先纠正一个误解:chats/__init__.py其实已经被执行了,只是执行时机早于你设置环境变量的时机,导致它获取到的API_ID和API_HASH都是None,才会出现后续无法识别的问题。
具体来说,你的测试代码里先执行了from chats import messenger,这时候Python会加载chats包,自动执行__init__.py里的代码——但此时你还没设置环境变量,所以environ.get()拿到的是空值。之后再设置环境变量,已经无法改变__init__.py里已经赋值好的API_ID和API_HASH了。
下面是几个可行的解决思路:
1. 调整环境变量设置的顺序
把设置环境变量的代码放到模块导入之前,确保__init__.py执行时环境变量已经存在:
import asyncio import pytest import os # 先设置环境变量 os.environ["API_ID"] = 'API_ID' os.environ["API_HASH"] = 'API_HASH' # 再导入目标模块 from chats import messenger def test_get_last_message(): assert asyncio.new_event_loop().run_until_complete(messenger.get_last_message('PARAM')) == '1'
2. 用pytest Fixture管理环境变量
通过autouse类型的fixture,在所有测试执行前统一设置环境变量,同时还能在测试结束后清理:
import asyncio import pytest import os @pytest.fixture(autouse=True, scope='session') def setup_test_env(): # 测试前设置环境变量 os.environ["API_ID"] = 'API_ID' os.environ["API_HASH"] = 'API_HASH' yield # 测试后清理环境变量,避免影响其他测试 del os.environ["API_ID"] del os.environ["API_HASH"] # 导入操作放在fixture之后,确保环境变量已生效 from chats import messenger def test_get_last_message(): assert asyncio.new_event_loop().run_until_complete(messenger.get_last_message('PARAM')) == '1'
3. 修改模块设计,延迟获取环境变量
不要在__init__.py里直接赋值常量,而是改成函数形式,在需要使用时实时获取环境变量,这样不管环境变量什么时候设置,都能拿到最新值:
修改chats/__init__.py:
from os import environ def get_api_id(): return environ.get('API_ID') def get_api_hash(): return environ.get('API_HASH')
然后在messenger.py里调用这两个函数来获取值,而不是直接引用API_ID和API_HASH变量:
from chats import get_api_id, get_api_hash async def get_last_message(param): api_id = get_api_id() api_hash = get_api_hash() # 后续业务逻辑...
内容的提问来源于stack exchange,提问作者Andrei Buldakov
相关产品推荐
相关产品推荐

