#python #flask #environment-variables #pytest
#python #flask #среда-переменные #pytest
Вопрос:
У меня есть простое приложение в Flask, в котором есть чертежи, зарегистрированные только в определенных областях, когда они находятся в производстве.
def create_app():
app = Flask(__name__)
app.register_blueprint(ping, url_prefix="/")
if os.getenv("SCOPE") == "scope1":
app.register_blueprint(b1, url_prefix="/b1")
if os.getenv("SCOPE") == "scope2":
app.register_blueprint(b2, url_prefix="/b2")
return app
Моя проблема в том, что когда я пытаюсь протестировать эти конечные точки, я получаю ответ 404, потому что они не зарегистрированы, поскольку нет переменной env. Я пытался установить область видимости переменной для разных тестовых файлов, используя os.environ
и dotenv
, но я не смог заставить их работать.
Это один из моих тестов в качестве примера
def test_endpoint(client):
resp = client.post("/b1/endpoint")
assert resp.status_code == 200
Я не знаю, как определить переменные env, чтобы заставить это работать.
Это мой conftest.py
@pytest.fixture
def app():
app = create_app()
return app
Заранее спасибо.
Комментарии:
1. Можете ли вы отредактировать свой вопрос, чтобы показать, как вы устанавливаете переменную среды в своем тесте?
2. @MrBeanBremen Я добавил тест в качестве примера, но то, что вы спрашиваете, — это именно то, что я не знаю, как сделать
3. Ну, вы написали, что пытались установить переменную… Вы пробовали
monkeypatch.setenv
?4. @MrBeanBremen я пробовал это, но это не работает, потому что к тому времени, когда я исправляю его в тесте, приложение уже запущено, и чертежи уже зарегистрированы
5. Вы пытались установить переменную в приспособлении с привязкой к сеансу? Я не уверен, в какой момент создается приложение (например, при создании
client
приспособления), поэтому оно может работать, а может и не работать.
Ответ №1:
Вы можете просто установить переменную среды в том же приспособлении, которое создает приложение:
@pytest.fixture
def app(monkeypatch):
monkeypatch.setenv("SCOPE", "scope1")
yield create_app()
Если вы хотите использовать разные области в разных тестах, вместо этого вы параметризуете приспособление:
@pytest.fixture
def app(request, monkeypatch):
scope = request.param if hasattr(request, "param") else "scope1"
monkeypatch.setenv("SCOPE", scope)
yield create_app()
@pytest.mark.parametrize("app", ["scope1"], indirect=True)
def test_endpoint(app, client):
resp = client.post("/b1/endpoint")
...
Я добавил проверку param
, чтобы убедиться, что тест, который не параметризован, использует область по умолчанию (в данном случае «scope1»).
Это также может быть полезно, если вы хотите запустить один и тот же тест в разных областях:
@pytest.mark.parametrize("app", ["scope1", "scope2"], indirect=True)
def test_endpoint(app, client):
resp = client.post("/b1/endpoint")
...
Комментарии:
1. мне нравится ваша идея, но я не могу заставить ее работать. Часть, в которой вы делаете mark.parametrize, выдает мне ошибку «функция не использует параметр ‘scope'»
2. Извините, у меня было несколько ошибок в ответе — надеюсь, я исправил их сейчас.