Django에서 테스트 실행 중인지 여부 판별하기

간단히 정리하면 아래와 같이 Django 웹 애플리케이션이 서버에서 실행 중인지 아니면 테스트 실행 중인지 알아낼 수 있다.

Detect django testing mode에서 Mark Lavin이 한 말이 정확하다.

This attributed is added by the Django test runner in setup_test_environment and removed in teardown_test_environment. You can check the source here: https://code.djangoproject.com/browser/django/trunk/django/test/utils.py

Django 공식 문서를 보면

Sets up the test environment by calling setup_test_environment() and setting DEBUG to False.

라고 한다. 그러니까 settings.DEBUG의 값을 쓰면 안 된다. 그 대신 어떤 값을 쓰면 될지는 setup_test_environment의 소스 코드에서 힌트를 얻을 수 있다.

def setup_test_environment():
    """Perform any global pre-test setup. This involves:

        - Installing the instrumented test renderer
        - Set the email backend to the locmem email backend.
        - Setting the active locale to match the LANGUAGE_CODE setting.
    """
    Template._original_render = Template._render
    Template._render = instrumented_test_render

    # Storing previous values in the settings module itself is problematic.
    # Store them in arbitrary (but related) modules instead. See #20636.

    mail._original_email_backend = settings.EMAIL_BACKEND
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'

    request._original_allowed_hosts = settings.ALLOWED_HOSTS
    settings.ALLOWED_HOSTS = ['*']

    mail.outbox = []

    deactivate()

처음에는 settingsTEST_MODE 같은 값을 설정해주리라 기대했는데 그런 것 없다. 대신 Django Testing Tools에 나오는 바와 같이 테스트 모드일 때는 mail.outbox가 만들어지니 이걸 이용해 테스트 중인지 여부를 판별하면 된다.

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu