Для подключения к базе данных (БД) с использованием 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. Это позволяет нам легко управлять временными БД для тестов и избежать зависимости от реальных БД в процессе написания и запуска тестов.