Как использовать SQLite:память:база данных в webpy для unittesting

StackOverflow https://stackoverflow.com/questions/1252422

Вопрос

Я хочу использовать 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 таким образом, чтобы использовался только один процесс операционной системы.Если запрос отправляется через несколько процессов, каждый из них все равно получит свою собственную базу данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top