Deshabilitar migraciones al ejecutar pruebas unitarias en Django 1.7


Django 1.7 introducido migraciones de base de datos.

Cuando se ejecutan las pruebas unitarias en Django 1.7, se fuerza un migrar, que lleva mucho tiempo. Así que me gustaría saltarme las migraciones de django, y crear la base de datos en el estado final.

Sé que ignorar las migraciones puede ser una mala práctica, ya que esa parte del código no se probaría. Pero ese no es el caso: estoy ejecutando las migraciones completas en el servidor de pruebas CI (jenkins). Sólo quiero saltarme las migraciones en mis pruebas locales, donde la velocidad importa.


Algún contexto:

Hasta Django 1.6, al usar el Sur, usé el SOUTH_TESTS_MIGRATE ajuste:

De forma predeterminada, el comando syncdb de South también aplicará migraciones si se ejecuta en modo no interactivo, que incluye cuando está ejecutando pruebas: ejecutará cada migración cada vez que ejecute sus pruebas.

Si desea que el ejecutor de pruebas use syncdb en lugar de migrar-por ejemplo, si sus migraciones están tardando demasiado en aplicarse - simplemente establezca SOUTH_TESTS_MIGRATE = False en settings.py.

Sin Embargo, syncdb no existe más, ahora es migrar.

Y de Django 1.8 Usaré el --keepdb parámetro:

La opción ke keepdb se puede usar para preservar la base de datos de prueba entre ejecuciones de prueba. Esto tiene la ventaja de saltarse las acciones crear y destruir lo que disminuye en gran medida el tiempo para ejecutar pruebas, especialmente aquellas en un conjunto de pruebas grande. Si la base de datos de prueba no existe, se creará en la primera ejecución y luego se conservará para cada ejecución posterior. Cualquier migración no aplicada también se aplicará a la base de datos de prueba antes de ejecutar el conjunto de pruebas.

Así que esta pregunta está limitada a Django 1.7.

Author: David Arcos, 2014-08-06

7 answers

Mira esta solución , publicada por Bernie Sumption en la lista de correo de desarrolladores de Django:

Si makemigrations aún no se ha ejecutado, el comando" migrate " trata una aplicación como no migrada, y crea tablas directamente desde los modelos como lo hizo syncdb en 1.6. Definí un nuevo módulo de configuración solo para la unidad pruebas llamadas "settings_test.py", que importa * de los principales módulo de configuración y añade esta línea:

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

Luego corro pruebas como esta:

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

Estos tontos migran a pensar que la aplicación no es migrada, y así cada vez que se crea una base de datos de prueba, estructura de models.py.

En Django 1.9, esta situación se ha mejorado un poco, y puede establecer el valor en None:

MIGRATION_MODULES = {"myapp": None}

 73
Author: albertgasset,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-15 00:25:32

Aquí está el final de mi archivo de configuración:

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()

Basado en este fragmento

Deshabilito las migraciones solo cuando se están ejecutando pruebas

 66
Author: Guillaume Vincent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 07:27:12

Django-test-without-migrations añade un indicador --nomigrations a manage.py test. Funciona como un encanto.

 25
Author: rlmv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-11 17:32:37

Actualización : No importa, este cambio fue revertido antes de que se lanzara la versión 1.10 final. Esperemos que vuelva en una versión futura.


Tenga en cuenta que a partir de Django 1.10 esto puede ser controlado por una configuración de base de datos de prueba.

MIGRAR

Por defecto: True

Si se establece en False, Django no usará migraciones para crear la base de datos de prueba.

 3
Author: Kevin Christopher Henry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-10 08:33:57

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

MIGRATION_MODULES = {
    app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
    for app in INSTALLED_APPS
}
 2
Author: apollov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-05 15:41:42

Para django 1.9 y arriba la respuesta de Guillaume Vincent ya no funciona, así que aquí hay una nueva solución:

Estoy usando este fragmento en mi archivo de configuración, después de la definición del INSTALLED_APPS

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

Itera sobre todas las aplicaciones instaladas y marca cada una como sin módulo de migración. Vea los documentos de django para más información.

Usando este fragmento puede ejecutar sus pruebas, estableciendo la variable de entorno TESTS_WITHOUT_MIGRATIONS, por ejemplo:

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test
 1
Author: devsnd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-04 09:24:42

Acabo de averiguar cómo desactivar las migraciones después de django 1.10,puede ser que podría ayudar a alguien. Aquí está link en git

class DisableMigrations(dict):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None

DATABASES = DisableMigrations()

MIGRATION_MODULES = DisableMigrations()

Las migraciones para django 1.10 tienen dos partes, por favor mira load_disk y recorder

La parte de load_disk para el modelo de migraciones de app que se añade en INSTALL_APP Y la parte de recorder para la conexión a la base de datos Para la versión anterior a la 1.9 necesitamos set MIGRATION_MODULES={'do.not.migrate':'notmigrations'} cuando se está ejecutando test Ahora necesitamos establecer ninguno como MIGRATION_MODULES={'do.not.migrate':None} Tan si no queremos hacer migraciones para ninguna aplicación, simplemente extienda un dict y devuelva None para la función getitem, y haga lo mismo en DATABASES, eso es lo correcto que debe hacer

PS: Para el comando, debe especificar --setting=module.path.settings_test_snippet después de test PPS Si está trabajando con pycharm ,no establezca las opciones --settings en Run/Debug configurations, simplemente agregue la ruta de settings_test_snippet.py en la configuración personalizada. ¡Eso está bien!!

Disfrute

 0
Author: FavorMylikes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 20:13:41