[django] 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

로 설정하면 FalseDjango는 마이그레이션을 사용하여 테스트 데이터베이스를 생성하지 않습니다.


답변

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
    }

설치된 모든 앱을 반복하고 각각 마이그레이션 모듈이없는 것으로 표시합니다. 자세한 내용은 django 문서를 참조하십시오 .

이 스 니펫을 사용하여 테스트를 실행하고 환경 변수를 설정할 수 있습니다 TESTS_WITHOUT_MIGRATIONS. 예 :

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test


답변

나는 django 1.10 이후 마이그레이션을 비활성화하는 방법을 알아 냈습니다. 누군가에게 도움이 될 수 있습니다. 다음은 git의 링크입니다 .

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

    def __getitem__(self, item):
        return None

DATABASES = DisableMigrations()

MIGRATION_MODULES = DisableMigrations()

django 1.10 마이그레이션은 두 부분으로 구성됩니다. load_diskrecorder를 참조하십시오.

load_disk추가 된 앱의 마이그레이션 을 위한 INSTALL_APP
부분과 recorder데이터베이스 연결 을 위한 부분 1.9 이전 버전의 MIGRATION_MODULES={'do.not.migrate':'notmigrations'}경우 테스트를 실행할 때 설정해야합니다. 이제 설정해야합니다. None like MIGRATION_MODULES={'do.not.migrate':None}
그래서 우리가 어떤 앱에 대한 마이그레이션을 원하지 않는 경우 그냥 딕셔너리를 확장하고 반환 None을위한 getitem에서 동일한 기능, 그리고 어떻게 DATABASES당신이해야 할 옳은 일입니다,

추신 : 명령의 경우, 당신은 지정해야합니다 --setting=module.path.settings_test_snippettest
PPS 당신이 작업하는 경우 pycharm, 하지 않는 설정 --settings 에서 옵션 Run/Debug configurations, 단지의 경로를 추가 settings_test_snippet.py사용자 설정에서. 괜찮아요 !!

즐겨