시간 의존적인 테스트 코드 작성 시 freezegun 활용

찾아보거나 알게된 배경


이전에 사용해본 적이 있고, 마케팅 수신 동의 메일 발송 시에 유저를 뽑을 때 시간에 의존적인 테스트 코드를 짜야하는데, freezegun을 사용하여, 항상 동일한 테스트 결과를 낼 수 있다. (이번에 풀리퀘스트에 올라갈 예정)

요약


아래 예시 참조!

@freeze_time('2020-03-18')
@mock.patch('user.cron.EmailClient.send_email', MockEmailClient.send_email)
@mock.patch('user.cron.EmailClient.send_email_with_retry', MockEmailClient.send_email_with_retry)
def test_simple(self):
    result_dict = marketing_terms_agreement_send_email()
    self.assertGreaterEqual(int(result_dict['success_count']), 1)
    self.assertEqual(FirstTable.objects.get(user=self.user).send_status, 1)
    self.assertEqual(SecondTable.objects.get(user=self.user).modified_at, timezone.now())

참고자료


https://pypi.org/project/freezegun/

https://8percent.github.io/2017-05-31/test-guide/