如何在加载pytest脚本之前使用python-dotenv从文件加载环境变量?



我在https://github.com/pytest-docker-compose/pytest-docker-compose内部docker容器上进行了测试,但容器启动/关闭确实需要很长时间。然后,我想让docker-compose只在CI机或需要时运行测试。

为此,我使用以下方式定义simple_test_runner.py上的测试:

import os
THIS_FOLDER = os.path.dirname(os.path.realpath(__file__))
RUN_TESTS_LOCALLY = os.environ.get('RUN_TESTS_LOCALLY')
if RUN_TESTS_LOCALLY:
def test_simple(run_process, load_env):
output, returncode = run_process("python3 " + THIS_FOLDER + "/simple_test.py")
assert returncode == 0
else:
def test_simple(function_scoped_container_getter):
container = function_scoped_container_getter.get("container_name")
exec = container.create_exec("python3 /simple_test.py")
...

如果我在调用pytest -vs .之前导出RUN_TESTS_LOCALLY=1,则此工作文件,但如果我尝试在conftest.py中使用https://github.com/theskumar/python-dotenv:

from dotenv import load_dotenv
@pytest.fixture(scope='session', autouse=True)
def load_env():
print("Loading .env file")
load_dotenv()

环境变量只有在python测试加载simple_test_runner.py之后才会加载。然后,当定义RUN_TESTS_LOCALLY=1时,我的测试总是在docker内部运行,而不是在docker外部运行。

在测试中评估交换机if RUN_TESTS_LOCALLY:之前,我如何使pytest调用load_dotenv()?

或者你知道if RUN_TESTS_LOCALLY:的替代方案,它允许我使用load_dotenv()并在docker-compose内运行测试之间切换吗?

相关:

  1. https://github.com/quiqua/pytest-dotenv
  2. 如何从.env文件中加载变量
  3. pytest—如何使用全局/会话范围的fixture ?

我最初发布的代码正在工作:

@pytest.fixture(scope='session', autouse=True)
def load_env(request):
file = THIS_FOLDER + '/.env'
if request.config.getoption("verbose") > 0:
print("Loading", file, file=sys.stderr)
load_dotenv(dotenv_path=file)

问题是,当我进行测试时,我将环境变量设置为RUN_TESTS_LOCALLY=(空字符串)。这导致dotenv不能覆盖我的环境变量。一旦我用bash unset RUN_TESTS_LOCALLY取消了变量设置,dotenv最终正确地加载了环境文件。