Pytest在函数顶部还是在函数内部导入

时间:2019-06-13 17:36:01

标签: 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>
    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

1 个答案:

答案 0 :(得分:1)

您似乎唯一要设置'env'环境变量的地方是在env_setup固定装置中。与所有灯具一样,灯具中的代码仅在运行测试时适用。当您尝试在测试模块的顶层导入engine时,当前没有任何测试有效,因此(除非您已将'env'设置在其他位置)os.environ['env']将被取消设置在那时候。从测试函数中导入engine之所以可行,是因为在运行测试函数之前,固定装置会为环境变量提供一个值。

我不知道您通过将os.environ['env']分配给顶级模块变量来完成什么,但是您可能会以错误的方式进行操作。特别是,如果您预先设置'env' envvar以便模块级导入有效,则env_val不会受到Monkeypatching的影响。