Как использовать SQLite:память:база данных в webpy для unittesting
-
12-09-2019 - |
Вопрос
Я хочу использовать SQLite в базе данных memory (":memory:") для тестов в моем веб-приложении.Я использую nosetests для тестов и webpy в качестве фреймворка.
Я хочу заполнить базу данных с помощью функции setup(), а затем запустить все мои тесты.Моя проблема в том, что webpy закрывает все открытые подключения к БД после каждого запроса, а SQLite :memory:DB работает только до тех пор, пока вы не закроете соединение, поэтому на самом деле корректно выполняется только первый тест, а все остальные завершаются неудачей.
Мой выбор - либо запускать тесты в базе данных с дисковой поддержкой, либо воссоздавать всю базу данных в памяти в начале каждого отдельного теста.
Знаете ли вы, как я могу запретить webpy закрывать соединения с БД после каждого запроса?Можете ли вы придумать какой-либо другой способ получить базу данных SQLite в памяти, которая сохраняется для более чем одного запроса с использованием webpy?
Решение
Возможно, вы могли бы запустить тесты в базе данных, хранящейся на диске, но используя Оперативный диск.В Windows вы можете установить драйвер для настройки RAM-диска (некоторые инструкции здесь).В Linux, я полагаю, вы хотите настроить tmpfs - файлы.
Оперативный диск будет действовать точно так же, как жесткий диск, но будет работать полностью из памяти, так что вы потеряете часть накладных расходов, связанных с загрузкой файлов на жесткий диск или с него.
Другие советы
Непроверенный:
class NoCloseDB(web.db.SqliteDB):
def _unload_context(self):
pass # this keeps the _ctx.db attribute alive
web.db.register_database('sqlite',NoCloseDB) # overrides the previous registration
Обратите внимание, что это может сработать, только если вы запустите web.py таким образом, чтобы использовался только один процесс операционной системы.Если запрос отправляется через несколько процессов, каждый из них все равно получит свою собственную базу данных.