8퍼센트 / Ho Sung Lee / 조회수 : 2446
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)
fixture 를 대신해서 가급적 factory_boy 를 사용합니다.
@mute_signals(signals.post_save)
def test_some_code(self):
some = SomeFactory()
with mute_signals(signals.post_save):
some = SomeFactory()
메소드를 mock 하는 경우 unittest.mock.patch() 를 사용합니다.
보통 테스트 메소드에 대한 decorator 로 사용합니다.
from unittest import mock
class MyTest(TestCase):
def setUp(self):
self.mock_method1 = mock.patch('package.module.method1').start()
self.mock_method1 = mock.patch('package.module.method2').start()
def tearDown(self):
mock.patch.stopall()
def test_something(self):
something()
self.assertTrue(self.mock_method1.called)
from freezegun import freeze_time
import datetime
import unittest
@freeze_time("2012-01-14")
def test():
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
from freezegun import freeze_time
def test():
assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
with freeze_time("2012-01-14"):
assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
assert datetime.datetime.now() != datetime.datetime(2012, 1, 14)
from django.test import TestCase
from freezegun import freeze_time
class SomeTestCase(TestCase):
def setUp(self):
self.freezer = freeze_time("2016-01-05 00:00:00")
self.freezer.start()
def tearDown(self):
self.freezer.stop()
Python Django 개발시 Test case 작성을 잘 하기 위한 8퍼센트 개발팀의 가이드를 공유해 보았습니다. Python Django 개발자들이 Test case 작성을 효율적으로 잘 해서 서비스의 안정성을 높이는데 도움이 되기를 기대해 봅니다.
#8퍼센트 #에잇퍼센트 #Django #Python #장고 #파이썬 #개발 #개발자 #가이드 #꿀팁 #인사이트
관련 스택