Исходя из опыта Ruby on Rails, я очень ценю решения, которые стали стандартами сообщества для решения проблем. Одна из таких вещей - DatabaseCleaner gem, которая гарантирует, что ваши тесты будут выполняться раздельно и между ними нет утечек данных.

Недавно я искал подобное решение для Python, но, к своему удивлению, не нашел. Однако легко использовать то, что предлагают SQLAlchemy и Pytest, для обертывания тестов в отдельные транзакции базы данных. Позвольте мне показать вам аккуратный подход к проблеме, который, я надеюсь, вам будет удобно использовать.

Настройка подключения к БД

Прежде чем мы сможем использовать базу данных с транзакциями в наших тестах, нам нужно настроить отдельный экземпляр БД исключительно для тестов. Затем из нашего набора тестов нам нужно подключиться к БД. Вот пример того, как установить соединение с базой данных MySQL:

Если вы используете другое ядро ​​базы данных, обратитесь к документации SQLAlchemy для получения информации о том, как создавать разные строки подключения.

Создание таблицы и заполнение БД

Теперь нам нужно воссоздать структуру нашей базы данных. Предположим, что все модели в вашем приложении объявлены в файле models.py.

SQLAlchemy предлагает методы для простого создания и удаления таблиц, объявленных в схеме: create_all и drop_all. Мы будем использовать их в начале выполнения набора тестов, чтобы убедиться, что все таблицы на месте. После полного тестового прогона мы отбросим все таблицы, чтобы следующее выполнение могло начаться с чистого листа.

Если вам нужно, чтобы база данных была предварительно сконфигурирована с некоторыми данными, вы можете запустить метод заполнения базы данных. Вот простой пример:

Обертывание тестов в транзакциях

В качестве последнего шага нам нужно определить способ использования транзакций в нашем наборе тестов. Следовательно, мы создадим приспособление, которое будет создавать новую транзакцию для каждого теста.

Затем вы можете внедрить прибор в свои тестовые примеры. В конце каждого выполнения теста все созданные данные будут уничтожены, что обеспечит разделение тестовых случаев.

Резюме

Настройка рабочих транзакций с Pytest и SQLAlchemy не займет много времени, если вы знаете, как это делать. Я надеюсь, что вы найдете это решение удобным и простым в использовании. Конечно, если у вас есть идеи, которыми вы можете поделиться или предложить улучшения, дайте мне знать в комментариях - я всегда рад узнать что-то новое.

Для дальнейшего использования ниже представлен полный код, который вы можете повторно использовать в своих проектах.
Удачи и получайте удовольствие от написания тестов с транзакциями!