Как подключиться к бд через pytest.fixture?

Для подключения к базе данных (БД) с использованием pytest.fixture в Python, мы можем использовать библиотеку pytest-docker, которая позволяет запустить контейнер с БД во время выполнения тестов и предоставляет доступ к ней через фикстуру.

Прежде всего, установите необходимые библиотеки, добавив их в файл requirements.txt или установив их напрямую через pip:

pip install pytest-docker pytest-postgresql

После установки библиотек создайте файл conftest.py в корневом каталоге вашего проекта. В этом файле вы можете определить фикстуры, используемые ваши тесты.

import pytest
from psycopg2 import connect


@pytest.fixture(scope="session")
def postgres():
    # Запускаем контейнер с PostgreSQL
    # Используйте свои настройки контейнера
    postgres_container = docker.run(
        image="postgres:latest",
        detach=True,
        ports={"5432/tcp": None},
        environment={"POSTGRES_PASSWORD": "test"},
    )
  
    # Получаем информацию о контейнере, включая IP-адрес и порт
    container_info = docker.inspect_container(postgres_container["Id"])
    container_ip = container_info["NetworkSettings"]["IPAddress"]
    container_port = container_info["NetworkSettings"]["Ports"]["5432/tcp"][0]["HostPort"]

    # Устанавливаем соединение с БД
    conn = connect(
        host=container_ip,
        port=int(container_port),
        user="postgres",
        password="test",
    )

    # Создаем тестовую базу данных
    conn.cursor().execute("CREATE DATABASE testdb")
  
    # Возвращаем соединение к БД
    yield conn
  
    # Закрываем соединение после выполнения всех тестов
    conn.close()
  
    # Останавливаем контейнер
    docker.stop(postgres_container["Id"])

Вышеуказанный код определяет фикстуру с именем "postgres", которая запускает контейнер PostgreSQL, создает тестовую базу данных и возвращает соединение к этой БД.

Теперь вы можете использовать эту фикстуру в ваших тестах, добавив имя фикстуры в качестве параметра в вашем тестовом методе:

def test_example(postgres):
    # Используйте соединение к БД ваших тестов
    cursor = postgres.cursor()
    cursor.execute("SELECT * FROM my_table")
    result = cursor.fetchall()

    # Проводите ассерты на основе полученных данных
    assert len(result) == 10

Функция test_example принимает фикстуру "postgres" в качестве параметра. Внутри теста мы можем использовать соединение к БД, чтобы выполнить SQL-запросы и проанализировать результаты.

Таким образом, с использованием pytest.fixture и библиотеки pytest-docker мы можем подключиться к БД через фикстуру в Python. Это позволяет нам легко управлять временными БД для тестов и избежать зависимости от реальных БД в процессе написания и запуска тестов.