AI Briefing

8퍼센트의 Python Django 테스트 케이스 작성 가이드

·2017.05.31 00:00

핵심 내용

8퍼센트가 Python Django 테스트에서 class명, 함수명, factory, timezone, freezegun 기준을 정리했다.

자세히 보기

8퍼센트는 Python Django 코드의 Test case를 작성할 때 따르는 내부 가이드를 정리했다. 테스트의 가독성과 실행 속도를 함께 높이기 위한 실무 규칙이 중심이다.

클래스명은 일반적으로 TestCase를 상속하면 이름 끝에 TestCase를 붙인다. 테스트 함수명은 test_로 시작하면 동작하므로, 주석 대신 test_ 뒤를 한글 설명으로 작성해 의도를 드러낸다.

  • 예: test_page_url_기본
  • 예: test_page_url_쿼리스트링_없는경우_물음표_붙인다
  • 예: test_page_url_쿼리스트링_있는경우_엠퍼센드로_붙인다

fixture 대신에는 가급적 factory_boy를 사용한다. 모델 생성 시 signal이 같이 실행되지만, signal 자체를 테스트하는 경우가 아니라면 factory.django.mute_signals로 꺼두는 편이 낫다.

테스트 데이터는 setUpTestData와 setUp를 구분해 쓴다. 읽기 전용으로만 쓰는 객체는 setUpTestData에서 한 번만 생성해 속도를 높이고, 매 테스트마다 생성이 필요한 경우에만 setUp을 사용한다. 가능하면 setUp에서 불필요하게 매번 객체를 만들지 않는 것이 효율적이다.

메서드 mock이 필요하면 unittest.mock.patch()를 사용한다. 개별 테스트에는 decorator를 쓰고, 여러 테스트에서 공통으로 mock해야 하면 start()와 stopall()을 활용한다.

  • setUp에서 mock.patch(...).start()로 시작
  • tearDown에서 mock.patch.stopall()로 정리

시간 처리에서는 timezone과 freezegun을 강조한다. datetime.now()나 strptime()으로 만든 naive datetime을 Django DateTimeField에 넣어야 한다면 django.utils.timezone.make_aware()로 aware datetime으로 바꿔야 한다. 특정 시점 검사가 필요하면 freezegun으로 시간을 고정하고, decorator나 context manager로 범위를 좁혀 적용하는 것이 좋다.

특정 테스트 케이스 전체에 시간을 고정하려면 start()와 stop()을 쓸 수 있지만, 다른 테스트에 영향이 가지 않도록 반드시 stop()으로 해제해야 한다. 전반적으로 이 가이드는 Django 테스트를 명확하게 쓰고, 빠르게 돌리고, 시간 의존성을 안전하게 다루는 방법을 정리한다.

이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.

AI 처리 방식을 확인하거나, 요약 오류와 출처 표기 문제, 삭제 요청을 문의 · 건의로 알려주세요.