Как протестировать схемы элементов, зарегистрированные в разных областях

#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. Извините, у меня было несколько ошибок в ответе — надеюсь, я исправил их сейчас.