Юнит тест Django без создания тестовой базы данных при каждом запуске - PullRequest
19 голосов
/ 26 августа 2011

Похоже, что "manage.py test" создает тестовую базу данных каждый раз, когда я запускаю тест.Есть ли способ предотвратить создание тестовой базы данных каждый раз, когда я запускаю тест, а просто обрезать данные (сбрасывать)?

Мои таблицы - это почти 40 таблиц (даже для одного приложения, а не для всего проекта), и это заставляет меняболен каждый раз, когда я запускаю тест.

Ответы [ 7 ]

27 голосов
/ 20 января 2016

Начиная с Django 1.8, вы можете использовать флаг --keepdb при вызове manage.py

Новое в Django 1.8: вы можете предотвратить разрушение тестовых баз данных, добавив - флаг keepdb к тестовой команде.Это сохранит тестовую базу данных между запусками.Если база данных не существует, она сначала будет создана.Любые миграции также будут применяться для того, чтобы поддерживать его в актуальном состоянии.(https://docs.djangoproject.com/en/1.8/topics/testing/overview/#the-test-database)

Таким образом, ваш вызов может выглядеть следующим образом:

python manage.py test --keepdb

Или, используя сокращение -k, он может выглядеть так:

python manage.py test -k
9 голосов
/ 26 августа 2011

В зависимости от ваших потребностей у вас есть несколько вариантов:

1 голос
/ 14 июля 2014

Следующее решение также сократит время создания БД, если будет больше миграций на юг. Во время модульного тестирования запуск syncdb вместо запуска всех южных миграций будет намного быстрее.

SOUTH_TESTS_MIGRATE = False # Чтобы отключить миграции и использовать syncdb вместо

1 голос
/ 27 мая 2014

django-nose поддерживает повторное использование базы данных:

https://github.com/django-nose/django-nose#enabling-database-reuse

Тем не менее, обязательно прочитайте комментарии:

Одна новая складка заключается в том, чтовсякий раз, когда меняется ваша схема БД, вы должны оставить флаг выключенным при следующем запуске тестов.Это заставит тестирующего выполнить повторную инициализацию тестовой базы данных.

Кроме того, REUSE_DB не совместим с TransactionTestCases, которые оставляют нежелательную информацию в БД, поэтому обязательно сделайте ваш TransactionTestCases гигиеническим (см. Ниже), если вы хотите использоватьэто.

0 голосов
/ 10 января 2019

Возможно, вы можете попробовать с тестовым бегуном

Пример:

Сначала создайте test_runners.py

from django.test.runner import DiscoverRunner


class NoDbTestRunner(DiscoverRunner):

    def setup_databases(self, **kwargs):
        """ Override the database creation defined in parent class """
        pass

    def teardown_databases(self, old_config, **kwargs):
        """ Override the database teardown defined in parent class """
        pass

Затем объявите вышеуказанного бегуна вsettings.py

TEST_RUNNER = 'api.tests.test_runners.NoDbTestRunner'
0 голосов
/ 13 декабря 2017

Возможно, вы захотите иметь pytest в качестве тестового бегуна.Ниже приведен пример конфигурации.

Образец pytest.ini файл:

[pytest]
norecursedirs=
    *.egg
    .git
    .tox
    .env
    _sass
    build
    dist
    migrations
    fabfile
    .tox
python_files =
    test_*.py
    tests.py
DJANGO_SETTINGS_MODULE=settings.dev
addopts=
   --reuse-db
   --nomigrations
   --cov=your_app
   --ignore=.tox
   --ignore=fabfile
   --ignore=scripts
   --ignore=settings
   --ignore=tmp
   --cov-report=html
   --cov-report=term
   --cov-report=annotate

Образец runtests.py Файл:

#!/usr/bin/env python
import os
import sys

import pytest


def main():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.dev")
    return pytest.main()


if __name__ == '__main__':
    sys.exit(main())

Образец requirements.txt Файл:

pytest==3.0.2
pytest-django==2.9.1
pytest-cov==2.2.1

Запустите тесты:

./runtests.py

Обратите внимание, что эффект достигается с помощью директив reuse-db и nomigrations.

0 голосов
/ 04 февраля 2015

Полагаю, это не лучшая практика, но в качестве обходного пути я создал несколько разных тестовых программ в каталоге управления / командами приложения.

https://docs.djangoproject.com/en/1.7/howto/custom-management-commands/

Например, сейчас я работаю над приложением, для которого требуются некоторые расширенные функциональные возможности Postgres (я не могу использовать Sqlite), поэтому вместо создания тестовых функций как части tests.py я создал test_process.py в myapp / management /команды /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...