当我在测试模块中的方法内移动实现模块的导入时,测试工作正常。但是,当导入位于顶部时,出现错误,指出未找到环境变量。
为什么将导入放置在文件顶部时未设置环境变量,以及如何在不将导入移入函数内的情况下进行修复
错误消息
test/test_engine.py:4: in <module>
from reptar_validation_engine import get_client_id
source/engine.py:30: in <module>
ATHENA_DB = os.environ['env']
venv/lib/python3.6/os.py:669: in __getitem__
raise KeyError(key) from None
E KeyError: 'env'
conftest.py
import pytest
@pytest.fixture(autouse=True)
def env_setup(monkeypatch):
monkeypatch.setenv('env', 'dev')
测试模块-失败
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../', 'source')))
from engine import get_client_id
def test_get_client_id():
get_client_id()
测试模块-有效
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../', 'source')))
def test_get_client_id():
from engine import get_client_id
get_client_id()
engine.py
import os
env_val = os.environ['env']
def get_client_id:
pass
答案 0 :(得分:1)
您似乎唯一要设置'env'
环境变量的地方是在env_setup
固定装置中。与所有灯具一样,灯具中的代码仅在运行测试时适用。当您尝试在测试模块的顶层导入engine
时,当前没有任何测试有效,因此(除非您已将'env'
设置在其他位置)os.environ['env']
将被取消设置在那时候。从测试函数中导入engine
之所以可行,是因为在运行测试函数之前,固定装置会为环境变量提供一个值。
我不知道您通过将os.environ['env']
分配给顶级模块变量来完成什么,但是您可能会以错误的方式进行操作。特别是,如果您预先设置'env'
envvar以便模块级导入有效,则env_val
不会受到Monkeypatching的影响。