Условно выбрать приспособление в pytestPython

Программы на Python
Ответить
Anonymous
 Условно выбрать приспособление в pytest

Сообщение Anonymous »

У меня есть сборка ETL с sqlalchemy. Чтобы протестировать это, мы используем postgres в Docker-контейнере через pytest-docker.

Но поскольку на некоторых компьютерах вращение Docker-контейнера занимает некоторое время, у нас также есть бэкэнд sqlite.
Вопрос в том, как условно выбрать любой бэкэнд без вращения Docker-контейнера с фиксаторами docker_ip и docker_services, предоставляемыми pytest-docker?
У меня есть следующее:
@pytest.fixture(name="sqlite_db", scope="session")
def fixture_sqlite_db():
...
yield engine

@pytest.fixture(name="postgres_db", scope="session")
def fixture_postgres_db(docker_ip, docker_services):
...
yield engine

@pytest.fixture(name=mock_get_engine", scope="session")
def fixture_mock_get_engine(engine):
with pytest.MonkeyPatch.context() as mock:
mock.setattr(my_module, "get_engine", lambda: engine)
yield mock

До сих пор оба приспособления движка запускались в отдельных тестовых файлах с копиями всех тестов, при этом postgres имел:
if not os.getenv("TEST_POSTGRES", False):
pytest.skip("skipping postgres database tests", allow_module_level=True)

это сработало, но скопировать половину набора тестов — это далеко не идеально.
---
Есть ли способ условно выбрать прибор?
Я пробовал:
@pytest.fixture(name="engine", scope="module")
def fixture_engine():
if os.getenv("TEST_POSTGRES", False):
engine = fixture_postgres_db()
else:
engine = fixture_sqlite_db()
yield engine

но это не сработало.
Изменить:
Для этого можно использовать встроенный запрос фикстуры. Параметризованная документация использует его в немного другом контексте, но никогда не останавливается на этом. Пришлось потрудиться:(
Используя request.getfixturevalue, можно выбрать прибор.
@pytest.fixture(name="engine", scope="module")
def fixture_engine(request):
if os.getenv("TEST_POSTGRES", False):
engine = request.getfixturevalue("postgres_db")
else:
engine = request.getfixturevalue("sqlite_db")
yield engine


Подробнее: https://stackoverflow.com/questions/798 ... -in-pytest
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»