You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:11:20