Django 1.7에서 단위 테스트를 실행할 때 마이그레이션 비활성화
Django 1.7 은 데이터베이스 마이그레이션을 도입했습니다 .
Django 1.7에서 단위 테스트를 실행할 때 시간이 오래 걸리는 migrate를 강제 실행합니다 . 그래서 장고 마이그레이션을 건너 뛰고 최종 상태에서 데이터베이스를 만들고 싶습니다.
마이그레이션을 무시하는 것은 코드의 해당 부분이 테스트되지 않기 때문에 나쁜 습관이 될 수 있다는 것을 알고 있습니다. 그러나 그것은 사실이 아닙니다. 저는 CI 테스트 서버 (jenkins)에서 전체 마이그레이션을 실행하고 있습니다. 속도가 중요한 로컬 테스트에서만 마이그레이션을 건너 뛰고 싶습니다.
일부 컨텍스트 :
Django 1.6 까지 South를 사용할 때 SOUTH_TESTS_MIGRATE 설정을 사용했습니다 .
기본적으로 South의 syncdb 명령은 테스트를 실행할 때를 포함하여 비대화 형 모드에서 실행되는 경우 마이그레이션도 적용합니다. 테스트를 실행할 때마다 모든 마이그레이션이 실행됩니다.
테스트 실행기가 마이그레이션 대신 syncdb를 사용하도록하려면 (예 : 마이그레이션을 적용하는 데 너무 오래 걸리는 경우) settings.py에서 SOUTH_TESTS_MIGRATE = False를 설정하면됩니다.
그러나 syncdb 는 더 이상 존재하지 않으며 이제 migrate 입니다.
그리고 Django 1.8 에서는 --keepdb 매개 변수를 사용합니다 .
--keepdb 옵션을 사용하여 테스트 실행 사이에 테스트 데이터베이스를 보존 할 수 있습니다. 이는 생성 및 삭제 작업을 모두 건너 뛰는 이점이있어 테스트 실행 시간을 크게 줄여줍니다. 특히 대규모 테스트 스위트의 작업은 더욱 그렇습니다. 테스트 데이터베이스가 존재하지 않는 경우 첫 번째 실행시 생성 된 후 이후 실행될 때마다 보존됩니다. 적용되지 않은 마이그레이션은 테스트 스위트를 실행하기 전에 테스트 데이터베이스에도 적용됩니다.
따라서이 질문은 Django 1.7로 제한됩니다.
Bernie Sumption이 Django 개발자 메일 링리스트에 게시 한이 해결 방법을 살펴보십시오 .
makemigrations가 아직 실행되지 않은 경우 "migrate"명령은 앱을 마이그레이션되지 않은 것으로 처리하고 1.6에서 syncdb가 수행 한 것처럼 모델에서 직접 테이블을 만듭니다. 기본 설정 모듈에서 *를 가져와 다음 줄을 추가하는 "settings_test.py"라는 단위 테스트를위한 새 설정 모듈을 정의했습니다.
MIGRATION_MODULES = { "myapp": "myapp.migrations_not_used_in_tests"}
그런 다음 다음과 같은 테스트를 실행합니다.
DJANGO_SETTINGS_MODULE = "myapp.settings_test"python manage.py 테스트
이 바보는 앱이 마이그레이션되지 않았다고 생각하게되므로 테스트 데이터베이스가 생성 될 때마다 models.py의 현재 구조를 반영합니다.
Django 1.9에서는이 상황 이 다소 개선 되었으며 값을 None
다음 과 같이 설정할 수 있습니다 .
MIGRATION_MODULES = { "myapp": 없음}
내 설정 파일의 끝은 다음과 같습니다.
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()
이 스 니펫을 기반으로
테스트가 실행 중일 때만 마이그레이션을 비활성화했습니다.
장고 - 시험없이-마이그레이션 추가 --nomigrations
에 플래그를 manage.py test
. 매력처럼 작동합니다.
업데이트 : 신경 쓰지 마세요.이 변경 사항은 1.10 최종 버전이 출시되기 전에 되돌려졌습니다 . 바라건대 향후 버전에서 돌아올 것입니다.
Django 1.10부터는 테스트 데이터베이스 설정으로 제어 할 수 있습니다.
마이그레이션
기본:
True
로 설정하면
False
Django는 마이그레이션을 사용하여 테스트 데이터베이스를 생성하지 않습니다.
https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b
MIGRATION_MODULES = {
app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
for app in INSTALLED_APPS
}
django 1.9 이상에서는 Guillaume Vincent의 답변이 더 이상 작동하지 않으므로 여기에 새로운 솔루션이 있습니다.
내 설정 파일에서이 스 니펫을 사용하고 있습니다. 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
I just figure out how to disable migrations after django 1.10,may be it could help for somebody. Here is link at git
class DisableMigrations(dict):
def __contains__(self, item):
return True
def __getitem__(self, item):
return None
DATABASES = DisableMigrations()
MIGRATION_MODULES = DisableMigrations()
Migrations for django 1.10 has two part,please look at load_disk and recorder
The part of load_disk
for migrations model of app that be added at INSTALL_APP
And the part of recorder
for database connection For the version before 1.9 we need set MIGRATION_MODULES={'do.not.migrate':'notmigrations'}
when you are running test Now we need set it None like MIGRATION_MODULES={'do.not.migrate':None}
So if we do not want make migrations for any app, just extend a dict and return None
for getitem
function , and do the same at DATABASES
, that is the right thing you need to do
PS: For command, you need to specify --setting=module.path.settings_test_snippet
after test
PPS If you are working with pycharm
,do not set --settings
options at Run/Debug configurations
, just add path of settings_test_snippet.py
at Custom setting. That just be fine!!
enjoy
'programing tip' 카테고리의 다른 글
리베이스를 수행 한 후 Git 커밋이 동일한 분기에 복제됩니다. (0) | 2020.08.12 |
---|---|
구성 파서와 종속성 파서의 차이점 (0) | 2020.08.12 |
언제 분기해야합니까? (0) | 2020.08.12 |
Visual Studio에서 디버그와 릴리스의 차이점은 무엇입니까? (0) | 2020.08.12 |
Elasticsearch 대 Cassandra 대 Cassandra를 사용한 Elasticsearch (0) | 2020.08.12 |