8퍼센트 Test case 작성 가이드

8퍼센트에서 Python Django 코드에 대한 Test case 작성시 사용하는 가이드를 공유해보려고 합니다.

클래스명

함수명

테스트 함수명의 경우 test_ 로만 시작하면 동작하는데 문제가 없고 테스트 코드에까지 주석을 다는 것은 번거로우므로 함수명의 test_ 뒷부분을 한글로 하여 설명을 대신하도록 합니다.

class IUPaginationMethodTestCase(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.request = Mock()
        cls.request.GET = {'page': 1, 'items_per_page': 1}
        cls.pagination = IUPagination(cls.request)
 
    def test_page_url_기본(self):
        expected = '?{}=1'.format(self.pagination.page_key)
        self.assertEqual(self.pagination.page_url(), expected)
 
    def test_page_url_쿼리스트링_없는경우_물음표_붙인다(self):
        expected = '/?{}=1'.format(self.pagination.page_key)
        self.pagination.url_prefix = '/'
        self.assertEqual(self.pagination.page_url(), expected)
 
    def test_page_url_쿼리스트링_있는경우_엠퍼센드로_붙인다(self):
        expected = '{}&{}=1'.format(
            self.pagination.url_prefix, self.pagination.page_key
        ))

        self.pagination.url_prefix = '?utm=source'
        self.assertEqual(self.pagination.page_url(), expected)

factory_boy

fixture 를 대신해서 가급적 factory_boy 를 사용합니다.

signals 끄기

참고 링크

setUpTestData vs setUp

method mock

메소드를 mock 하는 경우 unittest.mock.patch() 를 사용합니다.

decorator

보통 테스트 메소드에 대한 decorator 로 사용합니다.

직접 호출

timezone

freezegun

맺음말

Python Django 개발시 Test case 작성을 잘 하기 위한 8퍼센트 개발팀의 가이드를 공유해 보았습니다. Python Django 개발자들이 Test case 작성을 효율적으로 잘 해서 서비스의 안정성을 높이는데 도움이 되기를 기대해 봅니다.