Исходя из опыта Ruby on Rails, я очень ценю решения, которые стали стандартами сообщества для решения проблем. Одна из таких вещей - DatabaseCleaner gem, которая гарантирует, что ваши тесты будут выполняться раздельно и между ними нет утечек данных.
Недавно я искал подобное решение для Python, но, к своему удивлению, не нашел. Однако легко использовать то, что предлагают SQLAlchemy и Pytest, для обертывания тестов в отдельные транзакции базы данных. Позвольте мне показать вам аккуратный подход к проблеме, который, я надеюсь, вам будет удобно использовать.
Настройка подключения к БД
Прежде чем мы сможем использовать базу данных с транзакциями в наших тестах, нам нужно настроить отдельный экземпляр БД исключительно для тестов. Затем из нашего набора тестов нам нужно подключиться к БД. Вот пример того, как установить соединение с базой данных MySQL:
Если вы используете другое ядро базы данных, обратитесь к документации SQLAlchemy для получения информации о том, как создавать разные строки подключения.
Создание таблицы и заполнение БД
Теперь нам нужно воссоздать структуру нашей базы данных. Предположим, что все модели в вашем приложении объявлены в файле models.py.
SQLAlchemy предлагает методы для простого создания и удаления таблиц, объявленных в схеме: create_all и drop_all. Мы будем использовать их в начале выполнения набора тестов, чтобы убедиться, что все таблицы на месте. После полного тестового прогона мы отбросим все таблицы, чтобы следующее выполнение могло начаться с чистого листа.
Если вам нужно, чтобы база данных была предварительно сконфигурирована с некоторыми данными, вы можете запустить метод заполнения базы данных. Вот простой пример:
Обертывание тестов в транзакциях
В качестве последнего шага нам нужно определить способ использования транзакций в нашем наборе тестов. Следовательно, мы создадим приспособление, которое будет создавать новую транзакцию для каждого теста.
Затем вы можете внедрить прибор в свои тестовые примеры. В конце каждого выполнения теста все созданные данные будут уничтожены, что обеспечит разделение тестовых случаев.
Резюме
Настройка рабочих транзакций с Pytest и SQLAlchemy не займет много времени, если вы знаете, как это делать. Я надеюсь, что вы найдете это решение удобным и простым в использовании. Конечно, если у вас есть идеи, которыми вы можете поделиться или предложить улучшения, дайте мне знать в комментариях - я всегда рад узнать что-то новое.
Для дальнейшего использования ниже представлен полный код, который вы можете повторно использовать в своих проектах.
Удачи и получайте удовольствие от написания тестов с транзакциями!