我在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内运行测试之间切换吗?
相关:
- https://github.com/quiqua/pytest-dotenv
- 如何从.env文件中加载变量
- 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
最终正确地加载了环境文件。