unit test simpletestcase form django unit-testing django-migrations

test - Inhabilitar migraciones cuando se ejecutan pruebas unitarias en Django 1.7



test post django (7)

Django 1.7 introdujo migraciones de bases de datos .

Al ejecutar las pruebas unitarias en Django 1.7, obliga a migrar , eso lleva mucho tiempo. Así que me gustaría omitir 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 prueba de CI (jenkins). Solo quiero omitir las migraciones en mis pruebas locales, donde la velocidad importa.

Algún contexto:

Hasta Django 1.6 , cuando usaba South, usé la configuración SOUTH_TESTS_MIGRATE :

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

Si desea que el corrector de pruebas use syncdb en lugar de migrar, por ejemplo, si sus migraciones tardan demasiado en aplicarse, simplemente configure SOUTH_TESTS_MIGRATE = False en settings.py.

Sin embargo, syncdb ya no existe, ahora migra .

Y de Django 1.8 --keepdb parámetro --keepdb :

La opción --keepdb se puede usar para conservar la base de datos de prueba entre ejecuciones de prueba. Esto tiene la ventaja de omitir tanto las acciones de crear como las de destruir, lo que disminuye en gran medida el tiempo de ejecución de las pruebas, especialmente las de 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. Las migraciones no aplicadas también se aplicarán a la base de datos de prueba antes de ejecutar el conjunto de pruebas.

Entonces esta pregunta está limitada a Django 1.7.


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 gist.github.com/NotSqrt/5f3c76cd15e40ef62d09

Inhabilité las migraciones solo cuando las pruebas se están ejecutando


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

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

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

Luego ejecuto pruebas como esta:

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

Estos tontos migran y piensan que la aplicación no está migrada, por lo que cada vez que se crea una base de datos de prueba, refleja la estructura actual de models.py.

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

MIGRATION_MODULES = {"myapp": ninguno}


Para django 1.9 y versiones posteriores, 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 de INSTALLED_APPS

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

Se itera sobre todas las aplicaciones instaladas y marca cada una como que no tiene ningún módulo de migración. Vea los documentos de django para más información .

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

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test


Simplemente descubro cómo desactivar las migraciones después de django 1.10, puede ser que pueda ayudar a alguien. Aquí hay un 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, mira load_disk y recorder

La parte del modelo load_disk for migrations de la aplicación que se agrega en INSTALL_APP y la parte de la recorder para la conexión de la base de datos Para la versión anterior a 1.9 necesitamos establecer MIGRATION_MODULES={''do.not.migrate'':''notmigrations''} cuando está ejecutando la prueba Ahora necesitamos configurarlo como MIGRATION_MODULES={''do.not.migrate'':None} Entonces, si no queremos realizar migraciones para cualquier 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 necesitas hacer

PD: para el comando, debe especificar --setting=module.path.settings_test_snippet after test PPS Si está trabajando con pycharm , no configure --settings options en las Run/Debug configurations , solo agregue la ruta de settings_test_snippet.py en Custom ajuste. ¡Eso está bien!

disfrutar




Actualización : No importa, este cambio se reverted antes de que se lanzara 1.10 final. Con suerte, volverá en una versión futura.

Tenga en cuenta que a partir de Django 1.10 esto puede controlarse mediante una configuración de base de datos de prueba.

EMIGRAR

Predeterminado: True

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