IT/작업기록

[Django] pytest "app_label" 에러 — 그리고 이게 배포엔 왜 상관없는지

aram 2026. 4. 22. 11:28

에러 상황

테스트를 돌렸는데 7개가 전부 이런 식으로 실패했다.

apps/quotations/tests/test_auto_cancel.py::TestNoCxlState::test_exits_with_error_when_cxll_missing
- RuntimeError: Model class apps.orders.models.OrderCode doesn't declare an explicit
  app_label and isn't in an application in INSTALLED_APPS.

TestNoCxlState, TestNoTargets, TestPenOCancellation, TestResICancellation, TestDryRun 등 모델을 참조하는 테스트가 전부 같은 에러로 죽었다. 메시지만 보면 모델에 app_label을 안 붙여서 나는 에러처럼 보이지만, 실제 원인은 모델 코드가 아니라 경로 문제였다.

pytest가 프로젝트를 인식하는 기준 경로(rootdir)나 DJANGO_SETTINGS_MODULE이 실제 프로젝트 구조와 어긋나 있으면, Django가 앱을 제대로 로드하지 못해서 이런 식의 에러가 난다. 모델 자체는 멀쩡한데 "이 모델이 어느 앱 소속인지 모르겠다"고 하는 것.

pytest.ini를 .development로 설정해도 운영 배포에 영향 없는 이유

에러를 잡으면서 궁금해진 부분: pytest.ini에 개발용 settings(config.settings.development)를 지정해뒀는데, 이게 운영 서버에 실수로 반영되면 어떡하지?

결론부터 말하면 영향 없다.

  • pytest.ini는 pytest 전용 설정 파일이다. Django 운영 서버(gunicorn 등)는 이 파일을 아예 읽지 않는다
  • 운영 서버의 DJANGO_SETTINGS_MODULE은 docker-compose.yml 또는 .env의 OS 환경변수에서 별도로 설정되며, 이 값이 pytest.ini보다 우선한다
  • 운영 작업 공간에 pytest.ini가 그대로 배포되더라도, pytest를 직접 실행하지 않는 한 아무 영향이 없다

즉, pytest.ini의 DJANGO_SETTINGS_MODULE은 테스트를 실행할 때만 쓰이는 값이다. pytest는 개발 서버에서 테스트할 때만 사용하는 도구라서, 배포 자체와는 완전히 분리된 관심사였던 것.