Мои модульные тесты Django выполняются долго, поэтому я ищу способы ускорить это. Я подумываю об установке SSD , но знаю, что у него есть и недостатки. Конечно, со своим кодом я могу кое-что сделать, но я ищу структурное исправление. Даже запуск одного теста выполняется медленно, поскольку базу данных необходимо каждый раз перестраивать / переносить на юг. Итак, вот моя идея ...
Поскольку я знаю, что тестовая база данных всегда будет довольно маленькой, почему я не могу просто настроить систему, чтобы всегда хранить всю тестовую базу данных в ОЗУ? Ни в коем случае не трогайте диск. Как мне настроить это в Django? Я бы предпочел продолжать использовать MySQL, поскольку это то, что я использую в производстве, но если SQLite 3 или что-то еще упрощает это, я бы пошел по этому пути.
Есть ли у SQLite или MySQL возможность работать полностью в памяти? Должна быть возможность настроить RAM-диск, а затем настроить тестовую базу данных для хранения своих данных там, но я не уверен, как указать Django / MySQL использовать другой каталог данных для определенной базы данных, тем более, что он продолжает стираться и воссоздавал каждый прогон. (Я использую Mac FWIW.)
источник
"test" in sys.argv
; он может срабатывать, когда вы этого не хотите, напримерmanage.py collectstatic -i test
.sys.argv[1] == "test"
это более точное условие, которое не должно иметь такой проблемы.Я обычно создаю отдельный файл настроек для тестов и использую его в тестовой команде, например
У этого есть два преимущества:
Вам не нужно проверять какое-
test
либо волшебное слово в sys.argv,test_settings.py
можно простоИли вы можете дополнительно настроить его под свои нужды, четко отделив тестовые настройки от производственных.
Еще одно преимущество заключается в том, что вы можете запускать тест с движком производственной базы данных вместо sqlite3, избегая тонких ошибок, поэтому при разработке используйте
и перед фиксацией кода запустить один раз
просто чтобы убедиться, что все тесты действительно проходят.
источник
MySQL поддерживает механизм хранения под названием «MEMORY», который вы можете настроить в своей базе данных config (
settings.py
) как таковой:Обратите внимание, что механизм хранения MEMORY не поддерживает столбцы blob / text, поэтому, если вы используете его,
django.db.models.TextField
это не сработает для вас.источник
Я не могу ответить на ваш главный вопрос, но есть несколько вещей, которые вы можете сделать, чтобы ускорить процесс.
Во-первых, убедитесь, что ваша база данных MySQL настроена для использования InnoDB. Затем он может использовать транзакции для отката состояния базы данных перед каждым тестом, что, по моему опыту, привело к значительному ускорению. Вы можете передать команду инициализации базы данных в файле settings.py (синтаксис Django 1.2):
Во-вторых, вам не нужно каждый раз запускать миграции на юг. Задайте его
SOUTH_TESTS_MIGRATE = False
в файле settings.py, и база данных будет создана с помощью обычного syncdb, что будет намного быстрее, чем выполнение всех предыдущих миграций.источник
369 tests in 498.704s
до369 tests in 41.334s
. Это более чем в 10 раз быстрее!--keep
для сохранения базы данных и не требовать повторного применения полного набора миграций при каждом тестовом запуске. Новые миграции по-прежнему будут выполняться. Если вы часто переключаетесь между ветвями, легко попасть в несогласованное состояние (вы можете отменить новые миграции перед переключением, изменив базу данных на тестовую и запустив ееmigrate
, но это немного неудобно).Вы можете сделать двойную настройку:
Я использую обе уловки и вполне доволен.
Как настроить его для MySQL в Ubuntu:
Осторожно, это просто для тестирования, после перезагрузки ваша база данных из памяти теряется!
источник
Другой подход: другой экземпляр MySQL работает в tempfs, который использует RAM Disk. Инструкции в этом сообщении в блоге: Ускорение MySQL для тестирования в Django .
Преимущества:
источник
Расширяя ответ Anurag, я упростил процесс, создав те же настройки test_settings и добавив следующее в manage.py
кажется более чистым, поскольку sys уже импортирован, а manage.py используется только через командную строку, поэтому не нужно загромождать настройки
источник
"test" in sys.argv
; он может срабатывать, когда вы этого не хотите, напримерmanage.py collectstatic -i test
.sys.argv[1] == "test"
это более точное условие, которое не должно иметь такой проблемы../manage.py
без аргументов (например, чтобы увидеть, какие плагины доступны, как и--help
)len(sys.argv) > 1 and sys.argv[1] == "test"
Используйте ниже в своем
setting.py
источник