Python Pytest在函数中导入top vs

Python Pytest在函数中导入top vs,python,python-3.x,pytest,Python,Python 3.x,Pytest,当我在测试模块中的方法中移动实现模块的导入时,测试工作正常。但是,当我将导入放在顶部时,我会收到一个错误,说明找不到环境变量 为什么在将导入放在文件顶部时未设置环境变量,以及如何在不将导入移动到函数内部的情况下修复它 错误消息 test/test_engine.py:4: in <module> from reptar_validation_engine import get_client_id source/engine.py:30: in <module>

当我在测试模块中的方法中移动实现模块的导入时,测试工作正常。但是,当我将导入放在顶部时,我会收到一个错误,说明找不到环境变量

为什么在将导入放在文件顶部时未设置环境变量,以及如何在不将导入移动到函数内部的情况下修复它

错误消息

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'
测试模块-此操作失败

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()
测试模块-此功能有效

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()
引擎.py

import pytest


@pytest.fixture(autouse=True)
def env_setup(monkeypatch):
    monkeypatch.setenv('env', 'dev')
import os

env_val = os.environ['env']

def get_client_id:
    pass

设置环境变量的唯一位置是
环境设置
夹具。与所有装置一样,装置内的代码仅在测试运行时应用。当您尝试在测试模块的顶层导入
引擎
时,当前没有有效的测试,因此(除非您在其他地方设置了
'env'
os.environ['env']
此时将被取消设置。从测试函数中导入
引擎
,因为在运行测试函数之前,夹具会给环境变量一个值


我不知道通过将
os.environ['env']
赋值给顶级模块变量,您试图实现什么,但您可能做得不对。特别是,如果您事先设置了
'env'
envvar,以便模块级导入工作,那么
env_val
将不会受到monkeypatching的影响。

您的问题是什么?很抱歉没有弄清楚。我想检查为什么在将导入放在文件顶部时没有设置环境变量,以及如何在不将导入移动到函数中的情况下修复它。您在哪里设置环境变量?@jwodder我在engine.py中设置它,而不在方法定义之外。@PunterVicky:您发布的代码不显示设置环境变量,只显示检索环境变量。谢谢,这很有帮助。我将重构它。