Некоторое время я работал над приложением Flask, используя SQLAlchemy для доступа к базе данных MySQL. Я наконец начал писать тесты для этого (я твердо верю в тестирование, но я новичок в Flask, SQLA и Python в этом отношении, поэтому отложил это), и у меня возникла проблема с настройкой моей структуры.
Моя производственная база данных не использует какие-либо необычные функции MySQL, и на других языках / фреймворках я смог настроить тестовую среду, используя базу данных SQLite в памяти. (Например, у меня есть приложение Perl, использующее DBIx::Class для запуска базы данных SQL Server, но с набором тестов, построенным на SQLite.) Однако с SQLAlchemy мне нужно было объявить несколько конкретных вещей MySQL в моей модели, и я не знаю, как это обойти. В частности, я использую типы TINYINT и CHAR для нескольких столбцов, и мне кажется, что мне нужно импортировать их из sqlalchemy.dialects.mysql, поскольку это не общие типы в SQLA. Таким образом, у меня будет объявление класса, например:
class Item(db.Model):
...
size = db.Column(TINYINT, db.ForeignKey('size.size_id'), nullable=False)
Итак, даже если бы я использовал необработанный SQL, я мог бы использовать TINYINT с SQLite или MySQL, и он работал бы нормально, здесь он исходит из класса диалекта mysql.
Я не хочу переопределять весь свой класс модели, чтобы охватить такие, казалось бы, тривиальные вещи, как это. Есть ли другое решение? Я читал все, что мог, об использовании разных баз данных для тестирования и производства, но об этой проблеме не упоминалось. Было бы намного проще использовать базу данных SQLite в памяти для тестирования, вместо того, чтобы иметь доступную для всего тестовую базу данных MySQL.
Ваша придирка была совершенно правильной: я написал «модульные тесты», но на самом деле я пишу как модульные, так и интеграционные тесты. Я отредактировал свой пост, чтобы полностью удалить "юнит". Спасибо за предложения, которые, похоже, помогут решить эту проблему.






Рискуя показаться действительно придирчивым, вам не нужна БД для модульного тестирования. Это другая история для интеграционных тестов и выше, в которых вы, вероятно, должны использовать целевую БД. Но: ваша конкретная проблема с набором текста может быть решена с помощью варианта: docs.sqlalchemy.org/en/latest/core/…. Для более сложных случаев вам, возможно, придется написать свой собственный
TypeDecorator, например бэкэнд-независимый тип GUID.