Disable migrations when running unit tests in Django 1.7

后端 未结 7 1135
一向
一向 2020-11-30 19:57

Django 1.7 introduced database migrations.

When running the unit tests in Django 1.7, it forces a migrate, that takes a long time. So I woul

相关标签:
7条回答
  • 2020-11-30 20:36

    Update: Never mind, this change was reverted before 1.10 final was released. Hopefully it will return in a future version.


    Note that as of Django 1.10 this can be controlled by a test database setting.

    MIGRATE

    Default: True

    If set to False, Django won’t use migrations to create the test database.

    0 讨论(0)
  • 2020-11-30 20:38

    Look at this workaround, posted by Bernie Sumption to the Django developers mailing list:

    If makemigrations has not yet been run, the "migrate" command treats an app as unmigrated, and creates tables directly from the models just like syncdb did in 1.6. I defined a new settings module just for unit tests called "settings_test.py", which imports * from the main settings module and adds this line:

    MIGRATION_MODULES = {"myapp": "myapp.migrations_not_used_in_tests"}

    Then I run tests like this:

    DJANGO_SETTINGS_MODULE="myapp.settings_test" python manage.py test

    This fools migrate into thinking that the app is unmigrated, and so every time a test database is created it reflects the current structure of models.py.

    In Django 1.9, this situation is improved somewhat, and you can set the value to None:

    MIGRATION_MODULES = {"myapp": None}

    0 讨论(0)
  • 2020-11-30 20:42

    For django 1.9 and up the answer of Guillaume Vincent does not work anymore, so here's a new solution:

    I'm using this snippet in my settings file, after the definition of the INSTALLED_APPS

    if os.environ.get('TESTS_WITHOUT_MIGRATIONS', False):
        MIGRATION_MODULES = {
            app.split('.')[-1]: None for app in INSTALLED_APPS
        }
    

    It iterates over all installed apps and marks each as having no migration module. See the django docs for more information.

    Using this snippet you can run your tests, setting the environment variable TESTS_WITHOUT_MIGRATIONS, e.g.:

    TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test
    
    0 讨论(0)
  • 2020-11-30 20:43

    Here is the end of my settings file :

    class DisableMigrations(object):
    
        def __contains__(self, item):
            return True
    
        def __getitem__(self, item):
            return None
    
    
    TESTS_IN_PROGRESS = False
    if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
        logging.disable(logging.CRITICAL)
        PASSWORD_HASHERS = (
            'django.contrib.auth.hashers.MD5PasswordHasher',
        )
        DEBUG = False
        TEMPLATE_DEBUG = False
        TESTS_IN_PROGRESS = True
        MIGRATION_MODULES = DisableMigrations()
    

    based on this snippet

    I disabled migrations only when tests are running

    0 讨论(0)
  • 2020-11-30 20:51

    django-test-without-migrations adds a --nomigrations flag to manage.py test. Works like a charm.

    0 讨论(0)
  • 2020-11-30 20:54

    https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b

    MIGRATION_MODULES = {
        app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
        for app in INSTALLED_APPS
    }
    
    0 讨论(0)
提交回复
热议问题