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.
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}
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()
Deshabilito las migraciones solo cuando se están ejecutando pruebas
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.
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.
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
}
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
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
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